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..a97e3207a9 --- /dev/null +++ b/examples/oft-main/.gitignore @@ -0,0 +1,44 @@ +.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 +sui/**/oft_deploy.json +sui/**/token_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..66a9e7da55 --- /dev/null +++ b/examples/oft-main/README.md @@ -0,0 +1,256 @@ +

+ + + + + LayerZero + + +

+ +

OFT Multi-VM Example

+ +

+A complete example for deploying and wiring an Omnichain Fungible Token (OFT) across EVM, Solana, Sui, and Starknet. +

+ +## Quick Start + +```bash +# 1. Install dependencies +pnpm install + +# 2. Copy and configure environment +cp .env.example .env +# Edit .env with your keys and RPC URLs + +# 3. Deploy on each VM (see Deploy sections below) + +# 4. Wire all chains together +npx hardhat lz:oapp:wire --oapp-config layerzero.config.ts + +# 5. Send tokens cross-chain +npx hardhat lz:oft:send --src-eid --dst-eid --amount 1 --to
+``` + +## Supported VMs + +| VM | Endpoint ID (Mainnet) | Endpoint ID (Testnet) | Status | +|----|----------------------|----------------------|--------| +| Arbitrum | 30110 | 40231 | ✅ | +| Solana | 30168 | 40168 | ✅ | +| Sui | 30280 | 40245 | ✅ | +| Starknet | 30500 | 40253 | ✅ | + +## Environment Setup + +Create `.env` from the example and configure: + +```bash +cp .env.example .env +``` + +### Required Variables + +```bash +# EVM (Arbitrum) +PRIVATE_KEY=0x... # EVM deployer private key +RPC_URL_ARBITRUM=... # Arbitrum RPC URL + +# Solana (optional) +SOLANA_PRIVATE_KEY=... # Base58 or [1,2,3...] array format +RPC_URL_SOLANA=... # Solana RPC URL + +# Sui (optional) +SUI_PRIVATE_KEY=... # Base64 or hex format +RPC_URL_SUI=... # Sui RPC URL + +# Starknet (optional) +STARKNET_ACCOUNT_ADDRESS=0x... # Deployed account contract address +STARKNET_PRIVATE_KEY=0x... # Account private key +RPC_URL_STARKNET=... # Starknet RPC URL +``` + +## Deploy + +### EVM (Arbitrum) + +```bash +npx hardhat lz:deploy +# Select: arbitrum-mainnet (or arbitrum-sepolia for testnet) +# Select: MyOFT +``` + +### Solana + +```bash +# 1. Build the program +anchor build -v -e OFT_ID=$(anchor keys list | grep oft | awk '{print $2}') + +# 2. Deploy the program +solana program deploy --program-id target/deploy/oft-keypair.json target/verifiable/oft.so -u mainnet-beta + +# 3. Create OFT store +npx hardhat lz:oft:solana:create --eid 30168 --program-id --only-oft-store true --amount 100000000000 +``` + +### Sui + +```bash +# 1. Deploy token package +cd sui/token +sui client publish --gas-budget 500000000 --json > token_deploy.json + +# 2. Deploy OFT package +cd ../oft +sui client publish --gas-budget 1000000000 --json > oft_deploy.json + +# 3. Initialize OFT (see sui/README.md for full details) +# Creates sui/deploy.json with oftPackageId +``` + +### Starknet + +```bash +# Deploy ERC20 + OFT adapter (creates starknet/deploy.json) +node starknet/deploy-starknet-mainnet.js +``` + +## Configure + +Edit `layerzero.config.ts` to enable/disable VMs: + +```typescript +const INCLUDE_EVM = true +const INCLUDE_SOLANA = false // Set true after deploying +const INCLUDE_SUI = true +const INCLUDE_STARKNET = true +``` + +The config automatically: +- Loads deployment addresses from `./sui/deploy.json` and `./starknet/deploy.json` +- Generates full mesh pathways between all enabled VMs +- Sets appropriate enforced options for each destination chain + +## Wire + +Connect all deployed OFTs: + +```bash +npx hardhat lz:oapp:wire --oapp-config layerzero.config.ts +``` + +This sets: +- Peers (bidirectional address registration) +- Send/Receive libraries +- DVN and Executor configurations +- Enforced options (gas limits for each destination) + +## Send Tokens + +### EVM → Any + +```bash +# To Sui +npx hardhat lz:oft:send --src-eid 30110 --dst-eid 30280 --amount 1 --to + +# To Starknet +npx hardhat lz:oft:send --src-eid 30110 --dst-eid 30500 --amount 1 --to + +# To Solana +npx hardhat lz:oft:send --src-eid 30110 --dst-eid 30168 --amount 1 --to +``` + +### Sui → Any + +```bash +npx hardhat lz:oft:send \ + --src-eid 30280 \ + --dst-eid 30110 \ + --amount 1 \ + --to \ + --sui-oft-package-id \ + --sui-oft-object-id \ + --sui-oapp-object-id \ + --sui-token-type +``` + +### Starknet → Any + +```bash +npx hardhat lz:oft:send \ + --src-eid 30500 \ + --dst-eid 30110 \ + --amount 1 \ + --to \ + --oft-address +``` + +### Solana → Any + +```bash +npx hardhat lz:oft:send --src-eid 30168 --dst-eid 30110 --amount 1 --to +``` + +## Deployment Files + +| VM | Deployment File | Key Fields | +|----|-----------------|------------| +| EVM | `deployments//MyOFT.json` | Auto-loaded by hardhat-deploy | +| Solana | `deployments/solana-mainnet/OFT.json` | `oftStore` | +| Sui | `sui/deploy.json` | `oftPackageId` | +| Starknet | `starknet/deploy.json` | `oftAddress` | + +## Enforced Options + +Gas/compute limits for `lzReceive` on each destination: + +| Destination | Gas | Value | Notes | +|-------------|-----|-------|-------| +| EVM | 80,000 | 0 | Standard EVM gas | +| Solana | 200,000 | 2,039,280 | CU limit + rent for token account | +| Sui | 5,000 | 0 | Sui gas budget | +| Starknet | 500,000 | 0 | Cairo steps | + +## Troubleshooting + +### "Missing required deployment file" +Deploy on that VM first, or disable it in `layerzero.config.ts`. + +### "Cannot find module '@layerzerolabs/devtools-sui'" +```bash +pnpm install +pnpm build +``` + +### "Insufficient balance" on Starknet send +Ensure your Starknet account has: +1. Tokens to send (check ERC20 balance) +2. STRK for gas fees + +### "LZ_OAPP_CORE_NOT_ENOUGH_NATIVE_ALLOWANCE" on Starknet +The send task automatically approves STRK for fees. Ensure you have enough STRK in your account. + +### Wire task shows "0 transactions needed" +All pathways are already configured. Run with `--dry-run` to see current state. + +## Architecture + +``` +┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ +│ Arbitrum │────▶│ Solana │────▶│ Sui │────▶│ Starknet │ +│ (EVM) │◀────│ (SVM) │◀────│ (Move) │◀────│ (Cairo) │ +└─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ + │ │ │ │ + └──────────────────┴───────────────────┴───────────────────┘ + Full Mesh +``` + +Each OFT is connected to every other OFT via LayerZero, enabling direct transfers between any pair of chains. + +## Resources + +- [LayerZero Docs](https://docs.layerzero.network/) +- [OFT Standard](https://docs.layerzero.network/v2/concepts/applications/oft-standard) +- [Endpoint IDs](https://docs.layerzero.network/v2/deployments/deployed-contracts) +- [LayerZero Scan](https://layerzeroscan.com/) - Track cross-chain messages 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..f1a46f788e --- /dev/null +++ b/examples/oft-main/layerzero.config.ts @@ -0,0 +1,219 @@ +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' + +// ============================================================================= +// CONFIGURATION +// ============================================================================= +// Toggle which VMs to include in your deployment. +// Set to false if you haven't deployed on that VM yet. + +const INCLUDE_EVM = true +const INCLUDE_SOLANA = false // Set to true when you deploy Solana OFT +const INCLUDE_SUI = true +const INCLUDE_STARKNET = true + +// ============================================================================= +// ENFORCED OPTIONS +// ============================================================================= +// These define the gas/compute limits for lzReceive on each destination chain. +// The options array order in pathways is [TO_CHAIN_A_OPTIONS, TO_CHAIN_B_OPTIONS]. + +const EVM_ENFORCED_OPTIONS: OAppEnforcedOption[] = [ + { + msgType: 1, // SEND + optionType: ExecutorOptionType.LZ_RECEIVE, + gas: 80000, // EVM gas units for lzReceive + value: 0, + }, +] + +const SOLANA_ENFORCED_OPTIONS: OAppEnforcedOption[] = [ + { + msgType: 1, + optionType: ExecutorOptionType.LZ_RECEIVE, + gas: 200000, // Compute units for lzReceive on Solana + value: 2039280, // Lamports for SPL token account rent (required for new recipients) + }, +] + +const SUI_ENFORCED_OPTIONS: OAppEnforcedOption[] = [ + { + msgType: 1, + optionType: ExecutorOptionType.LZ_RECEIVE, + gas: 5000, // Sui gas budget for lzReceive + value: 0, + }, +] + +const STARKNET_ENFORCED_OPTIONS: OAppEnforcedOption[] = [ + { + msgType: 1, + optionType: ExecutorOptionType.LZ_RECEIVE, + gas: 500000, // Cairo steps for lzReceive on Starknet + value: 0, + }, +] + +// ============================================================================= +// DEPLOYMENT TYPES +// ============================================================================= + +type SolanaDeployment = { oftStore: string } +type SuiDeployment = { oftPackageId: string } +type StarknetDeployment = { oftAddress: string } + +// ============================================================================= +// HELPER FUNCTIONS +// ============================================================================= + +/** + * Safely load a JSON deployment file. Returns null if file doesn't exist. + */ +const loadJsonOptional = (relativePath: string): T | null => { + const fullPath = path.join(__dirname, relativePath) + if (!fs.existsSync(fullPath)) { + return null + } + return JSON.parse(fs.readFileSync(fullPath, 'utf8')) as T +} + +/** + * Get Solana OFT store address from deployment file. + */ +const getSolanaOftStore = (): string | null => { + // Check mainnet first, then testnet + const mainnet = loadJsonOptional('./deployments/solana-mainnet/OFT.json') + if (mainnet?.oftStore) return mainnet.oftStore + + const testnet = loadJsonOptional('./deployments/solana-testnet/OFT.json') + return testnet?.oftStore ?? null +} + +// ============================================================================= +// CONTRACT DEFINITIONS +// ============================================================================= + +// EVM Contract (loaded via hardhat-deploy, no address needed) +const arbitrumContract: OmniPointHardhat = { + eid: EndpointId.ARBITRUM_V2_MAINNET, + contractName: 'MyOFT', +} + +// Solana Contract +const solanaDeployment = getSolanaOftStore() +const solanaContract: OmniPointHardhat | null = + INCLUDE_SOLANA && solanaDeployment + ? { + eid: EndpointId.SOLANA_V2_MAINNET, + address: solanaDeployment, + } + : null + +// Sui Contract +const suiDeployment = loadJsonOptional('./sui/deploy.json') +const suiContract: OmniPointHardhat | null = + INCLUDE_SUI && suiDeployment?.oftPackageId + ? { + eid: EndpointId.SUI_V2_MAINNET, + address: suiDeployment.oftPackageId, + } + : null + +// Starknet Contract +const starknetDeployment = loadJsonOptional('./starknet/deploy.json') +const starknetContract: OmniPointHardhat | null = + INCLUDE_STARKNET && starknetDeployment?.oftAddress + ? { + eid: EndpointId.STARKNET_V2_MAINNET, + address: starknetDeployment.oftAddress, + } + : null + +// ============================================================================= +// PATHWAY GENERATION +// ============================================================================= + +/** + * Generate all pathways between enabled contracts. + * Pathways are bidirectional - declaring A↔B covers both directions. + * + * Pathway tuple format: + * [contractA, contractB, dvnConfig, confirmations, enforcedOptions] + * + * enforcedOptions order: [TO_B_OPTIONS, TO_A_OPTIONS] + * - First element: options when sending FROM A TO B + * - Second element: options when sending FROM B TO A + */ +type Pathway = readonly [ + OmniPointHardhat, + OmniPointHardhat, + readonly [readonly string[], readonly string[]], + readonly [number, number], + readonly [OAppEnforcedOption[], OAppEnforcedOption[]], +] + +const generatePathways = (): Pathway[] => { + const pathways: Pathway[] = [] + const contracts: Array<{ + contract: OmniPointHardhat + options: OAppEnforcedOption[] + dvns: readonly string[] + }> = [] + + // Add enabled contracts + if (INCLUDE_EVM) { + contracts.push({ contract: arbitrumContract, options: EVM_ENFORCED_OPTIONS, dvns: ['LayerZero Labs'] }) + } + if (solanaContract) { + contracts.push({ contract: solanaContract, options: SOLANA_ENFORCED_OPTIONS, dvns: ['LayerZero Labs'] }) + } + if (suiContract) { + contracts.push({ contract: suiContract, options: SUI_ENFORCED_OPTIONS, dvns: [] }) + } + if (starknetContract) { + contracts.push({ contract: starknetContract, options: STARKNET_ENFORCED_OPTIONS, dvns: [] }) + } + + // Generate full mesh pathways + for (let i = 0; i < contracts.length; i++) { + for (let j = i + 1; j < contracts.length; j++) { + const a = contracts[i]! + const b = contracts[j]! + pathways.push([ + a.contract, + b.contract, + [a.dvns, b.dvns] as const, + [15, 15] as const, // confirmations + [b.options, a.options] as const, // [TO_B, TO_A] + ]) + } + } + + return pathways +} + +// ============================================================================= +// EXPORT CONFIG +// ============================================================================= + +export default async function () { + const pathways = generatePathways() + const connections = await generateConnectionsConfig(pathways as any) + + // Build contracts array from enabled contracts + const contracts: Array<{ contract: OmniPointHardhat }> = [] + if (INCLUDE_EVM) contracts.push({ contract: arbitrumContract }) + if (solanaContract) contracts.push({ contract: solanaContract }) + if (suiContract) contracts.push({ contract: suiContract }) + if (starknetContract) contracts.push({ contract: starknetContract }) + + console.log(`LayerZero Config: ${contracts.length} contracts, ${pathways.length} pathways`) + console.log(` Contracts: ${contracts.map((c) => c.contract.eid).join(', ')}`) + + return { contracts, connections } +} diff --git a/examples/oft-main/package.json b/examples/oft-main/package.json new file mode 100644 index 0000000000..cd372f9f0e --- /dev/null +++ b/examples/oft-main/package.json @@ -0,0 +1,130 @@ +{ + "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": "~2.0.5", + "@layerzerolabs/devtools-evm": "~3.0.0", + "@layerzerolabs/devtools-evm-hardhat": "^4.0.0", + "@layerzerolabs/devtools-solana": "~3.0.6", + "@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": "~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-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", + "@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..eca25dd76b --- /dev/null +++ b/examples/oft-main/pnpm-lock.yaml @@ -0,0 +1,15122 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +overrides: + '@solana/web3.js': ^1.98.0 + ethers: ^5.7.2 + hardhat-deploy: ^0.12.1 + +importers: + + .: + devDependencies: + '@coral-xyz/anchor': + specifier: ^0.31.1 + version: 0.31.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@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(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@layerzerolabs/devtools': + specifier: ~2.0.5 + version: 2.0.5(@ethersproject/bytes@5.8.0)(@layerzerolabs/io-devtools@0.3.2(ink-gradient@2.0.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink-table@3.1.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76))(@layerzerolabs/lz-definitions@3.0.156)(zod@3.25.76) + '@layerzerolabs/devtools-evm': + specifier: ~3.0.0 + version: 3.0.2(ba1b8dd3c831373795921a05962d4f39) + '@layerzerolabs/devtools-evm-hardhat': + specifier: ^4.0.0 + version: 4.0.4(bd17817fbe618b486ab39186dfd61b3d) + '@layerzerolabs/devtools-solana': + specifier: ~3.0.6 + version: 3.0.6(7bcaf507b8ccf147de34f5c81d15d234) + '@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.2(ink-gradient@2.0.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink-table@3.1.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76) + '@layerzerolabs/lz-definitions': + specifier: ^3.0.86 + version: 3.0.156 + '@layerzerolabs/lz-evm-messagelib-v2': + specifier: ^3.0.86 + version: 3.0.156(@axelar-network/axelar-gmp-sdk-solidity@5.10.0)(@chainlink/contracts-ccip@0.7.6(bufferutil@4.1.0)(ethers@5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@eth-optimism/contracts@0.6.0(bufferutil@4.1.0)(ethers@5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@layerzerolabs/lz-evm-protocol-v2@3.0.156(@openzeppelin/contracts-upgradeable@5.4.0(@openzeppelin/contracts@5.4.0))(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4(bufferutil@4.1.0)(utf-8-validate@5.0.10))(solidity-bytes-utils@0.8.4))(@layerzerolabs/lz-evm-v1-0.7@3.0.156(@openzeppelin/contracts-upgradeable@5.4.0(@openzeppelin/contracts@5.4.0))(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(@openzeppelin/contracts-upgradeable@5.4.0(@openzeppelin/contracts@5.4.0))(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4(bufferutil@4.1.0)(utf-8-validate@5.0.10))(solidity-bytes-utils@0.8.4) + '@layerzerolabs/lz-evm-protocol-v2': + specifier: ^3.0.86 + version: 3.0.156(@openzeppelin/contracts-upgradeable@5.4.0(@openzeppelin/contracts@5.4.0))(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4(bufferutil@4.1.0)(utf-8-validate@5.0.10))(solidity-bytes-utils@0.8.4) + '@layerzerolabs/lz-evm-v1-0.7': + specifier: ^3.0.86 + version: 3.0.156(@openzeppelin/contracts-upgradeable@5.4.0(@openzeppelin/contracts@5.4.0))(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@layerzerolabs/lz-solana-sdk-v2': + specifier: ^3.0.136 + version: 3.0.156(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(got@12.6.1)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@layerzerolabs/lz-sui-oft-sdk-v2': + specifier: ^3.0.156 + version: 3.0.156(typescript@5.9.3) + '@layerzerolabs/lz-sui-sdk-v2': + specifier: ^3.0.156 + version: 3.0.156(typescript@5.9.3) + '@layerzerolabs/lz-v2-utilities': + specifier: ^3.0.86 + version: 3.0.156 + '@layerzerolabs/metadata-tools': + specifier: ~3.0.2 + version: 3.0.3(@layerzerolabs/devtools-evm-hardhat@4.0.4(bd17817fbe618b486ab39186dfd61b3d))(@layerzerolabs/ua-devtools@5.0.2(2fd617c273bebe4d9e9cb36131e29510)) + '@layerzerolabs/oapp-evm': + specifier: ^0.4.0 + version: 0.4.1(c1ec61c2fa4e9839f312831737d13b53) + '@layerzerolabs/oft-evm': + specifier: ^4.0.0 + version: 4.0.1(3c0dd36ef62aad2617a6f8e84fa2fc5d) + '@layerzerolabs/oft-mint-burn-starknet': + specifier: ^0.2.19 + version: 0.2.20(@layerzerolabs/protocol-starknet-v2@0.2.20) + '@layerzerolabs/oft-v2-solana-sdk': + specifier: ^3.0.136 + version: 3.0.156(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(got@12.6.1)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@layerzerolabs/prettier-config-next': + specifier: ^2.3.39 + version: 2.3.44 + '@layerzerolabs/protocol-devtools': + specifier: ^3.0.0 + version: 3.0.2(@layerzerolabs/devtools@2.0.5(@ethersproject/bytes@5.8.0)(@layerzerolabs/io-devtools@0.3.2(ink-gradient@2.0.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink-table@3.1.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76))(@layerzerolabs/lz-definitions@3.0.156)(zod@3.25.76))(@layerzerolabs/io-devtools@0.3.2(ink-gradient@2.0.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink-table@3.1.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76))(@layerzerolabs/lz-definitions@3.0.156)(zod@3.25.76) + '@layerzerolabs/protocol-devtools-evm': + specifier: ~5.0.0 + version: 5.0.2(33cc7f0bc733869899c8e881bf943c1c) + '@layerzerolabs/protocol-devtools-solana': + specifier: ^8.0.3 + version: 8.0.6(9a31ec2be9bb6e9e04112b31f8500670) + '@layerzerolabs/protocol-starknet-v2': + specifier: ^0.2.19 + version: 0.2.20 + '@layerzerolabs/solhint-config': + specifier: ^3.0.12 + version: 3.0.156(typescript@5.9.3) + '@layerzerolabs/test-devtools-evm-foundry': + specifier: ~8.0.0 + version: 8.0.1(128b5fb4e94e2e1bbbe3bdce7ddbf0b9) + '@layerzerolabs/test-devtools-evm-hardhat': + specifier: ~0.5.2 + version: 0.5.3(hardhat@2.28.3(bufferutil@4.1.0)(ts-node@10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.18))(@types/node@18.18.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(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.13(e174733816a20ea8b7a0ccb42b2ef14b) + '@layerzerolabs/ua-devtools': + specifier: ~5.0.0 + version: 5.0.2(2fd617c273bebe4d9e9cb36131e29510) + '@layerzerolabs/ua-devtools-evm': + specifier: ~7.0.0 + version: 7.0.1(92ebb0c070cf4b1b3ffeb57cc8992705) + '@layerzerolabs/ua-devtools-evm-hardhat': + specifier: ~9.0.0 + version: 9.0.2(72d215c29c4022f28081b04b7c4ee7d4) + '@layerzerolabs/ua-devtools-solana': + specifier: ~8.0.2 + version: 8.0.7(46edc29d709e8246275b097e2042fcad) + '@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(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@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(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@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(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@mysten/bcs': + specifier: ^1.9.2 + version: 1.9.2 + '@mysten/sui': + specifier: ^1.45.2 + version: 1.45.2(typescript@5.9.3) + '@nomicfoundation/hardhat-ethers': + specifier: ^3.0.5 + version: 3.1.3(ethers@5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(hardhat@2.28.3(bufferutil@4.1.0)(ts-node@10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.18))(@types/node@18.18.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@nomiclabs/hardhat-ethers': + specifier: ^2.2.3 + version: 2.2.3(ethers@5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(hardhat@2.28.3(bufferutil@4.1.0)(ts-node@10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.18))(@types/node@18.18.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@nomiclabs/hardhat-waffle': + specifier: ^2.0.6 + version: 2.0.6(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(hardhat@2.28.3(bufferutil@4.1.0)(ts-node@10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.18))(@types/node@18.18.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(@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(bufferutil@4.1.0)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(typescript@5.9.3))(ethers@5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(hardhat@2.28.3(bufferutil@4.1.0)(ts-node@10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.18))(@types/node@18.18.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@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.15.0 + '@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(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@solana/spl-token': + specifier: ^0.4.8 + version: 0.4.14(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@solana/web3.js': + specifier: ^1.98.0 + version: 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@sqds/sdk': + specifier: ^2.0.4 + version: 2.0.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@swc/core': + specifier: ^1.4.0 + version: 1.15.10(@swc/helpers@0.5.18) + '@swc/jest': + specifier: ^0.2.36 + version: 0.2.39(@swc/core@1.15.10(@swc/helpers@0.5.18)) + '@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(bufferutil@4.1.0)(utf-8-validate@5.0.10) + 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.28.3(bufferutil@4.1.0)(ts-node@10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.18))(@types/node@18.18.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) + hardhat-contract-sizer: + specifier: ^2.10.0 + version: 2.10.1(hardhat@2.28.3(bufferutil@4.1.0)(ts-node@10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.18))(@types/node@18.18.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + hardhat-deploy: + specifier: ^0.12.1 + version: 0.12.4(bufferutil@4.1.0)(utf-8-validate@5.0.10) + hardhat-deploy-ethers: + specifier: ^0.4.2 + version: 0.4.2(@nomicfoundation/hardhat-ethers@3.1.3(ethers@5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(hardhat@2.28.3(bufferutil@4.1.0)(ts-node@10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.18))(@types/node@18.18.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(hardhat-deploy@0.12.4(bufferutil@4.1.0)(utf-8-validate@5.0.10))(hardhat@2.28.3(bufferutil@4.1.0)(ts-node@10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.18))(@types/node@18.18.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + jest: + specifier: ^29.7.0 + version: 29.7.0(@types/node@18.18.14)(ts-node@10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.18))(@types/node@18.18.14)(typescript@5.9.3)) + mocha: + specifier: ^10.2.0 + version: 10.8.2 + prettier: + specifier: ^3.2.5 + version: 3.8.1 + solhint: + specifier: ^4.1.1 + version: 4.5.4(typescript@5.9.3) + solidity-bytes-utils: + specifier: ^0.8.2 + version: 0.8.4 + starknet: + specifier: ^8.9.0 + version: 8.9.2 + ts-node: + specifier: ^10.9.2 + version: 10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.18))(@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': + resolution: {integrity: sha512-/1iHy9TTr63gE1YcR5idjx8UREz1s0kFhydf3bBLCXyqjhkIc6igAzTOx3zPifCwFR87tsh/4Pa9cNts6d2otw==} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 + peerDependenciesMeta: + graphql: + optional: true + + '@0no-co/graphqlsp@1.15.2': + resolution: {integrity: sha512-Ys031WnS3sTQQBtRTkQsYnw372OlW72ais4sp0oh2UMPRNyxxnq85zRfU4PIdoy9kWriysPT5BYAkgIxhbonFA==} + peerDependencies: + graphql: ^15.5.0 || ^16.0.0 || ^17.0.0 + typescript: ^5.0.0 + + '@adraffy/ens-normalize@1.11.1': + resolution: {integrity: sha512-nhCBV3quEgesuf7c7KYfperqSS14T8bYuvJ8PcLJp6znkZpFc0AuW4qBtr8eKVyPPe/8RSr7sglCWPU5eaxwKQ==} + + '@aptos-labs/aptos-client@2.1.0': + resolution: {integrity: sha512-ttdY0qclRvbYAAwzijkFeipuqTfLFJnoXlNIm58tIw3DKhIlfYdR6iLqTeCpI23oOPghnO99FZecej/0MTrtuA==} + engines: {node: '>=20.0.0'} + peerDependencies: + got: ^11.8.6 + + '@axelar-network/axelar-gmp-sdk-solidity@5.10.0': + resolution: {integrity: sha512-s8SImALvYB+5AeiT3tbfWNBI2Mhqw1x91i/zM3DNpVUCnAR2HKtsB9T84KnUn/OJjOVgb4h0lv7q9smeYniRPw==} + engines: {node: '>=18'} + + '@babel/code-frame@7.28.6': + resolution: {integrity: sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.28.6': + resolution: {integrity: sha512-2lfu57JtzctfIrcGMz992hyLlByuzgIk58+hhGCxjKZ3rWI82NnVLjXcaTqkI2NvlcvOskZaiZ5kjUALo3Lpxg==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.28.6': + resolution: {integrity: sha512-H3mcG6ZDLTlYfaSNi0iOKkigqMFvkTKlGUYlD8GW7nNOYRrevuA46iTypPyv+06V3fEmvvazfntkBU34L0azAw==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.28.6': + resolution: {integrity: sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.28.6': + resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-globals@7.28.0': + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.28.6': + resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.28.6': + resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-plugin-utils@7.28.6': + resolution: {integrity: sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.28.6': + resolution: {integrity: sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.28.6': + resolution: {integrity: sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-syntax-async-generators@7.8.4': + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-bigint@7.8.3': + resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-class-properties@7.12.13': + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-class-static-block@7.14.5': + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-attributes@7.28.6': + resolution: {integrity: sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-meta@7.10.4': + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-json-strings@7.8.3': + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-jsx@7.28.6': + resolution: {integrity: sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-logical-assignment-operators@7.10.4': + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3': + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-numeric-separator@7.10.4': + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-object-rest-spread@7.8.3': + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-optional-catch-binding@7.8.3': + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-optional-chaining@7.8.3': + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-private-property-in-object@7.14.5': + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-top-level-await@7.14.5': + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-typescript@7.28.6': + resolution: {integrity: sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/runtime@7.28.6': + resolution: {integrity: sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.28.6': + resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.28.6': + resolution: {integrity: sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.28.6': + resolution: {integrity: sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==} + engines: {node: '>=6.9.0'} + + '@bcoe/v8-coverage@0.2.3': + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + + '@bitcoinerlab/secp256k1@1.2.0': + resolution: {integrity: sha512-jeujZSzb3JOZfmJYI0ph1PVpCRV5oaexCgy+RvCXV8XlY+XFB/2n3WOcvBsKLsOw78KYgnQrQWb2HrKE4be88Q==} + + '@chainlink/contracts-ccip@0.7.6': + resolution: {integrity: sha512-yNbCBFpLs3R+ALymto9dQYKz3vatnjqYGu1pnMD0i2fHEMthiXe0+otaNCGNht6n8k7ruNaA0DNpz3F+2jHQXw==} + + '@colors/colors@1.5.0': + resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} + engines: {node: '>=0.1.90'} + + '@colors/colors@1.6.0': + resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==} + engines: {node: '>=0.1.90'} + + '@coral-xyz/anchor-errors@0.30.1': + resolution: {integrity: sha512-9Mkradf5yS5xiLWrl9WrpjqOrAV+/W2RQHDlbnAZBivoGpOs1ECjoDCkVk4aRG8ZdiFiB8zQEVlxf+8fKkmSfQ==} + engines: {node: '>=10'} + + '@coral-xyz/anchor-errors@0.31.1': + resolution: {integrity: sha512-NhNEku4F3zzUSBtrYz84FzYWm48+9OvmT1Hhnwr6GnPQry2dsEqH/ti/7ASjjpoFTWRnPXrjAIT1qM6Isop+LQ==} + engines: {node: '>=10'} + + '@coral-xyz/anchor@0.26.0': + resolution: {integrity: sha512-PxRl+wu5YyptWiR9F2MBHOLLibm87Z4IMUBPreX+DYBtPM+xggvcPi0KAN7+kIL4IrIhXI8ma5V0MCXxSN1pHg==} + engines: {node: '>=11'} + + '@coral-xyz/anchor@0.29.0': + resolution: {integrity: sha512-eny6QNG0WOwqV0zQ7cs/b1tIuzZGmP7U7EcH+ogt4Gdbl8HDmIYVMh/9aTmYZPaFWjtUaI8qSn73uYEXWfATdA==} + engines: {node: '>=11'} + + '@coral-xyz/anchor@0.30.1': + resolution: {integrity: sha512-gDXFoF5oHgpriXAaLpxyWBHdCs8Awgf/gLHIo6crv7Aqm937CNdY+x+6hoj7QR5vaJV7MxWSQ0NGFzL3kPbWEQ==} + engines: {node: '>=11'} + + '@coral-xyz/anchor@0.31.1': + resolution: {integrity: sha512-QUqpoEK+gi2S6nlYc2atgT2r41TT3caWr/cPUEL8n8Md9437trZ68STknq897b82p5mW0XrTBNOzRbmIRJtfsA==} + engines: {node: '>=17'} + + '@coral-xyz/borsh@0.26.0': + resolution: {integrity: sha512-uCZ0xus0CszQPHYfWAqKS5swS1UxvePu83oOF+TWpUkedsNlg6p2p4azxZNSSqwXb9uXMFgxhuMBX9r3Xoi0vQ==} + engines: {node: '>=10'} + peerDependencies: + '@solana/web3.js': ^1.98.0 + + '@coral-xyz/borsh@0.29.0': + resolution: {integrity: sha512-s7VFVa3a0oqpkuRloWVPdCK7hMbAMY270geZOGfCnaqexrP5dTIpbEHL33req6IYPPJ0hYa71cdvJ1h6V55/oQ==} + engines: {node: '>=10'} + peerDependencies: + '@solana/web3.js': ^1.98.0 + + '@coral-xyz/borsh@0.30.1': + resolution: {integrity: sha512-aaxswpPrCFKl8vZTbxLssA2RvwX2zmKLlRCIktJOwW+VpVwYtXRtlWiIP+c2pPRKneiTiWCN2GEMSH9j1zTlWQ==} + engines: {node: '>=10'} + peerDependencies: + '@solana/web3.js': ^1.98.0 + + '@coral-xyz/borsh@0.31.1': + resolution: {integrity: sha512-9N8AU9F0ubriKfNE3g1WF0/4dtlGXoBN/hd1PvbNBamBNwRgHxH4P+o3Zt7rSEloW1HUs6LfZEchlx9fW7POYw==} + engines: {node: '>=10'} + peerDependencies: + '@solana/web3.js': ^1.98.0 + + '@cspotcode/source-map-support@0.8.1': + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + + '@dabh/diagnostics@2.0.8': + resolution: {integrity: sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==} + + '@emnapi/core@1.8.1': + resolution: {integrity: sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==} + + '@emnapi/runtime@1.8.1': + resolution: {integrity: sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==} + + '@emnapi/wasi-threads@1.1.0': + resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} + + '@ensdomains/ens@0.4.5': + resolution: {integrity: sha512-JSvpj1iNMFjK6K+uVl4unqMoa9rf5jopb8cya5UGBWz23Nw8hSNT7efgUx4BTlAPAgpNlEioUfeTyQ6J9ZvTVw==} + deprecated: Please use @ensdomains/ens-contracts + + '@ensdomains/resolver@0.2.4': + resolution: {integrity: sha512-bvaTH34PMCbv6anRa9I/0zjLJgY4EuznbEMgbV77JBCQ9KNC46rzi0avuxpOfu+xDjPEtSFGqVEOr5GlUSGudA==} + deprecated: Please use @ensdomains/ens-contracts + + '@eslint-community/eslint-utils@4.9.1': + resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@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} + + '@eslint/eslintrc@2.1.4': + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@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} + + '@eth-optimism/contracts@0.5.40': + resolution: {integrity: sha512-MrzV0nvsymfO/fursTB7m/KunkPsCndltVgfdHaT1Aj5Vi6R/doKIGGkOofHX+8B6VMZpuZosKCMQ5lQuqjt8w==} + peerDependencies: + ethers: ^5.7.2 + + '@eth-optimism/contracts@0.6.0': + resolution: {integrity: sha512-vQ04wfG9kMf1Fwy3FEMqH2QZbgS0gldKhcBeBUPfO8zu68L61VI97UDXmsMQXzTsEAxK8HnokW3/gosl4/NW3w==} + peerDependencies: + ethers: ^5.7.2 + + '@eth-optimism/core-utils@0.12.0': + resolution: {integrity: sha512-qW+7LZYCz7i8dRa7SRlUKIo1VBU8lvN0HeXCxJR+z+xtMzMQpPds20XJNCMclszxYQHkXY00fOT6GvFw9ZL6nw==} + + '@ethereum-waffle/chai@4.0.10': + resolution: {integrity: sha512-X5RepE7Dn8KQLFO7HHAAe+KeGaX/by14hn90wePGBhzL54tq4Y8JscZFu+/LCwCl6TnkAAy5ebiMoqJ37sFtWw==} + engines: {node: '>=10.0'} + peerDependencies: + ethers: ^5.7.2 + + '@ethereum-waffle/compiler@4.0.3': + resolution: {integrity: sha512-5x5U52tSvEVJS6dpCeXXKvRKyf8GICDwiTwUvGD3/WD+DpvgvaoHOL82XqpTSUHgV3bBq6ma5/8gKUJUIAnJCw==} + engines: {node: '>=10.0'} + peerDependencies: + ethers: ^5.7.2 + solc: '*' + typechain: ^8.0.0 + + '@ethereum-waffle/ens@4.0.3': + 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 + + '@ethereum-waffle/mock-contract@4.0.4': + resolution: {integrity: sha512-LwEj5SIuEe9/gnrXgtqIkWbk2g15imM/qcJcxpLyAkOj981tQxXmtV4XmQMZsdedEsZ/D/rbUAOtZbgwqgUwQA==} + engines: {node: '>=10.0'} + peerDependencies: + ethers: ^5.7.2 + + '@ethereum-waffle/provider@4.0.5': + resolution: {integrity: sha512-40uzfyzcrPh+Gbdzv89JJTMBlZwzya1YLDyim8mVbEqYLP5VRYWoGp0JMyaizgV3hMoUFRqJKVmIUw4v7r3hYw==} + engines: {node: '>=10.0'} + peerDependencies: + ethers: ^5.7.2 + + '@ethereumjs/block@3.6.3': + resolution: {integrity: sha512-CegDeryc2DVKnDkg5COQrE0bJfw/p0v3GBk2W5/Dj5dOVfEmb50Ux0GLnSPypooLnfqjwFaorGuT9FokWB3GRg==} + + '@ethereumjs/blockchain@5.5.3': + resolution: {integrity: sha512-bi0wuNJ1gw4ByNCV56H0Z4Q7D+SxUbwyG12Wxzbvqc89PXLRNR20LBcSUZRKpN0+YCPo6m0XZL/JLio3B52LTw==} + + '@ethereumjs/common@2.6.0': + resolution: {integrity: sha512-Cq2qS0FTu6O2VU1sgg+WyU9Ps0M6j/BEMHN+hRaECXCV/r0aI78u4N6p52QW/BDVhwWZpCdrvG8X7NJdzlpNUA==} + + '@ethereumjs/common@2.6.5': + resolution: {integrity: sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA==} + + '@ethereumjs/ethash@1.1.0': + resolution: {integrity: sha512-/U7UOKW6BzpA+Vt+kISAoeDie1vAvY4Zy2KF5JJb+So7+1yKmJeJEHOGSnQIj330e9Zyl3L5Nae6VZyh2TJnAA==} + + '@ethereumjs/rlp@4.0.1': + resolution: {integrity: sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==} + engines: {node: '>=14'} + hasBin: true + + '@ethereumjs/rlp@5.0.2': + resolution: {integrity: sha512-DziebCdg4JpGlEqEdGgXmjqcFoJi+JGulUXwEjsZGAscAQ7MyD/7LE/GVCP29vEQxKc7AAwjT3A2ywHp2xfoCA==} + engines: {node: '>=18'} + hasBin: true + + '@ethereumjs/tx@3.4.0': + resolution: {integrity: sha512-WWUwg1PdjHKZZxPPo274ZuPsJCWV3SqATrEKQP1n2DrVYVP1aZIYpo/mFaA0BDoE0tIQmBeimRCEA0Lgil+yYw==} + + '@ethereumjs/tx@3.5.2': + resolution: {integrity: sha512-gQDNJWKrSDGu2w7w0PzVXVBNMzb7wwdDOmOqczmhNjqFxFuIbhVJDwiGEnxFNC2/b8ifcZzY7MLcluizohRzNw==} + + '@ethereumjs/util@8.1.0': + resolution: {integrity: sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==} + engines: {node: '>=14'} + + '@ethereumjs/util@9.1.0': + resolution: {integrity: sha512-XBEKsYqLGXLah9PNJbgdkigthkG7TAGvlD/sH12beMXEyHDyigfcbdvHhmLyDWgDyOJn4QwiQUaF7yeuhnjdog==} + engines: {node: '>=18'} + + '@ethereumjs/vm@5.6.0': + resolution: {integrity: sha512-J2m/OgjjiGdWF2P9bj/4LnZQ1zRoZhY8mRNVw/N3tXliGI8ai1sI1mlDPkLpeUUM4vq54gH6n0ZlSpz8U/qlYQ==} + + '@ethersproject/abi@5.8.0': + resolution: {integrity: sha512-b9YS/43ObplgyV6SlyQsG53/vkSal0MNA1fskSC4mbnCMi8R+NkcH8K9FPYNESf6jUefBUniE4SOKms0E/KK1Q==} + + '@ethersproject/abstract-provider@5.8.0': + resolution: {integrity: sha512-wC9SFcmh4UK0oKuLJQItoQdzS/qZ51EJegK6EmAWlh+OptpQ/npECOR3QqECd8iGHC0RJb4WKbVdSfif4ammrg==} + + '@ethersproject/abstract-signer@5.8.0': + resolution: {integrity: sha512-N0XhZTswXcmIZQdYtUnd79VJzvEwXQw6PK0dTl9VoYrEBxxCPXqS0Eod7q5TNKRxe1/5WUMuR0u0nqTF/avdCA==} + + '@ethersproject/address@5.7.0': + resolution: {integrity: sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==} + + '@ethersproject/address@5.8.0': + resolution: {integrity: sha512-GhH/abcC46LJwshoN+uBNoKVFPxUuZm6dA257z0vZkKmU1+t8xTn8oK7B9qrj8W2rFRMch4gbJl6PmVxjxBEBA==} + + '@ethersproject/base64@5.8.0': + resolution: {integrity: sha512-lN0oIwfkYj9LbPx4xEkie6rAMJtySbpOAFXSDVQaBnAzYfB4X2Qr+FXJGxMoc3Bxp2Sm8OwvzMrywxyw0gLjIQ==} + + '@ethersproject/basex@5.8.0': + resolution: {integrity: sha512-PIgTszMlDRmNwW9nhS6iqtVfdTAKosA7llYXNmGPw4YAI1PUyMv28988wAb41/gHF/WqGdoLv0erHaRcHRKW2Q==} + + '@ethersproject/bignumber@5.8.0': + resolution: {integrity: sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA==} + + '@ethersproject/bytes@5.8.0': + resolution: {integrity: sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A==} + + '@ethersproject/constants@5.8.0': + resolution: {integrity: sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg==} + + '@ethersproject/contracts@5.8.0': + resolution: {integrity: sha512-0eFjGz9GtuAi6MZwhb4uvUM216F38xiuR0yYCjKJpNfSEy4HUM8hvqqBj9Jmm0IUz8l0xKEhWwLIhPgxNY0yvQ==} + + '@ethersproject/hash@5.8.0': + resolution: {integrity: sha512-ac/lBcTbEWW/VGJij0CNSw/wPcw9bSRgCB0AIBz8CvED/jfvDoV9hsIIiWfvWmFEi8RcXtlNwp2jv6ozWOsooA==} + + '@ethersproject/hdnode@5.8.0': + resolution: {integrity: sha512-4bK1VF6E83/3/Im0ERnnUeWOY3P1BZml4ZD3wcH8Ys0/d1h1xaFt6Zc+Dh9zXf9TapGro0T4wvO71UTCp3/uoA==} + + '@ethersproject/json-wallets@5.8.0': + resolution: {integrity: sha512-HxblNck8FVUtNxS3VTEYJAcwiKYsBIF77W15HufqlBF9gGfhmYOJtYZp8fSDZtn9y5EaXTE87zDwzxRoTFk11w==} + + '@ethersproject/keccak256@5.8.0': + resolution: {integrity: sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng==} + + '@ethersproject/logger@5.8.0': + resolution: {integrity: sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA==} + + '@ethersproject/networks@5.8.0': + resolution: {integrity: sha512-egPJh3aPVAzbHwq8DD7Po53J4OUSsA1MjQp8Vf/OZPav5rlmWUaFLiq8cvQiGK0Z5K6LYzm29+VA/p4RL1FzNg==} + + '@ethersproject/pbkdf2@5.8.0': + resolution: {integrity: sha512-wuHiv97BrzCmfEaPbUFpMjlVg/IDkZThp9Ri88BpjRleg4iePJaj2SW8AIyE8cXn5V1tuAaMj6lzvsGJkGWskg==} + + '@ethersproject/properties@5.8.0': + resolution: {integrity: sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw==} + + '@ethersproject/providers@5.8.0': + resolution: {integrity: sha512-3Il3oTzEx3o6kzcg9ZzbE+oCZYyY+3Zh83sKkn4s1DZfTUjIegHnN2Cm0kbn9YFy45FDVcuCLLONhU7ny0SsCw==} + + '@ethersproject/random@5.8.0': + resolution: {integrity: sha512-E4I5TDl7SVqyg4/kkA/qTfuLWAQGXmSOgYyO01So8hLfwgKvYK5snIlzxJMk72IFdG/7oh8yuSqY2KX7MMwg+A==} + + '@ethersproject/rlp@5.8.0': + resolution: {integrity: sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q==} + + '@ethersproject/sha2@5.8.0': + resolution: {integrity: sha512-dDOUrXr9wF/YFltgTBYS0tKslPEKr6AekjqDW2dbn1L1xmjGR+9GiKu4ajxovnrDbwxAKdHjW8jNcwfz8PAz4A==} + + '@ethersproject/signing-key@5.8.0': + resolution: {integrity: sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w==} + + '@ethersproject/solidity@5.8.0': + resolution: {integrity: sha512-4CxFeCgmIWamOHwYN9d+QWGxye9qQLilpgTU0XhYs1OahkclF+ewO+3V1U0mvpiuQxm5EHHmv8f7ClVII8EHsA==} + + '@ethersproject/strings@5.8.0': + resolution: {integrity: sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg==} + + '@ethersproject/transactions@5.8.0': + resolution: {integrity: sha512-UglxSDjByHG0TuU17bDfCemZ3AnKO2vYrL5/2n2oXvKzvb7Cz+W9gOWXKARjp2URVwcWlQlPOEQyAviKwT4AHg==} + + '@ethersproject/units@5.8.0': + resolution: {integrity: sha512-lxq0CAnc5kMGIiWW4Mr041VT8IhNM+Pn5T3haO74XZWFulk7wH1Gv64HqE96hT4a7iiNMdOCFEBgaxWuk8ETKQ==} + + '@ethersproject/wallet@5.8.0': + resolution: {integrity: sha512-G+jnzmgg6UxurVKRKvw27h0kvG75YKXZKdlLYmAHeF32TGUzHkOFd7Zn6QHOTYRFWnfjtSSFjBowKo7vfrXzPA==} + + '@ethersproject/web@5.8.0': + resolution: {integrity: sha512-j7+Ksi/9KfGviws6Qtf9Q7KCqRhpwrYKQPs+JBA/rKVFF/yaWLHJEH3zfVP2plVu+eys0d2DlFmhoQJayFewcw==} + + '@ethersproject/wordlists@5.8.0': + resolution: {integrity: sha512-2df9bbXicZws2Sb5S6ET493uJ0Z84Fjr3pC4tu/qlnZERibZCeUVuqdtt+7Tv9xxhUxHoIekIA7avrKUWHrezg==} + + '@fastify/busboy@2.1.1': + resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} + engines: {node: '>=14'} + + '@ganache/ethereum-address@0.1.4': + resolution: {integrity: sha512-sTkU0M9z2nZUzDeHRzzGlW724xhMLXo2LeX1hixbnjHWY1Zg1hkqORywVfl+g5uOO8ht8T0v+34IxNxAhmWlbw==} + + '@ganache/ethereum-options@0.1.4': + resolution: {integrity: sha512-i4l46taoK2yC41FPkcoDlEVoqHS52wcbHPqJtYETRWqpOaoj9hAg/EJIHLb1t6Nhva2CdTO84bG+qlzlTxjAHw==} + + '@ganache/ethereum-utils@0.1.4': + resolution: {integrity: sha512-FKXF3zcdDrIoCqovJmHLKZLrJ43234Em2sde/3urUT/10gSgnwlpFmrv2LUMAmSbX3lgZhW/aSs8krGhDevDAg==} + + '@ganache/options@0.1.4': + resolution: {integrity: sha512-zAe/craqNuPz512XQY33MOAG6Si1Xp0hCvfzkBfj2qkuPcbJCq6W/eQ5MB6SbXHrICsHrZOaelyqjuhSEmjXRw==} + + '@ganache/rlp@0.1.4': + resolution: {integrity: sha512-Do3D1H6JmhikB+6rHviGqkrNywou/liVeFiKIpOBLynIpvZhRCgn3SEDxyy/JovcaozTo/BynHumfs5R085MFQ==} + + '@ganache/utils@0.1.4': + resolution: {integrity: sha512-oatUueU3XuXbUbUlkyxeLLH3LzFZ4y5aSkNbx6tjSIhVTPeh+AuBKYt4eQ73FFcTB3nj/gZoslgAh5CN7O369w==} + + '@gql.tada/cli-utils@1.7.2': + resolution: {integrity: sha512-Qbc7hbLvCz6IliIJpJuKJa9p05b2Jona7ov7+qofCsMRxHRZE1kpAmZMvL8JCI4c0IagpIlWNaMizXEQUe8XjQ==} + 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 + + '@gql.tada/internal@1.0.8': + resolution: {integrity: sha512-XYdxJhtHC5WtZfdDqtKjcQ4d7R1s0d1rnlSs3OcBEUbYiPoJJfZU7tWsVXuv047Z6msvmr4ompJ7eLSK5Km57g==} + peerDependencies: + graphql: ^15.5.0 || ^16.0.0 || ^17.0.0 + typescript: ^5.0.0 + + '@graphql-typed-document-node/core@3.2.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 + + '@humanwhocodes/config-array@0.13.0': + resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} + engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/object-schema@2.0.3': + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + deprecated: Use @eslint/object-schema instead + + '@improbable-eng/grpc-web@0.15.0': + resolution: {integrity: sha512-ERft9/0/8CmYalqOVnJnpdDry28q+j+nAlFFARdjyxXDJ+Mhgv9+F600QC8BR9ygOfrXRlAk6CvST2j+JCpQPg==} + peerDependencies: + google-protobuf: ^3.14.0 + + '@initia/initia.js@1.0.4': + resolution: {integrity: sha512-oFfj8heWUFxK/OFAAa8A9NzcBB3M7r6hG1lMLHwGbMLPRbhK4iVY/V1FxcBjspKAuLNsdsb/k+Oc/JUl0iyixQ==} + engines: {node: '>=20'} + + '@initia/initia.proto@0.2.6': + resolution: {integrity: sha512-khiCPUxZTkyAl+SQbQCOlcJId/a0ToUhG+ChrVXN9a+1ypPz5355j2UP2IvnUf+lAix/+zzdekcqO/Lig7htAQ==} + + '@initia/opinit.proto@0.0.11': + resolution: {integrity: sha512-Op9GIlXiV1xhUIjVQ2TFE9a3X8iyFVNtJNHCM34gwLQHJktDNm2KCoW4eHh6pkn4//ECRVH7zuKgV8TdZWogCw==} + + '@iota/bcs@1.4.0': + resolution: {integrity: sha512-Bpg8uPB3UTweJyFS3G+aycGcTCxaJQi2a9bEy2QXWMBM8a/tLN1KCg4IzKWkAJ4FyMNrZZrdXiBqAzmNK6xdVQ==} + + '@iota/iota-sdk@1.10.1': + resolution: {integrity: sha512-q0GxOCFzPqIcaw1lFuFljmMDj1ajIK6UZFzOYnnPqfs/nufOZrJQ9Bg/hLj23xbMno/tdND+aIjDWY6GG8MAXw==} + engines: {node: '>=20'} + + '@istanbuljs/load-nyc-config@1.1.0': + resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} + engines: {node: '>=8'} + + '@istanbuljs/schema@0.1.3': + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + + '@jest/console@29.7.0': + resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/core@29.7.0': + 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 + + '@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} + + '@jest/environment@29.7.0': + resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/expect-utils@29.7.0': + resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/expect@29.7.0': + resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@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} + + '@jest/globals@29.7.0': + resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@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} + + '@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 + + '@jest/schemas@29.6.3': + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@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} + + '@jest/source-map@29.6.3': + resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/test-result@29.7.0': + resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/test-sequencer@29.7.0': + resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/transform@29.7.0': + resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/types@29.6.3': + resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@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} + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@jridgewell/trace-mapping@0.3.9': + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + + '@layerzerolabs/devtools-evm-hardhat@4.0.4': + resolution: {integrity: sha512-EnP2dWk9G2PdDP2R30O0Bs85J+4nvBmGlT86QhvhhUqbg2NCZ51h/TQLBWPX6mri7wVMbGMZesNo68xnMntoyQ==} + 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.4 + '@layerzerolabs/devtools-evm': ~3.0.2 + '@layerzerolabs/io-devtools': ~0.3.2 + '@layerzerolabs/lz-definitions': ^3.0.148 + '@nomiclabs/hardhat-ethers': ^2.2.3 + fp-ts: ^2.16.2 + hardhat: ^2.22.10 + hardhat-deploy: ^0.12.1 + + '@layerzerolabs/devtools-evm@3.0.2': + resolution: {integrity: sha512-3GukwiJQ1HYI5MwFQUVH7cK0z1AqKjnAyO/e8McUE9TFNjcwvRinFklrFlAy1euy6DTy1vf6BwNA49mK3N6EkA==} + 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.4 + '@layerzerolabs/io-devtools': ~0.3.2 + '@layerzerolabs/lz-definitions': ^3.0.148 + fp-ts: ^2.16.2 + zod: ^3.22.4 + + '@layerzerolabs/devtools-solana@3.0.6': + resolution: {integrity: sha512-QOcEIkof5BfAsRM3HiBlqieELA7rbQg5K+wDQJp6uk0OBkJtxWMBNDBYh58fwVMxILjKT1gKf49ElZYI7Sty8A==} + peerDependencies: + '@layerzerolabs/devtools': ~2.0.4 + '@layerzerolabs/io-devtools': ~0.3.2 + '@layerzerolabs/lz-definitions': ^3.0.148 + '@solana/web3.js': ^1.98.0 + bn.js: ^5.2.0 + fp-ts: ^2.16.2 + zod: ^3.22.4 + + '@layerzerolabs/devtools@2.0.5': + resolution: {integrity: sha512-NwujsVyduYnY5R5qNA4xnA8Dwxs88oX0Kk/GpotkTII+F6z6PnGqHjiBzo/42plAxOmktGYo21BigxSXjCnEaw==} + peerDependencies: + '@ethersproject/bytes': ~5.7.0 + '@layerzerolabs/io-devtools': ~0.3.2 + '@layerzerolabs/lz-definitions': ^3.0.148 + zod: ^3.22.4 + + '@layerzerolabs/eslint-config-next@2.3.44': + resolution: {integrity: sha512-WlBSy47LGPILdrNgzPiRtQf/hAY62IN37ncUsQwcr8T7cyX1HZREx2qljuXpvduLDAKn5otsm0XIqHuCRUHEFg==} + + '@layerzerolabs/evm-sdks-core@3.0.156': + resolution: {integrity: sha512-9JwG5+MhGZqDQHOcQBZuGV2X4R+55NoMhwIVlUXCeTKu+JJHBcY2WWRa5EZ1Mx5KM0PsipF0eZ2/ixNfPIy67A==} + + '@layerzerolabs/export-deployments@0.0.16': + resolution: {integrity: sha512-tI+mKMx51qCrj+G42mrVR+5jAiRaiLCpnXiogjW7E3krbNbJenI1eYYX7U62ssXWXwTZfYSJ1Bw/zLAbs59sqw==} + hasBin: true + + '@layerzerolabs/io-devtools@0.3.2': + resolution: {integrity: sha512-BQzf1enHz2Inflycr52s6C+sjh8d90OpjLgO9EL9aKGfc1TYa786H+21MZBY5djX/nghkp69C/KwsWzhHIc65g==} + 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 + + '@layerzerolabs/lz-core@3.0.156': + resolution: {integrity: sha512-zGGJXQlJvjLw9hKPmFgUKYQv35Td+X/EHZHti3LXmFk52/3J6huWhlxmEhbTaa2bIISQfkGJJdn2eWsW5iYb9A==} + + '@layerzerolabs/lz-corekit-solana@3.0.156': + resolution: {integrity: sha512-E7l143s/PKVzV9lhy5LtirXsOgrSF8kVXXg4RMIv8K88qye8g4GU7gQjAt8tSZD6Xl1b4Yc1HmBzyktEYdgp0A==} + + '@layerzerolabs/lz-definitions@3.0.156': + resolution: {integrity: sha512-9gXF+C3LJ3mwrrkVBvVwXaeRnZNFNFeEuA0ykp881IRMFmmcVKLYOkidFgmaItm70MishMrrt4Lo+wWuzkqqUg==} + + '@layerzerolabs/lz-evm-messagelib-v2@3.0.156': + resolution: {integrity: sha512-x7L09V8mnhipxOMQBidBECEMb9qKkwM9oT3hCDMXsxP2FsTGTLA2HpgdJlYqDFgJomhv5XCOLFeYXejOteOLtw==} + 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.156 + '@layerzerolabs/lz-evm-v1-0.7': ^3.0.156 + '@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 + + '@layerzerolabs/lz-evm-protocol-v2@3.0.156': + resolution: {integrity: sha512-KLh26P8J76Lty8STndABDIMcZqeOrc8vqAIYumvipsQASCDntm7f81VYzQM8G+LV7JY5LOlEcWvc2jEexexVqA==} + 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 + + '@layerzerolabs/lz-evm-sdk-v1@3.0.156': + resolution: {integrity: sha512-1xPRlKqOsCmMa+1JHsuUtxLHKBKN+ZEHh1ZI//A2W5Dx2rb6cjVAiuQSNi61Vc0UUu5T3cY8+zARXgkRPApjNg==} + + '@layerzerolabs/lz-evm-sdk-v2@3.0.156': + resolution: {integrity: sha512-0pYcjo4qCm5PnGvIes+bBwYh+SDHQbt4YlrpJ5wAMDjZdwbJgBPhhdwucIj86ACG9BZef0EcvRgfnLGnguwOrA==} + + '@layerzerolabs/lz-evm-v1-0.7@3.0.156': + resolution: {integrity: sha512-y7FG7qQwl/v0FTn2HUZIpmkNew16lmRcCSQA31UnNsimwaqSxKvyWrncCrsO8gLlkuLoFDHWtFIlG2rbX+isJw==} + 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 + + '@layerzerolabs/lz-foundation@3.0.156': + resolution: {integrity: sha512-hZHAGFe5apNVUv8jJg7GJQw/KePR2pGj0uNe9aydJH0C0mvfi7pwhkteJoF1JbZ0iNHYCunAak0W8nRBeRg2mA==} + + '@layerzerolabs/lz-serdes@3.0.156': + resolution: {integrity: sha512-9QCw5a8kAgDfhm5lZOHtkiWGYeheUIw98fZf0n/HKrCI5vOL8LVH5u4ks2OTD5sFVt/qkfiMcntqCV3SRMw9gQ==} + + '@layerzerolabs/lz-solana-sdk-v2@3.0.156': + resolution: {integrity: sha512-5bWB5Kxk1VRiLprBsJMcORMDcDtOl+j5wdFvqs41ikt08ymGruYkACCfTzt0lacg490FXDUnAReODuvbduBqng==} + + '@layerzerolabs/lz-sui-oft-sdk-v2@3.0.156': + resolution: {integrity: sha512-zOvWGOD9HT1WdnY2nvVaG5Zw4Cqx3XeSQqxJBobt6TP1rLVlFN226BE8LVxEws8IdoomLD2Yz3BkR0BJS7l8bw==} + + '@layerzerolabs/lz-sui-sdk-v2@3.0.156': + resolution: {integrity: sha512-pQIl91brRk274hSiNS2NqUZ9U+l8zqPzeJ/1kOKPXZdiQIaz+/H2nwb0UXayxyAwXy3kl94ju/ecdOiKvHqAag==} + + '@layerzerolabs/lz-utilities@3.0.156': + resolution: {integrity: sha512-2JmUO/Sm0M9x6SjMYRlWiy0i2L+IgEq0nYLyBipXngPozNqvJS1izhhIZf6jIkIYQJdF8QeWMZ42Rxqc5wNmyg==} + + '@layerzerolabs/lz-v2-utilities@3.0.156': + resolution: {integrity: sha512-AV8TPMN2bqJ6fNoY5adX+GxYD3/RhoF9EjY1F1onUfuojcqRJ7O4PgbK5k+B9XzTN3HHA6HNZo4vHCrY26kKwA==} + + '@layerzerolabs/metadata-tools@3.0.3': + resolution: {integrity: sha512-h78EwbgN84Zo0Wr5n7gQL5Zp1lkSUFTP+56BLF+H0ZaH9CLqHMjypVMtKu9oNMpTas4P072v7O6P3XdiS6VOLw==} + peerDependencies: + '@layerzerolabs/devtools-evm-hardhat': ~4.0.0 + '@layerzerolabs/ua-devtools': ~5.0.1 + + '@layerzerolabs/oapp-evm@0.4.1': + resolution: {integrity: sha512-eOoDepVSrUlVNIlnkH0Vd5Vt4lXBkSBh6Bb16vsLbaN9AryBjy4GDpsE7K4c8iWTFL9BiBXGsV7nJTkgqi+xRQ==} + peerDependencies: + '@layerzerolabs/lz-evm-messagelib-v2': ^3.0.148 + '@layerzerolabs/lz-evm-protocol-v2': ^3.0.148 + '@layerzerolabs/lz-evm-v1-0.7': ^3.0.148 + '@openzeppelin/contracts': ^4.8.1 || ^5.0.0 + '@openzeppelin/contracts-upgradeable': ^4.8.1 || ^5.0.0 + + '@layerzerolabs/oft-evm@4.0.1': + resolution: {integrity: sha512-GjjfnUbx77TnFFKALVRXJYb1bt1jvarcyyx/AQo6sZfJng5DIqzI9wDxEGlUz03tEnsS6ZOOLBsH+e/hYsruiA==} + peerDependencies: + '@layerzerolabs/lz-evm-messagelib-v2': ^3.0.148 + '@layerzerolabs/lz-evm-protocol-v2': ^3.0.148 + '@layerzerolabs/lz-evm-v1-0.7': ^3.0.148 + '@layerzerolabs/oapp-evm': ^0.4.1 + '@openzeppelin/contracts': ^4.8.1 || ^5.0.0 + '@openzeppelin/contracts-upgradeable': ^4.8.1 || ^5.0.0 + + '@layerzerolabs/oft-mint-burn-starknet@0.2.20': + resolution: {integrity: sha512-Hb2N+XZq7vak1JAiz/Wj5tP9qPrn8HzwfmIZw6QtFTIA9H24yby8Leew92CDh8wuHZn2Erc0bW8GRoqqxzGARg==} + peerDependencies: + '@layerzerolabs/protocol-starknet-v2': '>=0.2.0' + + '@layerzerolabs/oft-v2-solana-sdk@3.0.156': + resolution: {integrity: sha512-vpbEJJFZCOHoA1arBpr0FfG5jzxJQta+7cTPN86/szkiGGji4LTSxGCWwMiDcMONt/jUfOx5f1PPXhK1tOK1nA==} + + '@layerzerolabs/prettier-config-next@2.3.44': + resolution: {integrity: sha512-mIsxKLaelXHXXXvMEAE6Jc8IVydra0PesHquHYwvxFKwDhMhzfrnoRLLzbgCX/Zi1q0GGET/oMAKJTs6OWFPxQ==} + + '@layerzerolabs/protocol-devtools-evm@5.0.2': + resolution: {integrity: sha512-KeBBqxupuJ2CchmjctHSs6IcGd4iWSgIvVnQ9EI662ScwMmESz3JMFMkUhsQQqDa/a4Hvf8rLYW+e7E7D1TuVw==} + 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.4 + '@layerzerolabs/devtools-evm': ~3.0.2 + '@layerzerolabs/io-devtools': ~0.3.2 + '@layerzerolabs/lz-definitions': ^3.0.148 + '@layerzerolabs/protocol-devtools': ~3.0.2 + zod: ^3.22.4 + + '@layerzerolabs/protocol-devtools-solana@8.0.6': + resolution: {integrity: sha512-ovtpI8zfzs05p86lOZFsfb4BHq5SVO6tTDm52tloiGjLNYxOwvHwMea8y74LuPEf7CPw0sROqCOHZst8dN9Q7g==} + peerDependencies: + '@layerzerolabs/devtools': ~2.0.4 + '@layerzerolabs/devtools-solana': ~3.0.5 + '@layerzerolabs/io-devtools': ~0.3.2 + '@layerzerolabs/lz-definitions': ^3.0.148 + '@layerzerolabs/lz-solana-sdk-v2': ^3.0.0 + '@layerzerolabs/lz-v2-utilities': ^3.0.148 + '@layerzerolabs/protocol-devtools': ^3.0.2 + '@layerzerolabs/ua-devtools': ^5.0.2 + '@solana/web3.js': ^1.98.0 + fp-ts: ^2.16.2 + zod: ^3.22.4 + + '@layerzerolabs/protocol-devtools@3.0.2': + resolution: {integrity: sha512-HFlsMQJTEH7aSxeKtokp4h1bu7u/GkFHy4smBPgcY/OsRQSdtOxXJQzopFcEsikvnfPkpXplnf8IUwJi7YGyNg==} + peerDependencies: + '@layerzerolabs/devtools': ~2.0.4 + '@layerzerolabs/io-devtools': ~0.3.2 + '@layerzerolabs/lz-definitions': ^3.0.148 + zod: ^3.22.4 + + '@layerzerolabs/protocol-starknet-v2@0.2.20': + resolution: {integrity: sha512-iWueRZJfVcL622AAo9XZQ/RmAq15cuNNFmRGAEc6YQUPJrOFkgmwrh2Bosxc2cHSQGIZFT+k/ZUS/nTLG4ttVg==} + + '@layerzerolabs/solhint-config@3.0.156': + resolution: {integrity: sha512-gpdQtyqj7ke607+9QT43I/CxNVuqUOhqPsg8oqHiZGNHNEsF/5GAPqJPOXtCAav5N9SL1JLrt0WC7RiyI6l09Q==} + + '@layerzerolabs/test-devtools-evm-foundry@8.0.1': + resolution: {integrity: sha512-oih2mReJJsSjjxFyovcOefgMmHo22f9LocHPuHNV82aGI5Sw+RR+eP6bIOuKPt/8I5cMJfusMJzQJtuvDYQhDg==} + peerDependencies: + '@layerzerolabs/lz-evm-messagelib-v2': ^3.0.148 + '@layerzerolabs/lz-evm-protocol-v2': ^3.0.148 + '@layerzerolabs/lz-evm-v1-0.7': ^3.0.148 + '@layerzerolabs/oapp-evm': ^0.4.1 + '@layerzerolabs/oft-evm': ^4.0.1 + '@openzeppelin/contracts': ^4.9.5 || ^5.0.0 + '@openzeppelin/contracts-upgradeable': ^4.9.5 || ^5.0.0 + + '@layerzerolabs/test-devtools-evm-hardhat@0.5.3': + resolution: {integrity: sha512-hqtwUAnq3U5I1FPUp0YHLYjEXPjP+8uuLPjG1B6AKGwOWswXE/9mE6CbYTk24fKOQgmgnt33Mem7TiHsSbz4vw==} + peerDependencies: + hardhat: ^2.22.10 + solidity-bytes-utils: ^0.8.2 + + '@layerzerolabs/toolbox-foundry@0.1.13': + resolution: {integrity: sha512-3rC+BVEPgcHLHPO4qn3KqYUG1vhDtr1m/gsaI1S635MK+19475U8HYATznAzHKwi09cf9uEv5C7fdtHXgIw8sQ==} + + '@layerzerolabs/toolbox-hardhat@0.6.13': + resolution: {integrity: sha512-RDpVqRbRPyDAlGsRVPpN0UdDVUfYkXq2qFIqkDxgIpNbWxwXPE0dJgC8D/O/gXxGMYUmljk2huNh9btWgU28bw==} + peerDependencies: + '@nomicfoundation/hardhat-ethers': ^3.0.2 + ethers: ^5.7.2 + hardhat: ^2.22.10 + hardhat-deploy: ^0.12.1 + + '@layerzerolabs/tron-utilities@3.0.156': + resolution: {integrity: sha512-WbmldyR4ruo1zpmpJzJC7uVu6IuF3oqU/hhJo9yC+AYYzHf2SlAHsSIL/h+EeOLiCyIc+ZSX9/0I6d2Jq+e4Cw==} + + '@layerzerolabs/ua-devtools-evm-hardhat@9.0.2': + resolution: {integrity: sha512-zI/8FwucBhmgyT7VhQhH091L8czZ6IBkXUNjMVDVQ7ueAmyvP8weSq/SRcve6EzeeDR0wxxHqQILPmKLKlP7zA==} + 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.5 + '@layerzerolabs/devtools-evm': ~3.0.2 + '@layerzerolabs/devtools-evm-hardhat': ~4.0.4 + '@layerzerolabs/io-devtools': ~0.3.2 + '@layerzerolabs/lz-definitions': ^3.0.148 + '@layerzerolabs/protocol-devtools': ~3.0.2 + '@layerzerolabs/protocol-devtools-evm': ~5.0.2 + '@layerzerolabs/ua-devtools': ~5.0.2 + '@layerzerolabs/ua-devtools-evm': ~7.0.1 + ethers: ^5.7.2 + hardhat: ^2.22.10 + hardhat-deploy: ^0.12.1 + + '@layerzerolabs/ua-devtools-evm@7.0.1': + resolution: {integrity: sha512-YOZ2E2NCJrn/+wFXVPEb77US6OQ+gL3hThQK0xj+CFeATlXlPyDtMVg6dq5EHrY9luCClbf1WE2Iz/I0Tt2EvA==} + peerDependencies: + '@ethersproject/constants': ^5.7.0 + '@ethersproject/contracts': ^5.7.0 + '@layerzerolabs/devtools': ~2.0.4 + '@layerzerolabs/devtools-evm': ~3.0.2 + '@layerzerolabs/io-devtools': ~0.3.2 + '@layerzerolabs/lz-definitions': ^3.0.148 + '@layerzerolabs/lz-v2-utilities': ^3.0.148 + '@layerzerolabs/protocol-devtools': ~3.0.2 + '@layerzerolabs/protocol-devtools-evm': ~5.0.2 + '@layerzerolabs/ua-devtools': ~5.0.2 + zod: ^3.22.4 + + '@layerzerolabs/ua-devtools-solana@8.0.7': + resolution: {integrity: sha512-3qdsZhzX9Kf6WlxcJvlCFbh6Lh90ucL4kYUvsDYtGgiHR/DyZ/DXO1sJY2dPwvarBFD0SN90xd+y4OdOcXlaHQ==} + peerDependencies: + '@layerzerolabs/devtools': ~2.0.4 + '@layerzerolabs/devtools-solana': ~3.0.5 + '@layerzerolabs/io-devtools': ~0.3.2 + '@layerzerolabs/lz-definitions': ^3.0.148 + '@layerzerolabs/lz-solana-sdk-v2': ^3.0.59 + '@layerzerolabs/lz-v2-utilities': ^3.0.148 + '@layerzerolabs/oft-v2-solana-sdk': ^3.0.59 + '@layerzerolabs/protocol-devtools': ^3.0.2 + '@layerzerolabs/protocol-devtools-solana': ~8.0.6 + '@layerzerolabs/ua-devtools': ^5.0.2 + '@solana/web3.js': ^1.98.0 + fp-ts: ^2.16.2 + zod: ^3.22.4 + + '@layerzerolabs/ua-devtools@5.0.2': + resolution: {integrity: sha512-CxYSKblpzb17z2lR+kZrLMz6LCE2CpML/Ypyi7MZoS0RCr8vTWZrHacRKbtNSwzjIJFUEHFxlktjfPeTlnMSAQ==} + peerDependencies: + '@layerzerolabs/devtools': ~2.0.4 + '@layerzerolabs/io-devtools': ~0.3.2 + '@layerzerolabs/lz-definitions': ^3.0.148 + '@layerzerolabs/lz-v2-utilities': ^3.0.148 + '@layerzerolabs/protocol-devtools': ~3.0.2 + zod: ^3.22.4 + + '@ledgerhq/devices@8.10.0': + resolution: {integrity: sha512-ytT66KI8MizFX6dGJKthOzPDw5uNRmmg+RaMta62jbFePKYqfXtYTp6Wc0ErTXaL8nFS3IujHENwKthPmsj6jw==} + + '@ledgerhq/errors@6.29.0': + resolution: {integrity: sha512-mmDsGN662zd0XGKyjzSKkg+5o1/l9pvV1HkVHtbzaydvHAtRypghmVoWMY9XAQDLXiUBXGIsLal84NgmGeuKWA==} + + '@ledgerhq/hw-transport-webhid@6.31.0': + resolution: {integrity: sha512-XtCFOJ1ooaqCefB6WDfV/ie+GaO/7xQgezwRpyLroMBYboSpnEd3Diu3BAoptXKTNklwZEiUVRLVXlltTBzNvw==} + + '@ledgerhq/hw-transport-webusb@6.30.0': + resolution: {integrity: sha512-GX5OJvNl0cRZyadxQjS+cnAxiD2irw4Cponp46r50WmirXOLR7hJYKfd1plmGlZOAgT6ayggOZkzahunYerPXw==} + + '@ledgerhq/hw-transport@6.32.0': + resolution: {integrity: sha512-bf2nxzDQ21DV/bsmExfWI0tatoVeoqhu/ePWalD/nPgPnTn/ZIDq7VBU+TY5p0JZaE87NQwmRUAjm6C1Exe61A==} + + '@ledgerhq/logs@6.14.0': + resolution: {integrity: sha512-kJFu1+asWQmU9XlfR1RM3lYR76wuEoPyZvkI/CNjpft78BQr3+MMf3Nu77ABzcKFnhIcmAkOLlDQ6B8L6hDXHA==} + + '@mdn/browser-compat-data@5.7.6': + resolution: {integrity: sha512-7xdrMX0Wk7grrTZQwAoy1GkvPMFoizStUoL+VmtUkAxegbCCec+3FKwOM6yc/uGU5+BEczQHXAlWiqvM8JeENg==} + + '@metaplex-foundation/beet-solana@0.4.1': + resolution: {integrity: sha512-/6o32FNUtwK8tjhotrvU/vorP7umBuRFvBZrC6XCk51aKidBHe5LPVPA5AjGPbV3oftMfRuXPNd9yAGeEqeCDQ==} + + '@metaplex-foundation/beet@0.7.2': + resolution: {integrity: sha512-K+g3WhyFxKPc0xIvcIjNyV1eaTVJTiuaHZpig7Xx0MuYRMoJLLvhLTnUXhFdR5Tu2l2QSyKwfyXDgZlzhULqFg==} + + '@metaplex-foundation/mpl-token-metadata@3.4.0': + resolution: {integrity: sha512-AxBAYCK73JWxY3g9//z/C9krkR0t1orXZDknUPS4+GjwGH2vgPfsk04yfZ31Htka2AdS9YE/3wH7sMUBHKn9Rg==} + peerDependencies: + '@metaplex-foundation/umi': '>= 0.8.2 <= 1' + + '@metaplex-foundation/mpl-toolbox@0.10.0': + resolution: {integrity: sha512-84KD1L5cFyw5xnntHwL4uPwfcrkKSiwuDeypiVr92qCUFuF3ZENa2zlFVPu+pQcjTlod2LmEX3MhBmNjRMpdKg==} + peerDependencies: + '@metaplex-foundation/umi': '>= 0.8.2 <= 1' + + '@metaplex-foundation/mpl-toolbox@0.9.4': + resolution: {integrity: sha512-fd6JxfoLbj/MM8FG2x91KYVy1U6AjBQw4qjt7+Da3trzQaWnSaYHDcYRG/53xqfvZ9qofY1T2t53GXPlD87lnQ==} + peerDependencies: + '@metaplex-foundation/umi': '>= 0.8.2 < 1' + + '@metaplex-foundation/umi-bundle-defaults@0.9.2': + resolution: {integrity: sha512-kV3tfvgvRjVP1p9OFOtH+ibOtN9omVJSwKr0We4/9r45e5LTj+32su0V/rixZUkG1EZzzOYBsxhtIE0kIw/Hrw==} + peerDependencies: + '@metaplex-foundation/umi': ^0.9.2 + '@solana/web3.js': ^1.98.0 + + '@metaplex-foundation/umi-downloader-http@0.9.2': + resolution: {integrity: sha512-tzPT9hBwenzTzAQg07rmsrqZfgguAXELbcJrsYMoASp5VqWFXYIP00g94KET6XLjWUXH4P1J2zoa6hGennPXHA==} + peerDependencies: + '@metaplex-foundation/umi': ^0.9.2 + + '@metaplex-foundation/umi-eddsa-web3js@0.9.2': + resolution: {integrity: sha512-hhPCxXbYIp4BC4z9gK78sXpWLkNSrfv4ndhF5ruAkdIp7GcRVYKj0QnOUO6lGYGiIkNlw20yoTwOe1CT//OfTQ==} + peerDependencies: + '@metaplex-foundation/umi': ^0.9.2 + '@solana/web3.js': ^1.98.0 + + '@metaplex-foundation/umi-http-fetch@0.9.2': + resolution: {integrity: sha512-YCZuBu24T9ZzEDe4+w12LEZm/fO9pkyViZufGgASC5NX93814Lvf6Ssjn/hZzjfA7CvZbvLFbmujc6CV3Q/m9Q==} + peerDependencies: + '@metaplex-foundation/umi': ^0.9.2 + + '@metaplex-foundation/umi-options@0.8.9': + resolution: {integrity: sha512-jSQ61sZMPSAk/TXn8v8fPqtz3x8d0/blVZXLLbpVbo2/T5XobiI6/MfmlUosAjAUaQl6bHRF8aIIqZEFkJiy4A==} + + '@metaplex-foundation/umi-program-repository@0.9.2': + resolution: {integrity: sha512-g3+FPqXEmYsBa8eETtUE2gb2Oe3mqac0z3/Ur1TvAg5TtIy3mzRzOy/nza+sgzejnfcxcVg835rmpBaxpBnjDA==} + peerDependencies: + '@metaplex-foundation/umi': ^0.9.2 + + '@metaplex-foundation/umi-public-keys@0.8.9': + resolution: {integrity: sha512-CxMzN7dgVGOq9OcNCJe2casKUpJ3RmTVoOvDFyeoTQuK+vkZ1YSSahbqC1iGuHEtKTLSjtWjKvUU6O7zWFTw3Q==} + + '@metaplex-foundation/umi-rpc-chunk-get-accounts@0.9.2': + resolution: {integrity: sha512-YRwVf6xH0jPBAUgMhEPi+UbjioAeqTXmjsN2TnmQCPAmHbrHrMRj0rlWYwFLWAgkmoxazYrXP9lqOFRrfOGAEA==} + peerDependencies: + '@metaplex-foundation/umi': ^0.9.2 + + '@metaplex-foundation/umi-rpc-web3js@0.9.2': + resolution: {integrity: sha512-MqcsBz8B4wGl6jxsf2Jo/rAEpYReU9VCSR15QSjhvADHMmdFxCIZCCAgE+gDE2Vuanfl437VhOcP3g5Uw8C16Q==} + peerDependencies: + '@metaplex-foundation/umi': ^0.9.2 + '@solana/web3.js': ^1.98.0 + + '@metaplex-foundation/umi-serializer-data-view@0.9.2': + resolution: {integrity: sha512-5vGptadJxUxvUcyrwFZxXlEc6Q7AYySBesizCtrBFUY8w8PnF2vzmS45CP1MLySEATNH6T9mD4Rs0tLb87iQyA==} + peerDependencies: + '@metaplex-foundation/umi': ^0.9.2 + + '@metaplex-foundation/umi-serializers-core@0.8.9': + resolution: {integrity: sha512-WT82tkiYJ0Qmscp7uTj1Hz6aWQPETwaKLAENAUN5DeWghkuBKtuxyBKVvEOuoXerJSdhiAk0e8DWA4cxcTTQ/w==} + + '@metaplex-foundation/umi-serializers-encodings@0.8.9': + resolution: {integrity: sha512-N3VWLDTJ0bzzMKcJDL08U3FaqRmwlN79FyE4BHj6bbAaJ9LEHjDQ9RJijZyWqTm0jE7I750fU7Ow5EZL38Xi6Q==} + + '@metaplex-foundation/umi-serializers-numbers@0.8.9': + resolution: {integrity: sha512-NtBf1fnVNQJHFQjLFzRu2i9GGnigb9hOm/Gfrk628d0q0tRJB7BOM3bs5C61VAs7kJs4yd+pDNVAERJkknQ7Lg==} + + '@metaplex-foundation/umi-serializers@0.9.0': + resolution: {integrity: sha512-hAOW9Djl4w4ioKeR4erDZl5IG4iJdP0xA19ZomdaCbMhYAAmG/FEs5khh0uT2mq53/MnzWcXSUPoO8WBN4Q+Vg==} + + '@metaplex-foundation/umi-transaction-factory-web3js@0.9.2': + resolution: {integrity: sha512-fR1Kf21uylMFd1Smkltmj4jTNxhqSWf416owsJ+T+cvJi2VCOcOwq/3UFzOrpz78fA0RhsajKYKj0HYsRnQI1g==} + peerDependencies: + '@metaplex-foundation/umi': ^0.9.2 + '@solana/web3.js': ^1.98.0 + + '@metaplex-foundation/umi-web3js-adapters@0.9.2': + resolution: {integrity: sha512-RQqUTtHYY9fmEMnq7s3Hiv/81flGaoI0ZVVoafnFVaQLnxU6QBKxtboRZHk43XtD9CiFh5f9izrMJX7iK7KlOA==} + peerDependencies: + '@metaplex-foundation/umi': ^0.9.2 + '@solana/web3.js': ^1.98.0 + + '@metaplex-foundation/umi@0.9.2': + resolution: {integrity: sha512-9i4Acm4pruQfJcpRrc2EauPBwkfDN0I9QTvJyZocIlKgoZwD6A6wH0PViH1AjOVG5CQCd1YI3tJd5XjYE1ElBw==} + + '@mysten/bcs@1.9.2': + resolution: {integrity: sha512-kBk5xrxV9OWR7i+JhL/plQrgQ2/KJhB2pB5gj+w6GXhbMQwS3DPpOvi/zN0Tj84jwPvHMllpEl0QHj6ywN7/eQ==} + + '@mysten/sui@1.45.2': + resolution: {integrity: sha512-gftf7fNpFSiXyfXpbtP2afVEnhc7p2m/MEYc/SO5pov92dacGKOpQIF7etZsGDI1Wvhv+dpph+ulRNpnYSs7Bg==} + engines: {node: '>=18'} + + '@mysten/utils@0.2.0': + resolution: {integrity: sha512-CM6kJcJHX365cK6aXfFRLBiuyXc5WSBHQ43t94jqlCAIRw8umgNcTb5EnEA9n31wPAQgLDGgbG/rCUISCTJ66w==} + + '@napi-rs/wasm-runtime@0.2.12': + resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} + + '@noble/ciphers@1.3.0': + resolution: {integrity: sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==} + engines: {node: ^14.21.3 || >=16} + + '@noble/curves@1.4.2': + resolution: {integrity: sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==} + + '@noble/curves@1.7.0': + resolution: {integrity: sha512-UTMhXK9SeDhFJVrHeUJ5uZlI6ajXg10O6Ddocf9S6GjbSBVZsJo88HzKwXznNfGpMTRDyJkqMjNDPYgf0qFWnw==} + engines: {node: ^14.21.3 || >=16} + + '@noble/curves@1.8.2': + resolution: {integrity: sha512-vnI7V6lFNe0tLAuJMu+2sX+FcL14TaCWy1qiczg1VwRmPrpQCdq5ESXQMqUc2tluRNf6irBXrWbl1mGN8uaU/g==} + engines: {node: ^14.21.3 || >=16} + + '@noble/curves@1.9.1': + resolution: {integrity: sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==} + engines: {node: ^14.21.3 || >=16} + + '@noble/curves@1.9.4': + resolution: {integrity: sha512-2bKONnuM53lINoDrSmK8qP8W271ms7pygDhZt4SiLOoLwBtoHqeCFi6RG42V8zd3mLHuJFhU/Bmaqo4nX0/kBw==} + engines: {node: ^14.21.3 || >=16} + + '@noble/curves@1.9.7': + resolution: {integrity: sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==} + engines: {node: ^14.21.3 || >=16} + + '@noble/ed25519@1.7.5': + resolution: {integrity: sha512-xuS0nwRMQBvSxDa7UxMb61xTiH3MxTgUfhyPUALVIe0FlOAz4sjELwyDRyUvqeEYfRSG9qNjFIycqLZppg4RSA==} + + '@noble/hashes@1.2.0': + resolution: {integrity: sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==} + + '@noble/hashes@1.3.3': + resolution: {integrity: sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==} + engines: {node: '>= 16'} + + '@noble/hashes@1.4.0': + resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} + engines: {node: '>= 16'} + + '@noble/hashes@1.6.0': + resolution: {integrity: sha512-YUULf0Uk4/mAA89w+k3+yUYh6NrEvxZa5T6SY3wlMvE2chHkxFUUIDI8/XW1QSC357iA5pSnqt7XEhvFOqmDyQ==} + engines: {node: ^14.21.3 || >=16} + + '@noble/hashes@1.6.1': + resolution: {integrity: sha512-pq5D8h10hHBjyqX+cfBm0i8JUXJ0UhczFc4r74zbuT9XgewFo2E3J1cOaGtdZynILNmQ685YWGzGE1Zv6io50w==} + engines: {node: ^14.21.3 || >=16} + + '@noble/hashes@1.7.2': + resolution: {integrity: sha512-biZ0NUSxyjLLqo6KxEJ1b+C2NAx0wtDoFvCaXHGgUkeHzf3Xc1xKumFKREuT7f7DARNZ/slvYUwFG6B0f2b6hQ==} + engines: {node: ^14.21.3 || >=16} + + '@noble/hashes@1.8.0': + resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} + engines: {node: ^14.21.3 || >=16} + + '@noble/secp256k1@1.7.1': + resolution: {integrity: sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==} + + '@noble/secp256k1@1.7.2': + resolution: {integrity: sha512-/qzwYl5eFLH8OWIecQWM31qld2g1NfjgylK+TNhqtaUKP37Nm+Y+z30Fjhw0Ct8p9yCQEm2N3W/AckdIb3SMcQ==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@nolyfill/is-core-module@1.0.39': + resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} + engines: {node: '>=12.4.0'} + + '@nomicfoundation/edr-darwin-arm64@0.12.0-next.22': + resolution: {integrity: sha512-TpEBSKyMZJEPvYwBPYclC2b+qobKjn1YhVa7aJ1R7RMPy5dJ/PqsrUK5UuUFFybBqoIorru5NTcsyCMWP5T/Fg==} + engines: {node: '>= 20'} + + '@nomicfoundation/edr-darwin-x64@0.12.0-next.22': + resolution: {integrity: sha512-aK/+m8xUkR4u+czTVGU06nSFVH43AY6XCBoR2YjO8SglAAjCSTWK3WAfVb6FcsriMmKv4PrvoyHLMbMP+fXcGA==} + engines: {node: '>= 20'} + + '@nomicfoundation/edr-linux-arm64-gnu@0.12.0-next.22': + resolution: {integrity: sha512-W5vXMleG14hVzRYGPEwlHLJ6iiQE8Qh63Uj538nAz4YUI6wWSgUOZE7K2Gt1EdujZGnrt7kfDslgJ96n4nKQZw==} + engines: {node: '>= 20'} + + '@nomicfoundation/edr-linux-arm64-musl@0.12.0-next.22': + resolution: {integrity: sha512-VDp7EB3iY8MH/fFVcgEzLDGYmtS6j2honNc0RNUCFECKPrdsngGrTG8p+YFxyVjq2m5GEsdyKo4e+BKhaUNPdg==} + engines: {node: '>= 20'} + + '@nomicfoundation/edr-linux-x64-gnu@0.12.0-next.22': + resolution: {integrity: sha512-XL6oA3ymRSQYyvg6hF1KIax6V/9vlWr5gJ8GPHVVODk1a/YfuEEY1osN5Zmo6aztUkSGKwSuac/3Ax7rfDDiSg==} + engines: {node: '>= 20'} + + '@nomicfoundation/edr-linux-x64-musl@0.12.0-next.22': + resolution: {integrity: sha512-hmkRIXxWa9P0PwfXOAO6WUw11GyV5gpxcMunqWBTkwZ4QW/hi/CkXmlLo6VHd6ceCwpUNLhCGndBtrOPrNRi4A==} + engines: {node: '>= 20'} + + '@nomicfoundation/edr-win32-x64-msvc@0.12.0-next.22': + resolution: {integrity: sha512-X7f+7KUMm00trsXAHCHJa+x1fc3QAbk2sBctyOgpET+GLrfCXbxqrccKi7op8f0zTweAVGg1Hsc8SjjC7kwFLw==} + engines: {node: '>= 20'} + + '@nomicfoundation/edr@0.12.0-next.22': + resolution: {integrity: sha512-JigYWf2stjpDxSndBsxRoobQHK8kz4SAVaHtTIKQLIHbsBwymE8i120Ejne6Jk+Ndc5CsNINXB8/bK6vLPe9jA==} + engines: {node: '>= 20'} + + '@nomicfoundation/hardhat-ethers@3.1.3': + resolution: {integrity: sha512-208JcDeVIl+7Wu3MhFUUtiA8TJ7r2Rn3Wr+lSx9PfsDTKkbsAsWPY6N6wQ4mtzDv0/pB9nIbJhkjoHe1EsgNsA==} + peerDependencies: + ethers: ^5.7.2 + hardhat: ^2.28.0 + + '@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.2': + resolution: {integrity: sha512-JaqcWPDZENCvm++lFFGjrDd8mxtf+CtLd2MiXvMNTBD33dContTZ9TWETwNFwg7JTJT5Q9HEecH7FA+HTSsIUw==} + engines: {node: '>= 12'} + + '@nomicfoundation/solidity-analyzer-darwin-x64@0.1.2': + resolution: {integrity: sha512-fZNmVztrSXC03e9RONBT+CiksSeYcxI1wlzqyr0L7hsQlK1fzV+f04g2JtQ1c/Fe74ZwdV6aQBdd6Uwl1052sw==} + engines: {node: '>= 12'} + + '@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.2': + resolution: {integrity: sha512-3d54oc+9ZVBuB6nbp8wHylk4xh0N0Gc+bk+/uJae+rUgbOBwQSfuGIbAZt1wBXs5REkSmynEGcqx6DutoK0tPA==} + engines: {node: '>= 12'} + + '@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.2': + resolution: {integrity: sha512-iDJfR2qf55vgsg7BtJa7iPiFAsYf2d0Tv/0B+vhtnI16+wfQeTbP7teookbGvAo0eJo7aLLm0xfS/GTkvHIucA==} + engines: {node: '>= 12'} + + '@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.2': + resolution: {integrity: sha512-9dlHMAt5/2cpWyuJ9fQNOUXFB/vgSFORg1jpjX1Mh9hJ/MfZXlDdHQ+DpFCs32Zk5pxRBb07yGvSHk9/fezL+g==} + engines: {node: '>= 12'} + + '@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.2': + resolution: {integrity: sha512-GzzVeeJob3lfrSlDKQw2bRJ8rBf6mEYaWY+gW0JnTDHINA0s2gPR4km5RLIj1xeZZOYz4zRw+AEeYgLRqB2NXg==} + engines: {node: '>= 12'} + + '@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.2': + resolution: {integrity: sha512-Fdjli4DCcFHb4Zgsz0uEJXZ2K7VEO+w5KVv7HmT7WO10iODdU9csC2az4jrhEsRtiR9Gfd74FlG0NYlw1BMdyA==} + engines: {node: '>= 12'} + + '@nomicfoundation/solidity-analyzer@0.1.2': + resolution: {integrity: sha512-q4n32/FNKIhQ3zQGGw5CvPF6GTvDCpYwIf7bEY/dZTZbgfDsHyjJwURxUJf3VQuuJj+fDIFl4+KkBVbw4Ef6jA==} + engines: {node: '>= 12'} + + '@nomiclabs/hardhat-ethers@2.2.3': + resolution: {integrity: sha512-YhzPdzb612X591FOe68q+qXVXGG2ANZRvDo0RRUtimev85rCrAlv/TLMEZw5c+kq9AbzocLTVX/h2jVIFPL9Xg==} + peerDependencies: + ethers: ^5.7.2 + hardhat: ^2.0.0 + + '@nomiclabs/hardhat-waffle@2.0.6': + 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 + + '@openzeppelin/contracts-upgradeable@4.7.3': + resolution: {integrity: sha512-+wuegAMaLcZnLCJIvrVUDzA9z/Wp93f0Dla/4jJvIhijRrPabjQbZe6fWiECLaJyfn5ci9fqf9vTw3xpQOad2A==} + + '@openzeppelin/contracts-upgradeable@5.4.0': + resolution: {integrity: sha512-STJKyDzUcYuB35Zub1JpWW58JxvrFFVgQ+Ykdr8A9PGXgtq/obF5uoh07k2XmFyPxfnZdPdBdhkJ/n2YxJ87HQ==} + peerDependencies: + '@openzeppelin/contracts': 5.4.0 + + '@openzeppelin/contracts@3.4.2': + resolution: {integrity: sha512-z0zMCjyhhp4y7XKAcDAi3Vgms4T2PstwBdahiO0+9NaGICQKjynK3wduSRplTgk4LXmoO1yfDGO5RbjKYxtuxA==} + + '@openzeppelin/contracts@4.3.3': + resolution: {integrity: sha512-tDBopO1c98Yk7Cv/PZlHqrvtVjlgK5R4J6jxLwoO7qxK4xqOiZG+zSkIvGFpPZ0ikc3QOED3plgdqjgNTnBc7g==} + + '@openzeppelin/contracts@5.4.0': + resolution: {integrity: sha512-eCYgWnLg6WO+X52I16TZt8uEjbtdkgLC0SUX/xnAksjjrQI4Xfn4iBRoI5j55dmlOhDv1Y7BoR3cU7e3WWhC6A==} + + '@peculiar/asn1-schema@2.6.0': + resolution: {integrity: sha512-xNLYLBFTBKkCzEZIw842BxytQQATQv+lDTCEMZ8C196iJcJJMBUZxrhSTxLaohMyKK8QlzRNTRkUmanucnDSqg==} + + '@pkgr/core@0.2.9': + resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + + '@pnpm/config.env-replace@1.1.0': + resolution: {integrity: sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==} + engines: {node: '>=12.22.0'} + + '@pnpm/network.ca-file@1.0.2': + resolution: {integrity: sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==} + engines: {node: '>=12.22.0'} + + '@pnpm/npm-conf@3.0.2': + resolution: {integrity: sha512-h104Kh26rR8tm+a3Qkc5S4VLYint3FE48as7+/5oCEcKR2idC/pF1G6AhIXKI+eHPJa/3J9i5z0Al47IeGHPkA==} + engines: {node: '>=12'} + + '@protobuf-ts/grpcweb-transport@2.11.1': + resolution: {integrity: sha512-1W4utDdvOB+RHMFQ0soL4JdnxjXV+ddeGIUg08DvZrA8Ms6k5NN6GBFU2oHZdTOcJVpPrDJ02RJlqtaoCMNBtw==} + + '@protobuf-ts/runtime-rpc@2.11.1': + resolution: {integrity: sha512-4CqqUmNA+/uMz00+d3CYKgElXO9VrEbucjnBFEjqI4GuDrEQ32MaI3q+9qPBvIGOlL4PmHXrzM32vBPWRhQKWQ==} + + '@protobuf-ts/runtime@2.11.1': + resolution: {integrity: sha512-KuDaT1IfHkugM2pyz+FwiY80ejWrkH1pAtOBOZFuR6SXEFTsnb/jiQWQ1rCIrcKx2BtyxnxW6BWwsVSA/Ie+WQ==} + + '@protobufjs/aspromise@1.1.2': + resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} + + '@protobufjs/base64@1.1.2': + resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + + '@protobufjs/codegen@2.0.4': + resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} + + '@protobufjs/eventemitter@1.1.0': + resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} + + '@protobufjs/fetch@1.1.0': + resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} + + '@protobufjs/float@1.0.2': + resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + + '@protobufjs/inquire@1.1.0': + resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} + + '@protobufjs/path@1.1.2': + resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} + + '@protobufjs/pool@1.1.0': + resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} + + '@protobufjs/utf8@1.1.0': + resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + + '@resolver-engine/core@0.3.3': + resolution: {integrity: sha512-eB8nEbKDJJBi5p5SrvrvILn4a0h42bKtbCTri3ZxCGt6UvoQyp7HnGOfki944bUjBSHKK3RvgfViHn+kqdXtnQ==} + + '@resolver-engine/fs@0.3.3': + resolution: {integrity: sha512-wQ9RhPUcny02Wm0IuJwYMyAG8fXVeKdmhm8xizNByD4ryZlx6PP6kRen+t/haF43cMfmaV7T3Cx6ChOdHEhFUQ==} + + '@resolver-engine/imports-fs@0.3.3': + resolution: {integrity: sha512-7Pjg/ZAZtxpeyCFlZR5zqYkz+Wdo84ugB5LApwriT8XFeQoLwGUj4tZFFvvCuxaNCcqZzCYbonJgmGObYBzyCA==} + + '@resolver-engine/imports@0.3.3': + resolution: {integrity: sha512-anHpS4wN4sRMwsAbMXhMfOD/y4a4Oo0Cw/5+rue7hSwGWsDOQaAU1ClK1OxjUC35/peazxEl8JaSRRS+Xb8t3Q==} + + '@rtsao/scc@1.1.0': + resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} + + '@rushstack/eslint-patch@1.15.0': + resolution: {integrity: sha512-ojSshQPKwVvSMR8yT2L/QtUkV5SXi/IfDiJ4/8d6UbTPjiHVmxZzUAzGD8Tzks1b9+qQkZa0isUOvYObedITaw==} + + '@safe-global/api-kit@4.0.1': + resolution: {integrity: sha512-pNtDLgMHlCSr4Hwwe6jsnvMheAu2SZCTqjYlnNe4cKH2pSKINVRTiILoeJ0wOpixrMCH4NlgJ+9N3QruRNcCpQ==} + + '@safe-global/protocol-kit@1.3.0': + resolution: {integrity: sha512-zBhwHpaUggywmnR1Xm5RV22DpyjmVWYP3pnOl4rcf9LAc1k7IVmw6WIt2YVhHRaWGxVYMd4RitJX8Dx2+8eLZQ==} + + '@safe-global/protocol-kit@6.1.2': + resolution: {integrity: sha512-cTpPdUAS2AMfGCkD1T601rQNjT0rtMQLA2TH7L/C+iFPAC6WrrDFop2B9lzeHjczlnVzrRpfFe4cL1bLrJ9NZw==} + + '@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.' + + '@safe-global/safe-deployments@1.37.50': + resolution: {integrity: sha512-WUgH0YeVmHm0Uv5dQ8QW4nEAMs8Pm6DhObglBSUlW8ur+RGDd4/xmhFJKm8up/qbDVB/n5Skf+5d+eWZIPRClg==} + + '@safe-global/safe-modules-deployments@2.2.22': + resolution: {integrity: sha512-HxVSX2F3yHvtwm85KlRpM4QXnnq1LDXZZKs5X2+Ip9DeQX+xXSRm9MjHED7ZdCdxXT/Sfga/2vmKsnoSU1t/lA==} + + '@safe-global/types-kit@3.0.0': + resolution: {integrity: sha512-AZWIlR5MguDPdGiOj7BB4JQPY2afqmWQww1mu8m8Oi16HHBW99G01kFOu4NEHBwEU1cgwWOMY19hsI5KyL4W2w==} + + '@scure/base@1.1.9': + resolution: {integrity: sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==} + + '@scure/base@1.2.6': + resolution: {integrity: sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==} + + '@scure/bip32@1.1.5': + resolution: {integrity: sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==} + + '@scure/bip32@1.4.0': + resolution: {integrity: sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==} + + '@scure/bip32@1.7.0': + resolution: {integrity: sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw==} + + '@scure/bip39@1.1.1': + resolution: {integrity: sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==} + + '@scure/bip39@1.2.1': + resolution: {integrity: sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==} + + '@scure/bip39@1.3.0': + resolution: {integrity: sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==} + + '@scure/bip39@1.6.0': + resolution: {integrity: sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==} + + '@scure/starknet@1.1.0': + resolution: {integrity: sha512-83g3M6Ix2qRsPN4wqLDqiRZ2GBNbjVWfboJE/9UjfG+MHr6oDSu/CWgy8hsBSJejr09DkkL+l0Ze4KVrlCIdtQ==} + + '@sentry/core@5.30.0': + resolution: {integrity: sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==} + engines: {node: '>=6'} + + '@sentry/hub@5.30.0': + resolution: {integrity: sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==} + engines: {node: '>=6'} + + '@sentry/minimal@5.30.0': + resolution: {integrity: sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==} + engines: {node: '>=6'} + + '@sentry/node@5.30.0': + resolution: {integrity: sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==} + engines: {node: '>=6'} + + '@sentry/tracing@5.30.0': + resolution: {integrity: sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==} + engines: {node: '>=6'} + + '@sentry/types@5.30.0': + resolution: {integrity: sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==} + engines: {node: '>=6'} + + '@sentry/utils@5.30.0': + resolution: {integrity: sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==} + engines: {node: '>=6'} + + '@sinclair/typebox@0.27.8': + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + + '@sinclair/typebox@0.34.48': + resolution: {integrity: sha512-kKJTNuK3AQOrgjjotVxMrCn1sUJwM76wMszfq1kdU4uYVJjvEWuFQ6HgvLt4Xz3fSmZlTOxJ/Ie13KnIcWQXFA==} + + '@sindresorhus/is@4.6.0': + resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} + engines: {node: '>=10'} + + '@sindresorhus/is@5.6.0': + resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==} + engines: {node: '>=14.16'} + + '@sinonjs/commons@3.0.1': + resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} + + '@sinonjs/fake-timers@10.3.0': + resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} + + '@so-ric/colorspace@1.1.6': + resolution: {integrity: sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==} + + '@solana-developers/helpers@2.8.0': + resolution: {integrity: sha512-K3SjX3f0NbCGBcbN40vIMfTicYFNj8bkImcF32JxiR1YmsXu2scb3449bG1CRk/5JBSA0pP4p+lhGU1nc2mEVg==} + + '@solana-developers/helpers@2.8.1': + resolution: {integrity: sha512-xvoOj+ewL18+h6fMrXp1vTss0WBLnhQHnBb6mMPfEQE32w0THlxm8OPXNUY8g4tREX7ugU5cDEP7c2teye1Z7A==} + + '@solana/buffer-layout-utils@0.2.0': + resolution: {integrity: sha512-szG4sxgJGktbuZYDg2FfNmkMi0DYQoVjN2h7ta1W1hPrwzarcFLBq9UpX1UjNXsNpT9dn+chgprtWGioUAr4/g==} + engines: {node: '>= 10'} + + '@solana/buffer-layout@4.0.1': + resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} + engines: {node: '>=5.10'} + + '@solana/codecs-core@2.0.0-rc.1': + resolution: {integrity: sha512-bauxqMfSs8EHD0JKESaNmNuNvkvHSuN3bbWAF5RjOfDu2PugxHrvRebmYauvSumZ3cTfQ4HJJX6PG5rN852qyQ==} + peerDependencies: + typescript: '>=5' + + '@solana/codecs-core@2.3.0': + resolution: {integrity: sha512-oG+VZzN6YhBHIoSKgS5ESM9VIGzhWjEHEGNPSibiDTxFhsFWxNaz8LbMDPjBUE69r9wmdGLkrQ+wVPbnJcZPvw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/codecs-data-structures@2.0.0-rc.1': + resolution: {integrity: sha512-rinCv0RrAVJ9rE/rmaibWJQxMwC5lSaORSZuwjopSUE6T0nb/MVg6Z1siNCXhh/HFTOg0l8bNvZHgBcN/yvXog==} + peerDependencies: + typescript: '>=5' + + '@solana/codecs-numbers@2.0.0-rc.1': + resolution: {integrity: sha512-J5i5mOkvukXn8E3Z7sGIPxsThRCgSdgTWJDQeZvucQ9PT6Y3HiVXJ0pcWiOWAoQ3RX8e/f4I3IC+wE6pZiJzDQ==} + peerDependencies: + typescript: '>=5' + + '@solana/codecs-numbers@2.3.0': + resolution: {integrity: sha512-jFvvwKJKffvG7Iz9dmN51OGB7JBcy2CJ6Xf3NqD/VP90xak66m/Lg48T01u5IQ/hc15mChVHiBm+HHuOFDUrQg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/codecs-strings@2.0.0-rc.1': + resolution: {integrity: sha512-9/wPhw8TbGRTt6mHC4Zz1RqOnuPTqq1Nb4EyuvpZ39GW6O2t2Q7Q0XxiB3+BdoEjwA2XgPw6e2iRfvYgqty44g==} + peerDependencies: + fastestsmallesttextencoderdecoder: ^1.0.22 + typescript: '>=5' + + '@solana/codecs@2.0.0-rc.1': + resolution: {integrity: sha512-qxoR7VybNJixV51L0G1RD2boZTcxmwUWnKCaJJExQ5qNKwbpSyDdWfFJfM5JhGyKe9DnPVOZB+JHWXnpbZBqrQ==} + peerDependencies: + typescript: '>=5' + + '@solana/errors@2.0.0-rc.1': + resolution: {integrity: sha512-ejNvQ2oJ7+bcFAYWj225lyRkHnixuAeb7RQCixm+5mH4n1IA4Qya/9Bmfy5RAAHQzxK43clu3kZmL5eF9VGtYQ==} + hasBin: true + peerDependencies: + typescript: '>=5' + + '@solana/errors@2.3.0': + resolution: {integrity: sha512-66RI9MAbwYV0UtP7kGcTBVLxJgUxoZGm8Fbc0ah+lGiAw17Gugco6+9GrJCV83VyF2mDWyYnYM9qdI3yjgpnaQ==} + engines: {node: '>=20.18.0'} + hasBin: true + peerDependencies: + typescript: '>=5.3.3' + + '@solana/options@2.0.0-rc.1': + resolution: {integrity: sha512-mLUcR9mZ3qfHlmMnREdIFPf9dpMc/Bl66tLSOOWxw4ml5xMT2ohFn7WGqoKcu/UHkT9CrC6+amEdqCNvUqI7AA==} + peerDependencies: + typescript: '>=5' + + '@solana/spl-token-group@0.0.7': + resolution: {integrity: sha512-V1N/iX7Cr7H0uazWUT2uk27TMqlqedpXHRqqAbVO2gvmJyT0E0ummMEAVQeXZ05ZhQ/xF39DLSdBp90XebWEug==} + engines: {node: '>=16'} + peerDependencies: + '@solana/web3.js': ^1.98.0 + + '@solana/spl-token-metadata@0.1.6': + resolution: {integrity: sha512-7sMt1rsm/zQOQcUWllQX9mD2O6KhSAtY1hFR2hfFwgqfFWzSY9E9GDvFVNYUI1F0iQKcm6HmePU9QbKRXTEBiA==} + engines: {node: '>=16'} + peerDependencies: + '@solana/web3.js': ^1.98.0 + + '@solana/spl-token@0.3.11': + resolution: {integrity: sha512-bvohO3rIMSVL24Pb+I4EYTJ6cL82eFpInEXD/I8K8upOGjpqHsKUoAempR/RnUlI1qSFNyFlWJfu6MNUgfbCQQ==} + engines: {node: '>=16'} + peerDependencies: + '@solana/web3.js': ^1.98.0 + + '@solana/spl-token@0.4.14': + resolution: {integrity: sha512-u09zr96UBpX4U685MnvQsNzlvw9TiY005hk1vJmJr7gMJldoPG1eYU5/wNEyOA5lkMLiR/gOi9SFD4MefOYEsA==} + engines: {node: '>=16'} + peerDependencies: + '@solana/web3.js': ^1.98.0 + + '@solana/web3.js@1.98.4': + resolution: {integrity: sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw==} + + '@solidity-parser/parser@0.18.0': + resolution: {integrity: sha512-yfORGUIPgLck41qyN7nbwJRAx17/jAIXCTanHOJZhB6PJ1iAk/84b/xlsVKFSyNyLXIj0dhppoE0+CRws7wlzA==} + + '@solidity-parser/parser@0.20.2': + resolution: {integrity: sha512-rbu0bzwNvMcwAjH86hiEAcOeRI2EeK8zCkHDrFykh/Al8mvJeFmjy3UrE7GYQjNwOgbGUUtCn5/k8CB8zIu7QA==} + + '@sqds/sdk@2.0.4': + resolution: {integrity: sha512-SmwqL55GW9teIPRqYBVUp1tNp3Tfd8olPShas/+5L48XaUHBDEFNuDA9E8KKbIZoB34WSLdgyq0tIJLlhMMHnA==} + + '@starknet-io/types-js@0.8.4': + resolution: {integrity: sha512-0RZ3TZHcLsUTQaq1JhDSCM8chnzO4/XNsSCozwDET64JK5bjFDIf2ZUkta+tl5Nlbf4usoU7uZiDI/Q57kt2SQ==} + + '@starknet-io/types-js@0.9.2': + resolution: {integrity: sha512-vWOc0FVSn+RmabozIEWcEny1I73nDGTvOrLYJsR1x7LGA3AZmqt4i/aW69o/3i2NN5CVP8Ok6G1ayRQJKye3Wg==} + + '@suchipi/femver@1.0.0': + resolution: {integrity: sha512-bprE8+K5V+DPX7q2e2K57ImqNBdfGHDIWaGI5xHxZoxbKOuQZn4wzPiUxOAHnsUr3w3xHrWXwN7gnG/iIuEMIg==} + + '@swc/core-darwin-arm64@1.15.10': + resolution: {integrity: sha512-U72pGqmJYbjrLhMndIemZ7u9Q9owcJczGxwtfJlz/WwMaGYAV/g4nkGiUVk/+QSX8sFCAjanovcU1IUsP2YulA==} + engines: {node: '>=10'} + cpu: [arm64] + os: [darwin] + + '@swc/core-darwin-x64@1.15.10': + resolution: {integrity: sha512-NZpDXtwHH083L40xdyj1sY31MIwLgOxKfZEAGCI8xHXdHa+GWvEiVdGiu4qhkJctoHFzAEc7ZX3GN5phuJcPuQ==} + engines: {node: '>=10'} + cpu: [x64] + os: [darwin] + + '@swc/core-linux-arm-gnueabihf@1.15.10': + resolution: {integrity: sha512-ioieF5iuRziUF1HkH1gg1r93e055dAdeBAPGAk40VjqpL5/igPJ/WxFHGvc6WMLhUubSJI4S0AiZAAhEAp1jDg==} + engines: {node: '>=10'} + cpu: [arm] + os: [linux] + + '@swc/core-linux-arm64-gnu@1.15.10': + resolution: {integrity: sha512-tD6BClOrxSsNus9cJL7Gxdv7z7Y2hlyvZd9l0NQz+YXzmTWqnfzLpg16ovEI7gknH2AgDBB5ywOsqu8hUgSeEQ==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + + '@swc/core-linux-arm64-musl@1.15.10': + resolution: {integrity: sha512-4uAHO3nbfbrTcmO/9YcVweTQdx5fN3l7ewwl5AEK4yoC4wXmoBTEPHAVdKNe4r9+xrTgd4BgyPsy0409OjjlMw==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + + '@swc/core-linux-x64-gnu@1.15.10': + resolution: {integrity: sha512-W0h9ONNw1pVIA0cN7wtboOSTl4Jk3tHq+w2cMPQudu9/+3xoCxpFb9ZdehwCAk29IsvdWzGzY6P7dDVTyFwoqg==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + + '@swc/core-linux-x64-musl@1.15.10': + resolution: {integrity: sha512-XQNZlLZB62S8nAbw7pqoqwy91Ldy2RpaMRqdRN3T+tAg6Xg6FywXRKCsLh6IQOadr4p1+lGnqM/Wn35z5a/0Vw==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + + '@swc/core-win32-arm64-msvc@1.15.10': + resolution: {integrity: sha512-qnAGrRv5Nj/DATxAmCnJQRXXQqnJwR0trxLndhoHoxGci9MuguNIjWahS0gw8YZFjgTinbTxOwzatkoySihnmw==} + engines: {node: '>=10'} + cpu: [arm64] + os: [win32] + + '@swc/core-win32-ia32-msvc@1.15.10': + resolution: {integrity: sha512-i4X/q8QSvzVlaRtv1xfnfl+hVKpCfiJ+9th484rh937fiEZKxZGf51C+uO0lfKDP1FfnT6C1yBYwHy7FLBVXFw==} + engines: {node: '>=10'} + cpu: [ia32] + os: [win32] + + '@swc/core-win32-x64-msvc@1.15.10': + resolution: {integrity: sha512-HvY8XUFuoTXn6lSccDLYFlXv1SU/PzYi4PyUqGT++WfTnbw/68N/7BdUZqglGRwiSqr0qhYt/EhmBpULj0J9rA==} + engines: {node: '>=10'} + cpu: [x64] + os: [win32] + + '@swc/core@1.15.10': + resolution: {integrity: sha512-udNofxftduMUEv7nqahl2nvodCiCDQ4Ge0ebzsEm6P8s0RC2tBM0Hqx0nNF5J/6t9uagFJyWIDjXy3IIWMHDJw==} + engines: {node: '>=10'} + peerDependencies: + '@swc/helpers': '>=0.5.17' + peerDependenciesMeta: + '@swc/helpers': + optional: true + + '@swc/counter@0.1.3': + resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + + '@swc/helpers@0.5.18': + resolution: {integrity: sha512-TXTnIcNJQEKwThMMqBXsZ4VGAza6bvN4pa41Rkqoio6QBKMvo+5lexeTMScGCIxtzgQJzElcvIltani+adC5PQ==} + + '@swc/jest@0.2.39': + resolution: {integrity: sha512-eyokjOwYd0Q8RnMHri+8/FS1HIrIUKK/sRrFp8c1dThUOfNeCWbLmBP1P5VsKdvmkd25JaH+OKYwEYiAYg9YAA==} + engines: {npm: '>= 7.0.0'} + peerDependencies: + '@swc/core': '*' + + '@swc/types@0.1.25': + resolution: {integrity: sha512-iAoY/qRhNH8a/hBvm3zKj9qQ4oc2+3w1unPJa2XvTK3XjeLXtzcCingVPw/9e5mn1+0yPqxcBGp9Jf0pkfMb1g==} + + '@szmarczak/http-timer@4.0.6': + resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} + engines: {node: '>=10'} + + '@szmarczak/http-timer@5.0.1': + resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} + engines: {node: '>=14.16'} + + '@ton/core@0.59.1': + resolution: {integrity: sha512-SxFBAvutYJaIllTkv82vbHTJhJI6NxzqUhi499CDEjJEZ9i6i9lHJiK2df4dlLAb/4SiWX6+QUzESkK4DEdnCw==} + peerDependencies: + '@ton/crypto': '>=3.2.0' + + '@ton/crypto-primitives@2.1.0': + resolution: {integrity: sha512-PQesoyPgqyI6vzYtCXw4/ZzevePc4VGcJtFwf08v10OevVJHVfW238KBdpj1kEDQkxWLeuNHEpTECNFKnP6tow==} + + '@ton/crypto@3.3.0': + resolution: {integrity: sha512-/A6CYGgA/H36OZ9BbTaGerKtzWp50rg67ZCH2oIjV1NcrBaCK9Z343M+CxedvM7Haf3f/Ee9EhxyeTp0GKMUpA==} + + '@ton/ton@15.1.0': + resolution: {integrity: sha512-almetcfTu7jLjcNcEEPB7wAc8yl90ES1M//sOr1QE+kv7RbmEvMkaPSc7kFxzs10qrjIPKxlodBJlMSWP5LuVQ==} + peerDependencies: + '@ton/core': '>=0.59.0' + '@ton/crypto': '>=3.2.0' + + '@tronweb3/google-protobuf@3.21.4': + resolution: {integrity: sha512-joxgV4esCdyZ921AprMIG1T7HjkypquhbJ5qJti/priCBJhRE1z9GOxIEMvayxSVSRbMGIoJNE0Knrg3vpwM1w==} + deprecated: This package is deprecated. Please use the official package google-protobuf instead. + + '@trufflesuite/bigint-buffer@1.1.9': + resolution: {integrity: sha512-bdM5cEGCOhDSwminryHJbRmXc1x7dPKg6Pqns3qyTwFlxsqUgxE29lsERS3PlIW1HTjoIGMUqsk1zQQwST1Yxw==} + engines: {node: '>= 10.0.0'} + + '@tsconfig/node10@1.0.12': + resolution: {integrity: sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==} + + '@tsconfig/node12@1.0.11': + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + + '@tsconfig/node14@1.0.3': + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + + '@tsconfig/node16@1.0.4': + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + + '@tybys/wasm-util@0.10.1': + resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + + '@typechain/ethers-v5@10.2.1': + 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' + + '@types/abstract-leveldown@7.2.5': + resolution: {integrity: sha512-/2B0nQF4UdupuxeKTJA2+Rj1D+uDemo6P4kMwKCpbfpnzeVaWSELTsAw4Lxn3VJD6APtRrZOCuYo+4nHUQfTfg==} + + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.27.0': + resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.28.0': + resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} + + '@types/bn.js@4.11.6': + resolution: {integrity: sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==} + + '@types/bn.js@5.2.0': + resolution: {integrity: sha512-DLbJ1BPqxvQhIGbeu8VbUC1DiAiahHtAYvA0ZEAa4P31F7IaArc8z3C3BRQdWX4mtLQuABG4yzp76ZrS02Ui1Q==} + + '@types/cacheable-request@6.0.3': + resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} + + '@types/chai@4.3.20': + resolution: {integrity: sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==} + + '@types/connect@3.4.38': + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + + '@types/graceful-fs@4.1.9': + resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} + + '@types/http-cache-semantics@4.0.4': + resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} + + '@types/istanbul-lib-coverage@2.0.6': + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + + '@types/istanbul-lib-report@3.0.3': + resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} + + '@types/istanbul-reports@3.0.4': + resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + + '@types/jest@29.5.14': + resolution: {integrity: sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/json5@0.0.29': + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + + '@types/keyv@3.1.4': + resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} + + '@types/level-errors@3.0.2': + resolution: {integrity: sha512-gyZHbcQ2X5hNXf/9KS2qGEmgDe9EN2WDM3rJ5Ele467C0nA1sLhtmv1bZiPMDYfAYCfPWft0uQIaTvXbASSTRA==} + + '@types/levelup@4.3.3': + resolution: {integrity: sha512-K+OTIjJcZHVlZQN1HmU64VtrC0jC3dXWQozuEIR9zVvltIk90zaGPM2AgT+fIkChpzHhFE3YnvFLCbLtzAmexA==} + + '@types/mkdirp@0.5.2': + resolution: {integrity: sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg==} + + '@types/mocha@10.0.10': + resolution: {integrity: sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q==} + + '@types/node-fetch@2.6.13': + resolution: {integrity: sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw==} + + '@types/node@11.11.6': + resolution: {integrity: sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ==} + + '@types/node@12.20.55': + resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} + + '@types/node@18.18.14': + resolution: {integrity: sha512-iSOeNeXYNYNLLOMDSVPvIFojclvMZ/HDY2dU17kUlcsOsSQETbWIslJbYLZgA+ox8g2XQwSHKTkght1a5X26lQ==} + + '@types/pbkdf2@3.1.2': + resolution: {integrity: sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew==} + + '@types/prettier@2.7.3': + resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==} + + '@types/qs@6.14.0': + resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==} + + '@types/responselike@1.0.3': + resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} + + '@types/secp256k1@4.0.7': + resolution: {integrity: sha512-Rcvjl6vARGAKRO6jHeKMatGrvOMGrR/AR11N1x2LqintPCyDZ7NBhrh238Z2VZc7aM7KIwnFpFQ7fnfK4H/9Qw==} + + '@types/semver@7.7.1': + resolution: {integrity: sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==} + + '@types/sinon-chai@3.2.12': + resolution: {integrity: sha512-9y0Gflk3b0+NhQZ/oxGtaAJDvRywCa5sIyaVnounqLvmf93yBF4EgIRspePtkMs3Tr844nCclYMlcCNmLCvjuQ==} + + '@types/sinon@21.0.0': + resolution: {integrity: sha512-+oHKZ0lTI+WVLxx1IbJDNmReQaIsQJjN2e7UUrJHEeByG7bFeKJYsv1E75JxTQ9QKJDp21bAa/0W2Xo4srsDnw==} + + '@types/sinonjs__fake-timers@15.0.1': + resolution: {integrity: sha512-Ko2tjWJq8oozHzHV+reuvS5KYIRAokHnGbDwGh/J64LntgpbuylF74ipEL24HCyRjf9FOlBiBHWBR1RlVKsI1w==} + + '@types/stack-utils@2.0.3': + resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} + + '@types/tinycolor2@1.4.6': + resolution: {integrity: sha512-iEN8J0BoMnsWBqjVbWH/c0G0Hh7O21lpR2/+PrvAVgWdzL7eexIFm4JN/Wn10PTcmNdtS6U67r499mlWMXOxNw==} + + '@types/triple-beam@1.3.5': + resolution: {integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==} + + '@types/uuid@8.3.4': + resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} + + '@types/ws@7.4.7': + resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} + + '@types/ws@8.18.1': + resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} + + '@types/yargs-parser@21.0.3': + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + + '@types/yargs@17.0.35': + resolution: {integrity: sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==} + + '@types/yoga-layout@1.9.2': + resolution: {integrity: sha512-S9q47ByT2pPvD65IvrWp7qppVMpk9WGMbVq9wbWZOHg6tnXSD4vyhao6nOSBwwfDdV2p3Kx9evA9vI+XWTfDvw==} + + '@typescript-eslint/eslint-plugin@7.18.0': + 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 + + '@typescript-eslint/parser@7.18.0': + 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 + + '@typescript-eslint/scope-manager@5.62.0': + resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@typescript-eslint/scope-manager@7.18.0': + resolution: {integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@typescript-eslint/type-utils@7.18.0': + 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 + + '@typescript-eslint/types@5.62.0': + resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@typescript-eslint/types@7.18.0': + resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@typescript-eslint/typescript-estree@5.62.0': + 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 + + '@typescript-eslint/typescript-estree@7.18.0': + resolution: {integrity: sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/utils@5.62.0': + 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 + + '@typescript-eslint/utils@7.18.0': + resolution: {integrity: sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + + '@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} + + '@typescript-eslint/visitor-keys@7.18.0': + resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + + '@unrs/resolver-binding-android-arm-eabi@1.11.1': + resolution: {integrity: sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==} + cpu: [arm] + os: [android] + + '@unrs/resolver-binding-android-arm64@1.11.1': + resolution: {integrity: sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==} + cpu: [arm64] + os: [android] + + '@unrs/resolver-binding-darwin-arm64@1.11.1': + resolution: {integrity: sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==} + cpu: [arm64] + os: [darwin] + + '@unrs/resolver-binding-darwin-x64@1.11.1': + resolution: {integrity: sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==} + cpu: [x64] + os: [darwin] + + '@unrs/resolver-binding-freebsd-x64@1.11.1': + resolution: {integrity: sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==} + cpu: [x64] + os: [freebsd] + + '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1': + resolution: {integrity: sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==} + cpu: [arm] + os: [linux] + + '@unrs/resolver-binding-linux-arm-musleabihf@1.11.1': + resolution: {integrity: sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==} + cpu: [arm] + os: [linux] + + '@unrs/resolver-binding-linux-arm64-gnu@1.11.1': + resolution: {integrity: sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==} + cpu: [arm64] + os: [linux] + + '@unrs/resolver-binding-linux-arm64-musl@1.11.1': + resolution: {integrity: sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==} + cpu: [arm64] + os: [linux] + + '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': + resolution: {integrity: sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==} + cpu: [ppc64] + os: [linux] + + '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': + resolution: {integrity: sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==} + cpu: [riscv64] + os: [linux] + + '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': + resolution: {integrity: sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==} + cpu: [riscv64] + os: [linux] + + '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': + resolution: {integrity: sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==} + cpu: [s390x] + os: [linux] + + '@unrs/resolver-binding-linux-x64-gnu@1.11.1': + resolution: {integrity: sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==} + cpu: [x64] + os: [linux] + + '@unrs/resolver-binding-linux-x64-musl@1.11.1': + resolution: {integrity: sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==} + cpu: [x64] + os: [linux] + + '@unrs/resolver-binding-wasm32-wasi@1.11.1': + resolution: {integrity: sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@unrs/resolver-binding-win32-arm64-msvc@1.11.1': + resolution: {integrity: sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==} + cpu: [arm64] + os: [win32] + + '@unrs/resolver-binding-win32-ia32-msvc@1.11.1': + resolution: {integrity: sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==} + cpu: [ia32] + os: [win32] + + '@unrs/resolver-binding-win32-x64-msvc@1.11.1': + resolution: {integrity: sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==} + cpu: [x64] + os: [win32] + + abi-wan-kanabi@2.2.4: + resolution: {integrity: sha512-0aA81FScmJCPX+8UvkXLki3X1+yPQuWxEkqXBVKltgPAK79J+NB+Lp5DouMXa7L6f+zcRlIA/6XO7BN/q9fnvg==} + hasBin: true + + abitype@1.2.3: + resolution: {integrity: sha512-Ofer5QUnuUdTFsBRwARMoWKOH1ND5ehwYhJ3OJ/BQO+StkwQjHw0XyVh4vDttzHB7QOFhPHa/o413PJ82gU/Tg==} + peerDependencies: + typescript: '>=5.0.4' + zod: ^3.22.0 || ^4.0.0 + peerDependenciesMeta: + typescript: + optional: true + zod: + optional: true + + abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + + abortcontroller-polyfill@1.7.8: + resolution: {integrity: sha512-9f1iZ2uWh92VcrU9Y8x+LdM4DLj75VE0MJB8zuF1iUnroEptStw+DQ8EQPMUdfe5k+PkB1uUfDQfWbhstH8LrQ==} + + 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) + + abstract-leveldown@6.3.0: + resolution: {integrity: sha512-TU5nlYgta8YrBMNpc9FwQzRbiXsj49gsALsXadbGHt9CROPzX5fB0rWDR5mtdpOOKa5XqRFpbj1QroPAoPzVjQ==} + engines: {node: '>=6'} + deprecated: Superseded by abstract-level (https://github.com/Level/community#faq) + + accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn-walk@8.3.4: + resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} + engines: {node: '>=0.4.0'} + + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true + + adm-zip@0.4.16: + resolution: {integrity: sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==} + engines: {node: '>=0.3.0'} + + aes-js@3.0.0: + resolution: {integrity: sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==} + + agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + + agentkeepalive@4.6.0: + resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} + engines: {node: '>= 8.0.0'} + + aggregate-error@3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + + ansi-align@3.0.1: + resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + + ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + + ansi-regex@2.1.1: + resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} + engines: {node: '>=0.10.0'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + + ansicolors@0.3.2: + resolution: {integrity: sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==} + + antlr4@4.13.2: + resolution: {integrity: sha512-QiVbZhyy4xAZ17UPEuG3YTOt8ZaoeOR1CvEAqrEsDBsOqINslaB147i9xqljZqoyf5S+EUlGStaj+t22LT9MOg==} + engines: {node: '>=16'} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + aptos@1.22.1: + resolution: {integrity: sha512-zw8IbCkMOpXdeAxp106W6CLHR8i88QY+z5u912XIlwZ3AngUVKY55b3rG8KP3uKEeLAIcY9FVWzS5ndzV60grg==} + engines: {node: '>=20.0.0'} + deprecated: Please update to the newer '@aptos-labs/ts-sdk'. 'aptos' is deprecated + + arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + array-back@3.1.0: + resolution: {integrity: sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==} + engines: {node: '>=6'} + + array-back@4.0.2: + resolution: {integrity: sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==} + engines: {node: '>=8'} + + array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} + engines: {node: '>= 0.4'} + + array-flatten@1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + + array-includes@3.1.9: + resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} + engines: {node: '>= 0.4'} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + array.prototype.findlastindex@1.2.6: + resolution: {integrity: sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==} + engines: {node: '>= 0.4'} + + array.prototype.flat@1.3.3: + resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} + engines: {node: '>= 0.4'} + + array.prototype.flatmap@1.3.3: + resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} + engines: {node: '>= 0.4'} + + arraybuffer.prototype.slice@1.0.4: + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} + engines: {node: '>= 0.4'} + + asn1@0.2.6: + resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} + + asn1js@3.0.7: + resolution: {integrity: sha512-uLvq6KJu04qoQM6gvBfKFjlh6Gl0vOKQuR5cJMDHQkmwfMOQeN3F3SHCv9SNYSL+CRoHvOGFfllDlVz03GQjvQ==} + engines: {node: '>=12.0.0'} + + assert-plus@1.0.0: + resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} + engines: {node: '>=0.8'} + + assert@2.1.0: + resolution: {integrity: sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==} + + assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + + ast-metadata-inferer@0.8.1: + resolution: {integrity: sha512-ht3Dm6Zr7SXv6t1Ra6gFo0+kLDglHGrEbYihTkcycrbHw7WCcuhBzPlJYHEsIpycaUwzsJHje+vUcxXUX4ztTA==} + + ast-parents@0.0.1: + resolution: {integrity: sha512-XHusKxKz3zoYk1ic8Un640joHbFMhbqneyoZfoKnEGtf2ey9Uh/IdpcQplODdO/kENaMIWsD0nJm4+wX3UNLHA==} + + astral-regex@2.0.0: + resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} + engines: {node: '>=8'} + + async-eventemitter@0.2.4: + resolution: {integrity: sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw==} + + async-function@1.0.0: + resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} + engines: {node: '>= 0.4'} + + async-limiter@1.0.1: + resolution: {integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==} + + async@2.6.4: + resolution: {integrity: sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==} + + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + atomic-sleep@1.0.0: + resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} + engines: {node: '>=8.0.0'} + + auto-bind@4.0.0: + resolution: {integrity: sha512-Hdw8qdNiqdJ8LqT0iK0sVzkFbzg6fhnQqqfWhBDxcHZvU75+B+ayzTy8x+k5Ix0Y92XOhOUlx74ps+bA6BeYMQ==} + engines: {node: '>=8'} + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + aws-sign2@0.7.0: + resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} + + aws4@1.13.2: + resolution: {integrity: sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==} + + axios@0.21.4: + resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} + + axios@1.13.3: + resolution: {integrity: sha512-ERT8kdX7DZjtUm7IitEyV7InTHAF42iJuMArIiDIV5YtPanJkgw4hw5Dyg9fh0mihdWNn1GKaeIWErfe56UQ1g==} + + babel-jest@29.7.0: + resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.8.0 + + babel-plugin-istanbul@6.1.1: + resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} + engines: {node: '>=8'} + + 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} + + babel-preset-current-node-syntax@1.2.0: + resolution: {integrity: sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==} + peerDependencies: + '@babel/core': ^7.0.0 || ^8.0.0-0 + + babel-preset-jest@29.6.3: + 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 + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + base-x@3.0.11: + resolution: {integrity: sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==} + + base-x@4.0.1: + resolution: {integrity: sha512-uAZ8x6r6S3aUM9rbHGVOIsR15U/ZSc82b3ymnCPsT45Gk1DDvhDPdIgB5MrhirZWt+5K0EEPQH985kNqZgNPFw==} + + base-x@5.0.1: + resolution: {integrity: sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + baseline-browser-mapping@2.9.18: + resolution: {integrity: sha512-e23vBV1ZLfjb9apvfPk4rHVu2ry6RIr2Wfs+O324okSidrX7pTAnEJPCh/O5BtRlr7QtZI7ktOP3vsqr7Z5XoA==} + hasBin: true + + bcrypt-pbkdf@1.0.2: + resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} + + bech32@1.1.4: + resolution: {integrity: sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==} + + bech32@2.0.0: + resolution: {integrity: sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==} + + bigint-buffer@1.1.5: + resolution: {integrity: sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA==} + engines: {node: '>= 10.0.0'} + + bignumber.js@9.3.1: + resolution: {integrity: sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + bindings@1.5.0: + resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + + bip32@5.0.0: + resolution: {integrity: sha512-h043yQ9n3iU4WZ8KLRpEECMl3j1yx2DQ1kcPlzWg8VZC0PtukbDiyLDKbe6Jm79mL6Tfg+WFuZMYxnzVyr/Hyw==} + engines: {node: '>=18.0.0'} + + bip39@3.0.4: + resolution: {integrity: sha512-YZKQlb752TrUWqHWj7XAwCSjYEgGAk+/Aas3V7NyjQeZYsztO8JnQUaCWhcnL4T+jL8nvB8typ2jRPzTlgugNw==} + + bip39@3.1.0: + resolution: {integrity: sha512-c9kiwdk45Do5GL0vJMe7tS95VjCii65mYAH7DfWl3uW8AVzXKQVUm64i3hzVybBDMp9r7j9iNxR85+ul8MdN/A==} + + blakejs@1.2.1: + resolution: {integrity: sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==} + + bluebird@3.7.2: + resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} + + bn.js@4.11.6: + resolution: {integrity: sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==} + + bn.js@4.12.2: + resolution: {integrity: sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==} + + bn.js@5.2.2: + resolution: {integrity: sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==} + + body-parser@1.20.4: + resolution: {integrity: sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + borsh@0.7.0: + resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} + + boxen@5.1.2: + resolution: {integrity: sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==} + engines: {node: '>=10'} + + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + brorand@1.1.0: + resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} + + browser-headers@0.4.1: + resolution: {integrity: sha512-CA9hsySZVo9371qEHjHZtYxV2cFtVj5Wj/ZHi8ooEsrtm4vOnl9Y9HmyYWk9q+05d7K3rdoAE0j3MVEFVvtQtg==} + + browser-stdout@1.3.1: + resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} + + browserify-aes@1.2.0: + resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==} + + browserslist@4.28.1: + resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + bs58@4.0.1: + resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} + + bs58@5.0.0: + resolution: {integrity: sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==} + + bs58@6.0.0: + resolution: {integrity: sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==} + + bs58check@2.1.2: + resolution: {integrity: sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==} + + bs58check@4.0.0: + resolution: {integrity: sha512-FsGDOnFg9aVI9erdriULkd/JjEWONV/lQE5aYziB5PoBsXRind56lh8doIZIc9X4HoxT5x4bLjMWN1/NB8Zp5g==} + + bser@2.1.1: + resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + buffer-layout@1.2.2: + resolution: {integrity: sha512-kWSuLN694+KTk8SrYvCqwP2WcgQjoRCiF5b4QDvkkz8EmgD+aWAIceGFKMIAdmF/pH+vpgNV3d3kAKorcdAmWA==} + engines: {node: '>=4.5'} + + buffer-to-arraybuffer@0.0.5: + resolution: {integrity: sha512-3dthu5CYiVB1DEJp61FtApNnNndTckcqe4pFcLdvHtrpG+kcyekCJKg4MRiDcFW7A6AODnXB9U4dwQiCW5kzJQ==} + + buffer-xor@1.0.3: + resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==} + + buffer-xor@2.0.2: + resolution: {integrity: sha512-eHslX0bin3GB+Lx2p7lEYRShRewuNZL3fUl4qlVJGGiwoPGftmt8JQgk2Y9Ji5/01TnVDo33E5b5O3vUB1HdqQ==} + + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + + bufferutil@4.0.5: + resolution: {integrity: sha512-HTm14iMQKK2FjFLRTM5lAVcyaUzOnqbPtesFIvREgXpJHdQm8bWS+GkQgIkfaBYRHuCnea7w8UVNfwiAQhlr9A==} + engines: {node: '>=6.14.2'} + + bufferutil@4.1.0: + resolution: {integrity: sha512-ZMANVnAixE6AWWnPzlW2KpUrxhm9woycYvPOo67jWHyFowASTEd9s+QN1EIMsSDtwhIxN4sWE1jotpuDUIgyIw==} + engines: {node: '>=6.14.2'} + + bufio@1.2.3: + resolution: {integrity: sha512-5Tt66bRzYUSlVZatc0E92uDenreJ+DpTBmSAUwL4VSxJn3e6cUyYwx+PoqML0GRZatgA/VX8ybhxItF8InZgqA==} + engines: {node: '>=8.0.0'} + + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + + cacheable-lookup@5.0.4: + resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} + engines: {node: '>=10.6.0'} + + cacheable-lookup@6.1.0: + resolution: {integrity: sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww==} + engines: {node: '>=10.6.0'} + + cacheable-lookup@7.0.0: + resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==} + engines: {node: '>=14.16'} + + cacheable-request@10.2.14: + resolution: {integrity: sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==} + engines: {node: '>=14.16'} + + cacheable-request@7.0.4: + resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} + engines: {node: '>=8'} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camelcase@3.0.0: + resolution: {integrity: sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==} + engines: {node: '>=0.10.0'} + + camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + caniuse-lite@1.0.30001766: + resolution: {integrity: sha512-4C0lfJ0/YPjJQHagaE9x2Elb69CIqEPZeG0anQt9SIvIoOH4a4uaRl73IavyO+0qZh6MDLH//DrXThEYKHkmYA==} + + cardinal@2.1.1: + resolution: {integrity: sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==} + hasBin: true + + caseless@0.12.0: + resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} + + chai@4.5.0: + resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} + engines: {node: '>=4'} + + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chalk@5.6.2: + resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + char-regex@1.0.2: + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} + engines: {node: '>=10'} + + check-error@1.0.3: + resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + + chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + + ci-info@2.0.0: + resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} + + ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + + 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 + + cipher-base@1.0.7: + resolution: {integrity: sha512-Mz9QMT5fJe7bKI7MH31UilT5cEK5EHHRCccw/YRFsRY47AuNgaV6HY3rscp0/I4Q+tTW/5zoqpSeRRI54TkDWA==} + engines: {node: '>= 0.10'} + + cjs-module-lexer@1.4.3: + resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==} + + class-is@1.1.0: + resolution: {integrity: sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==} + + clean-stack@2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + + cli-boxes@2.2.1: + resolution: {integrity: sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==} + engines: {node: '>=6'} + + cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + + cli-table3@0.6.5: + resolution: {integrity: sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==} + engines: {node: 10.* || >= 12.*} + + cli-truncate@2.1.0: + resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==} + engines: {node: '>=8'} + + cliui@3.2.0: + resolution: {integrity: sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==} + + cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clone-response@1.0.3: + resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} + + co@4.6.0: + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + + code-excerpt@3.0.0: + resolution: {integrity: sha512-VHNTVhd7KsLGOqfX3SyeO8RyYPMp1GJOg194VITk04WMYCv4plV68YWe6TJZxd9MhobjtpMRnVky01gqZsalaw==} + engines: {node: '>=10'} + + code-point-at@1.1.0: + resolution: {integrity: sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==} + engines: {node: '>=0.10.0'} + + collect-v8-coverage@1.0.3: + resolution: {integrity: sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==} + + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-convert@3.1.3: + resolution: {integrity: sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg==} + engines: {node: '>=14.6'} + + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + color-name@2.1.0: + resolution: {integrity: sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==} + engines: {node: '>=12.20'} + + color-string@2.1.4: + resolution: {integrity: sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg==} + engines: {node: '>=18'} + + color@5.0.3: + resolution: {integrity: sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA==} + engines: {node: '>=18'} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + command-exists@1.2.9: + resolution: {integrity: sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==} + + command-line-args@5.2.1: + resolution: {integrity: sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==} + engines: {node: '>=4.0.0'} + + command-line-usage@6.1.3: + resolution: {integrity: sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==} + engines: {node: '>=8.0.0'} + + commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + + commander@12.1.0: + resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} + engines: {node: '>=18'} + + commander@14.0.2: + resolution: {integrity: sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==} + engines: {node: '>=20'} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + concurrently@9.1.2: + resolution: {integrity: sha512-H9MWcoPsYddwbOGM6difjVwVZHl63nwMEwDJG/L7VGtuaJhb12h2caPG2tVPWs7emuYix252iGfqOyrz1GczTQ==} + engines: {node: '>=18'} + hasBin: true + + config-chain@1.1.13: + resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} + + content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + + content-hash@2.5.2: + resolution: {integrity: sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw==} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + convert-to-spaces@1.0.2: + resolution: {integrity: sha512-cj09EBuObp9gZNQCzc7hByQyrs6jVGE+o9kSJmeUoj+GiPiJvi5LYqEH/Hmme4+MTLHM+Ejtq+FChpjjEnsPdQ==} + engines: {node: '>= 4'} + + cookie-signature@1.0.7: + resolution: {integrity: sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==} + + cookie@0.4.2: + resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} + engines: {node: '>= 0.6'} + + cookie@0.7.2: + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} + engines: {node: '>= 0.6'} + + core-js-pure@3.48.0: + resolution: {integrity: sha512-1slJgk89tWC51HQ1AEqG+s2VuwpTRr8ocu4n20QUcH1v9lAN0RXen0Q0AABa/DK1I7RrNWLucplOHMx8hfTGTw==} + + core-util-is@1.0.2: + resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} + + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + cors@2.8.6: + resolution: {integrity: sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==} + engines: {node: '>= 0.10'} + + cosmiconfig@8.3.6: + resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + + crc-32@1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} + engines: {node: '>=0.8'} + hasBin: true + + create-hash@1.2.0: + resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==} + + create-hmac@1.1.7: + resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==} + + create-jest@29.7.0: + resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + + create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + + cross-fetch@3.2.0: + resolution: {integrity: sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==} + + cross-fetch@4.1.0: + resolution: {integrity: sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw==} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + crypto-hash@1.3.0: + resolution: {integrity: sha512-lyAZ0EMyjDkVvz8WOeVnuCPvKVBXcMv1l5SVqO1yC7PzTwrD/pPje/BIRbWhMoPe436U+Y2nD7f5bFx0kt+Sbg==} + engines: {node: '>=8'} + + d@1.0.2: + resolution: {integrity: sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==} + engines: {node: '>=0.12'} + + dashdash@1.14.1: + resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} + engines: {node: '>=0.10'} + + data-view-buffer@1.0.2: + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.2: + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.1: + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} + engines: {node: '>= 0.4'} + + dataloader@2.2.3: + resolution: {integrity: sha512-y2krtASINtPFS1rSDjacrFgn1dcUuoREVabwlOGOe4SdxenREqwjwjElAdwvbGM7kgZz9a3KVicWR7vcz8rnzA==} + + dayjs@1.11.19: + resolution: {integrity: sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==} + + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + + decamelize@4.0.0: + resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} + engines: {node: '>=10'} + + decode-uri-component@0.2.2: + resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} + engines: {node: '>=0.10'} + + decompress-response@3.3.0: + resolution: {integrity: sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==} + engines: {node: '>=4'} + + decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + + dedent@1.7.1: + resolution: {integrity: sha512-9JmrhGZpOlEgOLdQgSm0zxFaYoQon408V1v49aqTWuXENVlnCuY9JBZcXZiCsZQWDjTm5Qf/nIvAy77mXDAjEg==} + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + + deep-eql@4.1.4: + resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} + engines: {node: '>=6'} + + deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + defer-to-connect@2.0.1: + resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} + engines: {node: '>=10'} + + 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) + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + delay@5.0.0: + resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} + engines: {node: '>=10'} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + detect-indent@7.0.2: + resolution: {integrity: sha512-y+8xyqdGLL+6sh0tVeHcfP/QDd8gUgbasolJJpY7NgeQGSZ739bDtSiaiDgtoicy+mtYB81dKLxO9xRhCyIB3A==} + engines: {node: '>=12.20'} + + detect-newline@3.1.0: + resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} + engines: {node: '>=8'} + + detect-newline@4.0.1: + resolution: {integrity: sha512-qE3Veg1YXzGHQhlA6jzebZN2qVf6NX+A7m7qlhCGG30dJixrAQhYOsJjsnBjJkCSmuOPpCk30145fr8FV0bzog==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + diff@4.0.4: + resolution: {integrity: sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==} + engines: {node: '>=0.3.1'} + + diff@5.2.2: + resolution: {integrity: sha512-vtcDfH3TOjP8UekytvnHH1o1P4FcUdt4eQ1Y+Abap1tk/OB2MWQvcwS2ClCd1zuIhc3JKOx6p3kod8Vfys3E+A==} + engines: {node: '>=0.3.1'} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + + dom-walk@0.1.2: + resolution: {integrity: sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==} + + dot-case@3.0.4: + resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + + dotenv@16.6.1: + resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} + engines: {node: '>=12'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + ecc-jsbn@0.1.2: + resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} + + ed25519-hd-key@1.3.0: + resolution: {integrity: sha512-IWwAyiiuJQhgu3L8NaHb68eJxTu2pgCwxIBdgpLJdKpYZM46+AXePSVTr7fkNKaUOfOL4IrjEUaQvyVRIDP7fg==} + + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + electron-to-chromium@1.5.279: + resolution: {integrity: sha512-0bblUU5UNdOt5G7XqGiJtpZMONma6WAfq9vsFmtn9x1+joAObr6x1chfqyxFSDCAFwFhCQDrqeAr6MYdpwJ9Hg==} + + elliptic@6.6.1: + resolution: {integrity: sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==} + + emittery@0.10.0: + resolution: {integrity: sha512-AGvFfs+d0JKCJQ4o01ASQLGPmSCxgfU9RFXvzPvZdjKK8oscynksuJhWrSTSw7j7Ep/sZct5b5ZhYCi8S/t0HQ==} + engines: {node: '>=12'} + + emittery@0.13.1: + resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} + engines: {node: '>=12'} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + enabled@2.0.0: + resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==} + + encode-utf8@1.0.3: + resolution: {integrity: sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==} + + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + + encoding-down@6.3.0: + resolution: {integrity: sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw==} + engines: {node: '>=6'} + deprecated: Superseded by abstract-level (https://github.com/Level/community#faq) + + end-of-stream@1.4.5: + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} + + enquirer@2.4.1: + resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} + engines: {node: '>=8.6'} + + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + + errno@0.1.8: + resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} + hasBin: true + + error-ex@1.3.4: + resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} + + es-abstract@1.24.1: + resolution: {integrity: sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==} + engines: {node: '>= 0.4'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + es-shim-unscopables@1.1.0: + resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} + engines: {node: '>= 0.4'} + + es-to-primitive@1.3.0: + resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} + engines: {node: '>= 0.4'} + + es5-ext@0.10.64: + resolution: {integrity: sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==} + engines: {node: '>=0.10'} + + es6-iterator@2.0.3: + resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==} + + es6-promise@4.2.8: + resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} + + es6-promisify@5.0.0: + resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} + + es6-symbol@3.1.4: + resolution: {integrity: sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==} + engines: {node: '>=0.12'} + + es6-weak-map@2.0.3: + resolution: {integrity: sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==} + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + escape-string-regexp@2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-config-prettier@9.1.2: + resolution: {integrity: sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + + eslint-import-resolver-node@0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + + eslint-import-resolver-typescript@3.10.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 + + eslint-module-utils@2.12.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 + + eslint-plugin-autofix@2.2.0: + resolution: {integrity: sha512-lu8+0r+utyTroROqXIL+a8sUpICi6za22hIzlpb0+x0tQGRnOjhOKU7v8mC/NS/faDoVsw6xW3vUpc+Mcz5NWA==} + engines: {node: '>=18'} + peerDependencies: + eslint: '>=8' + + eslint-plugin-compat@4.2.0: + 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 + + eslint-plugin-import@2.32.0: + 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 + + eslint-plugin-jest-extended@2.0.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 + + eslint-plugin-prettier@5.5.5: + resolution: {integrity: sha512-hscXkbqUZ2sPithAuLm5MXL+Wph+U7wHngPBv9OMWwlP8iaflyxpjTYZkmdgB4/vPIhemRlBEoLrH7UC1n7aUw==} + 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 + + eslint-plugin-unused-imports@3.2.0: + 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 + + eslint-rule-composer@0.3.0: + resolution: {integrity: sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==} + engines: {node: '>=4.0.0'} + + eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + 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} + + 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 + + esniff@2.0.1: + resolution: {integrity: sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==} + engines: {node: '>=0.10'} + + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + esquery@1.7.0: + resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + eth-ens-namehash@2.0.8: + resolution: {integrity: sha512-VWEI1+KJfz4Km//dadyvBBoBeSQ0MHTXPvr8UIXiLW6IanxvAV+DmlZAijZwAyggqGUfwQBeHf7tc9wzc1piSw==} + + eth-lib@0.1.29: + resolution: {integrity: sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ==} + + eth-lib@0.2.8: + resolution: {integrity: sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==} + + ethereum-bloom-filters@1.2.0: + resolution: {integrity: sha512-28hyiE7HVsWubqhpVLVmZXFd4ITeHi+BUu05o9isf0GUpMtzBUi+8/gFrGaGYzvGAJQmJ3JKj77Mk9G98T84rA==} + + ethereum-cryptography@0.1.3: + resolution: {integrity: sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==} + + ethereum-cryptography@1.2.0: + resolution: {integrity: sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==} + + ethereum-cryptography@2.2.1: + resolution: {integrity: sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==} + + ethereum-waffle@4.0.10: + resolution: {integrity: sha512-iw9z1otq7qNkGDNcMoeNeLIATF9yKl1M8AIeu42ElfNBplq0e+5PeasQmm8ybY/elkZ1XyRO0JBQxQdVRb8bqQ==} + engines: {node: '>=10.0'} + hasBin: true + peerDependencies: + ethers: ^5.7.2 + + ethereumjs-abi@0.6.8: + resolution: {integrity: sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==} + deprecated: This library has been deprecated and usage is discouraged. + + ethereumjs-util@6.2.1: + resolution: {integrity: sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==} + + ethereumjs-util@7.1.3: + resolution: {integrity: sha512-y+82tEbyASO0K0X1/SRhbJJoAlfcvq8JbrG4a5cjrOks7HS/36efU/0j2flxCPOUM++HFahk33kr/ZxyC4vNuw==} + engines: {node: '>=10.0.0'} + + ethereumjs-util@7.1.5: + resolution: {integrity: sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==} + engines: {node: '>=10.0.0'} + + ethers@5.8.0: + resolution: {integrity: sha512-DUq+7fHrCg1aPDFCHx6UIPb3nmt2XMpM7Y/g2gLhsl3lIBqeAfOJIl1qEvRf2uq3BiKxmh6Fh5pfp2ieyek7Kg==} + + ethjs-unit@0.1.6: + resolution: {integrity: sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==} + engines: {node: '>=6.5.0', npm: '>=3'} + + ethjs-util@0.1.6: + resolution: {integrity: sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==} + engines: {node: '>=6.5.0', npm: '>=3'} + + event-emitter@0.3.5: + resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==} + + event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + + eventemitter3@3.1.2: + resolution: {integrity: sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==} + + eventemitter3@4.0.4: + resolution: {integrity: sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==} + + eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + + eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + + eventemitter3@5.0.4: + resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} + + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + evp_bytestokey@1.0.3: + resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} + + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + + exit@0.1.2: + resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} + engines: {node: '>= 0.8.0'} + + expect@29.7.0: + resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + exponential-backoff@3.1.3: + resolution: {integrity: sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==} + + express@4.22.1: + resolution: {integrity: sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==} + engines: {node: '>= 0.10.0'} + + ext@1.7.0: + resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + extsprintf@1.3.0: + resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} + engines: {'0': node >=0.6.0} + + eyes@0.1.8: + resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} + engines: {node: '> 0.1.90'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fast-redact@3.5.0: + resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==} + engines: {node: '>=6'} + + fast-stable-stringify@1.0.0: + resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} + + fast-uri@3.1.0: + resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} + + fastestsmallesttextencoderdecoder@1.0.22: + resolution: {integrity: sha512-Pb8d48e+oIuY4MaM64Cd7OW1gt4nxCHs7/ddPPZ/Ic3sg8yVGM7O9wDvZ7us6ScaUupzM+pfBolwtYhN1IxBIw==} + + fastq@1.20.1: + resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} + + fb-watchman@2.0.2: + resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + fecha@4.2.3: + resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} + + file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + + file-uri-to-path@1.0.0: + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + finalhandler@1.3.2: + resolution: {integrity: sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==} + engines: {node: '>= 0.8'} + + find-replace@3.0.0: + resolution: {integrity: sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==} + engines: {node: '>=4.0.0'} + + find-up@1.1.2: + resolution: {integrity: sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==} + engines: {node: '>=0.10.0'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + + flat@5.0.2: + resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} + hasBin: true + + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + + fmix@0.1.0: + resolution: {integrity: sha512-Y6hyofImk9JdzU8k5INtTXX1cu8LDlePWDFU5sftm9H+zKCr5SGrVjdhkvsim646cw5zD0nADj8oHyXMZmCZ9w==} + + fn.name@1.1.0: + resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} + + follow-redirects@1.15.11: + resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} + + forever-agent@0.6.1: + resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} + + form-data-encoder@1.7.1: + resolution: {integrity: sha512-EFRDrsMm/kyqbTQocNvRXMLjc7Es2Vk+IQFx/YW7hkUH1eBl4J1fqiP34l74Yt0pFLCNpc06fkbVk00008mzjg==} + + form-data-encoder@2.1.4: + resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==} + engines: {node: '>= 14.17'} + + form-data@2.3.3: + resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} + engines: {node: '>= 0.12'} + + form-data@4.0.5: + resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} + engines: {node: '>= 6'} + + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + fp-ts@1.19.3: + resolution: {integrity: sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==} + + fp-ts@2.16.11: + resolution: {integrity: sha512-LaI+KaX2NFkfn1ZGHoKCmcfv7yrZsC3b8NtWsTVQeHkq4F27vI5igUuO53sxqDEa2gNQMHFPmpojDw/1zmUK7w==} + + fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + + fs-extra@0.30.0: + resolution: {integrity: sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==} + + fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + + fs-extra@4.0.3: + resolution: {integrity: sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==} + + fs-extra@7.0.1: + resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} + engines: {node: '>=6 <7 || >=8'} + + fs-minipass@1.2.7: + resolution: {integrity: sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + function.prototype.name@1.1.8: + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} + engines: {node: '>= 0.4'} + + functional-red-black-tree@1.0.1: + resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + ganache@7.4.3: + resolution: {integrity: sha512-RpEDUiCkqbouyE7+NMXG26ynZ+7sGiODU84Kz+FVoXUnQ4qQM4M8wif3Y4qUCt+D/eM1RVeGq0my62FPD6Y1KA==} + hasBin: 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'} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-caller-file@1.0.3: + resolution: {integrity: sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-package-type@0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + get-symbol-description@1.1.0: + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} + engines: {node: '>= 0.4'} + + get-tsconfig@4.13.0: + resolution: {integrity: sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==} + + getpass@0.1.7: + resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} + + git-hooks-list@4.2.1: + resolution: {integrity: sha512-WNvqJjOxxs/8ZP9+DWdwWJ7cDsd60NHf39XnD82pDVrKO5q7xfPqpkK6hwEAmBa/ZSEE4IOoR75EzbbIuwGlMw==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@7.1.7: + resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} + deprecated: Glob versions prior to v9 are no longer supported + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + glob@8.1.0: + resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} + engines: {node: '>=12'} + deprecated: Glob versions prior to v9 are no longer supported + + global@4.4.0: + resolution: {integrity: sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==} + + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + google-protobuf@3.21.4: + resolution: {integrity: sha512-MnG7N936zcKTco4Jd2PX2U96Kf9PxygAPKBug+74LHzmHXmceN16MmRcdgZv+DGef/S9YvQAfRsNCn4cjf9yyQ==} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + got@11.8.6: + resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} + engines: {node: '>=10.19.0'} + + got@12.1.0: + resolution: {integrity: sha512-hBv2ty9QN2RdbJJMK3hesmSkFTjVIHyIDDbssCKnSmq62edGgImJWD10Eb1k77TiV1bxloxqcFAVK8+9pkhOig==} + engines: {node: '>=14.16'} + + got@12.6.1: + resolution: {integrity: sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==} + engines: {node: '>=14.16'} + + gql.tada@1.9.0: + resolution: {integrity: sha512-1LMiA46dRs5oF7Qev6vMU32gmiNvM3+3nHoQZA9K9j2xQzH8xOAWnnJrLSbZOFHTSdFxqn86TL6beo1/7ja/aA==} + hasBin: true + peerDependencies: + typescript: ^5.0.0 + + graceful-fs@4.2.10: + resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + gradient-string@1.2.0: + resolution: {integrity: sha512-Lxog7IDMMWNjwo4O0KbdBvSewk4vW6kQe5XaLuuPCyCE65AGQ1P8YqKJa5dq8TYf/Ge31F+KjWzPR5mAJvjlAg==} + engines: {node: '>=4'} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + graphql@16.12.0: + resolution: {integrity: sha512-DKKrynuQRne0PNpEbzuEdHlYOMksHSUI8Zc9Unei5gTsMNA2/vMpoMz/yKba50pejK56qj98qM0SjYxAKi13gQ==} + engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} + + har-schema@2.0.0: + resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==} + engines: {node: '>=4'} + + har-validator@5.1.5: + resolution: {integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==} + engines: {node: '>=6'} + deprecated: this library is no longer supported + + hardhat-contract-sizer@2.10.1: + resolution: {integrity: sha512-/PPQQbUMgW6ERzk8M0/DA8/v2TEM9xRRAnF9qKPNMYF6FX5DFWcnxBsQvtp8uBz+vy7rmLyV9Elti2wmmhgkbg==} + peerDependencies: + hardhat: ^2.0.0 + + hardhat-deploy-ethers@0.4.2: + resolution: {integrity: sha512-AskNH/XRYYYqPT94MvO5s1yMi+/QvoNjS4oU5VcVqfDU99kgpGETl+uIYHIrSXtH5sy7J6gyVjpRMf4x0tjLSQ==} + peerDependencies: + '@nomicfoundation/hardhat-ethers': ^3.0.2 + hardhat: ^2.16.0 + hardhat-deploy: ^0.12.1 + + hardhat-deploy@0.12.4: + resolution: {integrity: sha512-bYO8DIyeGxZWlhnMoCBon9HNZb6ji0jQn7ngP1t5UmGhC8rQYhji7B73qETMOFhzt5ECZPr+U52duj3nubsqdQ==} + + hardhat@2.28.3: + resolution: {integrity: sha512-f1WxpCJCXzxDc12MgIIxxkvB2QK40g/atsW4Az5WQFhUXpZx4VFoSfvwYBIRsRbq6xIrgxef+tXuWda5wTLlgA==} + hasBin: true + peerDependencies: + ts-node: '*' + typescript: '*' + peerDependenciesMeta: + ts-node: + optional: true + typescript: + optional: true + + has-bigints@1.1.0: + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} + + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.2.0: + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} + engines: {node: '>= 0.4'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hash-base@3.1.2: + resolution: {integrity: sha512-Bb33KbowVTIj5s7Ked1OsqHUeCpz//tPwR+E2zJgJKo9Z5XolZ9b6bdUgjmYlwnWhoOQKoTd1TYToZGn5mAYOg==} + engines: {node: '>= 0.8'} + + hash.js@1.1.7: + resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + hmac-drbg@1.0.1: + resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} + + hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + + html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + + http-cache-semantics@4.2.0: + resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} + + http-errors@2.0.1: + resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} + engines: {node: '>= 0.8'} + + http-https@1.0.0: + resolution: {integrity: sha512-o0PWwVCSp3O0wS6FvNr6xfBCHgt0m1tvPLFOCc2iFDKTRAXhB7m8klDf7ErowFH8POa6dVdGatKU5I1YYwzUyg==} + + http-signature@1.2.0: + resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==} + engines: {node: '>=0.8', npm: '>=1.3.7'} + + http2-wrapper@1.0.3: + resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} + engines: {node: '>=10.19.0'} + + http2-wrapper@2.2.1: + resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==} + engines: {node: '>=10.19.0'} + + https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + + humanize-ms@1.2.1: + resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + idna-uts46-hx@2.3.1: + resolution: {integrity: sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA==} + engines: {node: '>=4.0.0'} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + immediate@3.2.3: + resolution: {integrity: sha512-RrGCXRm/fRVqMIhqXrGEX9rRADavPiDFSoMb/k64i9XMk8uH4r/Omi5Ctierj6XzNecwDbO4WuFbDD1zmpl3Tg==} + + immediate@3.3.0: + resolution: {integrity: sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==} + + immutable@4.3.7: + resolution: {integrity: sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==} + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + import-local@3.2.0: + resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} + engines: {node: '>=8'} + hasBin: true + + imul@1.0.1: + resolution: {integrity: sha512-WFAgfwPLAjU66EKt6vRdTlKj4nAgIDQzh29JonLa4Bqtl6D8JrIMvWjCnx7xEjVNmP3U0fM5o8ZObk7d0f62bA==} + engines: {node: '>=0.10.0'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + + 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. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + injectpromise@1.0.0: + resolution: {integrity: sha512-qNq5wy4qX4uWHcVFOEU+RqZkoVG65FhvGkyDWbuBxILMjK6A1LFf5A1mgXZkD4nRx5FCorD81X/XvPKp/zVfPA==} + + ink-gradient@2.0.0: + resolution: {integrity: sha512-d2BK/EzzBRoDL54NWkS3JGE4J8xtzwRVWxDAIkQ/eQ60XIzrFMtT5JlUqgV05Qlt32Jvk50qW51YqxGJggTuqA==} + engines: {node: '>=10'} + peerDependencies: + ink: '>=3.0.0' + react: '>=16.8.0' + + ink-table@3.1.0: + resolution: {integrity: sha512-qxVb4DIaEaJryvF9uZGydnmP9Hkmas3DCKVpEcBYC0E4eJd3qNgNe+PZKuzgCERFe9LfAS1TNWxCr9+AU4v3YA==} + peerDependencies: + ink: '>=3.0.0' + react: '>=16.8.0' + + ink@3.2.0: + resolution: {integrity: sha512-firNp1q3xxTzoItj/eOOSZQnYSlyrWks5llCTVX37nJ59K3eXbQ8PtzCguqo8YI19EELo5QxaKnJd4VxzhU8tg==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '>=16.8.0' + react: '>=16.8.0' + peerDependenciesMeta: + '@types/react': + optional: true + + internal-slot@1.1.0: + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} + engines: {node: '>= 0.4'} + + invert-kv@1.0.0: + resolution: {integrity: sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==} + engines: {node: '>=0.10.0'} + + io-ts@1.10.4: + resolution: {integrity: sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==} + + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + + is-arguments@1.2.0: + resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==} + engines: {node: '>= 0.4'} + + is-array-buffer@3.0.5: + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} + engines: {node: '>= 0.4'} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-async-function@2.1.1: + resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} + engines: {node: '>= 0.4'} + + is-bigint@1.1.0: + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-boolean-object@1.2.2: + resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} + engines: {node: '>= 0.4'} + + is-bun-module@2.0.0: + resolution: {integrity: sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-ci@2.0.0: + resolution: {integrity: sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==} + hasBin: true + + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + + is-data-view@1.0.2: + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} + engines: {node: '>= 0.4'} + + is-date-object@1.1.0: + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} + engines: {node: '>= 0.4'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-finalizationregistry@1.1.1: + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} + engines: {node: '>= 0.4'} + + is-fullwidth-code-point@1.0.0: + resolution: {integrity: sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-function@1.0.2: + resolution: {integrity: sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==} + + is-generator-fn@2.1.0: + resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} + engines: {node: '>=6'} + + is-generator-function@1.1.2: + resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} + engines: {node: '>= 0.4'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-hex-prefixed@1.0.0: + resolution: {integrity: sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==} + engines: {node: '>=6.5.0', npm: '>=3'} + + is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + + is-nan@1.3.2: + resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} + engines: {node: '>= 0.4'} + + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + + is-number-object@1.1.1: + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} + engines: {node: '>= 0.4'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + is-plain-obj@2.1.0: + resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} + engines: {node: '>=8'} + + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + + is-promise@2.2.2: + resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} + + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + + is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + + is-shared-array-buffer@1.0.4: + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} + engines: {node: '>= 0.4'} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-string@1.1.1: + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} + engines: {node: '>= 0.4'} + + is-symbol@1.1.1: + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} + engines: {node: '>= 0.4'} + + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + + is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + + is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + + is-url@1.2.4: + resolution: {integrity: sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==} + + is-utf8@0.2.1: + resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} + + is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + + is-weakref@1.1.1: + resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} + engines: {node: '>= 0.4'} + + is-weakset@2.0.4: + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} + engines: {node: '>= 0.4'} + + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isomorphic-ws@4.0.1: + resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} + peerDependencies: + ws: '*' + + isows@1.0.7: + resolution: {integrity: sha512-I1fSfDCZL5P0v33sVqeTDSpcstAg/N+wF5HS033mogOVIp4B+oHC7oOCsA3axAbBSGTJ8QubbNmnIRN/h8U7hg==} + peerDependencies: + ws: '*' + + isstream@0.1.2: + resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} + + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + + istanbul-lib-instrument@5.2.1: + resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} + engines: {node: '>=8'} + + istanbul-lib-instrument@6.0.3: + resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==} + engines: {node: '>=10'} + + istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + + istanbul-lib-source-maps@4.0.1: + resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} + engines: {node: '>=10'} + + istanbul-reports@3.2.0: + resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} + engines: {node: '>=8'} + + jayson@4.3.0: + resolution: {integrity: sha512-AauzHcUcqs8OBnCHOkJY280VaTiCm57AbuO7lqzcw7JapGj50BisE3xhksye4zlTSR1+1tAz67wLTl8tEH1obQ==} + engines: {node: '>=8'} + hasBin: 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} + + 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} + + jest-cli@29.7.0: + 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 + + jest-config@29.7.0: + 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 + + jest-diff@29.7.0: + resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-docblock@29.7.0: + resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + 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} + + jest-environment-node@29.7.0: + resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-get-type@29.6.3: + resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-haste-map@29.7.0: + resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-leak-detector@29.7.0: + resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + 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} + + 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} + + jest-mock@29.7.0: + resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-pnp-resolver@1.2.3: + resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} + engines: {node: '>=6'} + peerDependencies: + jest-resolve: '*' + peerDependenciesMeta: + jest-resolve: + optional: true + + jest-regex-util@29.6.3: + resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + 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} + + jest-resolve-dependencies@29.7.0: + resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-resolve@29.7.0: + resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-runner@29.7.0: + resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-runtime@29.7.0: + resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-snapshot@29.7.0: + resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-util@29.7.0: + resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-validate@29.7.0: + resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-watcher@29.7.0: + resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-worker@29.7.0: + resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest@29.7.0: + 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 + + js-sha256@0.9.0: + resolution: {integrity: sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA==} + + js-sha3@0.5.7: + resolution: {integrity: sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==} + + js-sha3@0.8.0: + resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@3.14.2: + resolution: {integrity: sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==} + hasBin: true + + js-yaml@4.1.1: + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} + hasBin: true + + jsbn@0.1.1: + resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} + + jscrypto@1.0.3: + resolution: {integrity: sha512-lryZl0flhodv4SZHOqyb1bx5sKcJxj0VBo0Kzb4QMAg3L021IC9uGpl0RCZa+9KJwlRGSK2C80ITcwbe19OKLQ==} + hasBin: true + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-bigint@1.0.0: + resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==} + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-schema@0.4.0: + resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json-stream-stringify@3.1.6: + resolution: {integrity: sha512-x7fpwxOkbhFCaJDJ8vb1fBY3DdSa4AlITaz+HHILQJzdPMnHEFjxPwVUi1ALIbcIxDE0PNe/0i7frnY8QnBQog==} + engines: {node: '>=7.10.1'} + + json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + + json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonc-parser@3.3.1: + resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} + + jsonfile@2.4.0: + resolution: {integrity: sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==} + + jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + + jsonfile@6.2.0: + resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} + + jsprim@1.4.2: + resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==} + engines: {node: '>=0.6.0'} + + jssha@3.2.0: + resolution: {integrity: sha512-QuruyBENDWdN4tZwJbQq7/eAK85FqrI4oDbXjy5IBhYD+2pTJyBUWZe8ctWaCkrV0gy6AaelgOZZBMeswEa/6Q==} + + keccak256@1.0.6: + resolution: {integrity: sha512-8GLiM01PkdJVGUhR1e6M/AvWnSqYS0HaERI+K/QtStGDGlSTx2B1zTqZk4Zlqu5TxHJNTxWAdP9Y+WI50OApUw==} + + keccak@3.0.1: + resolution: {integrity: sha512-epq90L9jlFWCW7+pQa6JOnKn2Xgl2mtI664seYR6MHskvI9agt7AnDqmAlp9TqU4/caMYbA08Hi5DMZAl5zdkA==} + engines: {node: '>=10.0.0'} + + keccak@3.0.4: + resolution: {integrity: sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==} + engines: {node: '>=10.0.0'} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + klaw@1.3.1: + resolution: {integrity: sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==} + + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + + kuler@2.0.0: + resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} + + latest-version@7.0.0: + resolution: {integrity: sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==} + engines: {node: '>=14.16'} + + lcid@1.0.0: + resolution: {integrity: sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==} + engines: {node: '>=0.10.0'} + + 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) + + level-concat-iterator@2.0.1: + resolution: {integrity: sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw==} + engines: {node: '>=6'} + deprecated: Superseded by abstract-level (https://github.com/Level/community#faq) + + 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) + + level-iterator-stream@4.0.2: + resolution: {integrity: sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q==} + engines: {node: '>=6'} + + 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) + + 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) + + level-supports@1.0.1: + resolution: {integrity: sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==} + engines: {node: '>=6'} + + level-ws@2.0.0: + resolution: {integrity: sha512-1iv7VXx0G9ec1isqQZ7y5LmoZo/ewAsyDHNA8EFDW5hqH2Kqovm33nSFkSdnLLAK+I5FlT+lo5Cw9itGe+CpQA==} + engines: {node: '>=6'} + + levelup@4.4.0: + resolution: {integrity: sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ==} + engines: {node: '>=6'} + deprecated: Superseded by abstract-level (https://github.com/Level/community#faq) + + leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + load-json-file@1.1.0: + resolution: {integrity: sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==} + engines: {node: '>=0.10.0'} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.assign@4.2.0: + resolution: {integrity: sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw==} + + lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + + lodash.isequal@4.5.0: + resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + deprecated: This package is deprecated. Use require('node:util').isDeepStrictEqual instead. + + lodash.memoize@4.1.2: + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash.truncate@4.4.2: + resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} + + lodash@4.17.23: + resolution: {integrity: sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==} + + log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + + logform@2.7.0: + resolution: {integrity: sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==} + engines: {node: '>= 12.0.0'} + + long@5.3.2: + resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + lossless-json@4.3.0: + resolution: {integrity: sha512-ToxOC+SsduRmdSuoLZLYAr5zy1Qu7l5XhmPWM3zefCZ5IcrzW/h108qbJUKfOlDlhvhjUK84+8PSVX0kxnit0g==} + + loupe@2.3.7: + resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + + lower-case@2.0.2: + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + + lowercase-keys@2.0.0: + resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} + engines: {node: '>=8'} + + lowercase-keys@3.0.0: + resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + lru-queue@0.1.0: + resolution: {integrity: sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==} + + lru_map@0.3.3: + resolution: {integrity: sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==} + + ltgt@2.2.1: + resolution: {integrity: sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA==} + + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + + make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + + makeerror@1.0.12: + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + + map-age-cleaner@0.1.3: + resolution: {integrity: sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==} + engines: {node: '>=6'} + + match-all@1.2.7: + resolution: {integrity: sha512-qSpsBKarh55r9KyXzFC3xBLRf2GlGasba2em9kbpRsSlGvdTAqjx3QD0r3FKSARiW+OE4iMHYsolM3aX9n5djw==} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + mcl-wasm@0.7.9: + resolution: {integrity: sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ==} + engines: {node: '>=8.9.0'} + + md5.js@1.3.5: + resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} + + media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + + memdown@5.1.0: + resolution: {integrity: sha512-B3J+UizMRAlEArDjWHTMmadet+UKwHd3UjMgGBkZcKAxAYVPS9o0Yeiha4qvz7iGiL2Sb3igUft6p7nbFWctpw==} + engines: {node: '>=6'} + deprecated: Superseded by memory-level (https://github.com/Level/community#faq) + + memoizee@0.4.17: + resolution: {integrity: sha512-DGqD7Hjpi/1or4F/aYAspXKNm5Yili0QDAFAY4QYvpqpgiY6+1jOfqpmByzjxbWd/T9mChbCArXAbDAsTm5oXA==} + engines: {node: '>=0.12'} + + memorystream@0.3.1: + resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} + engines: {node: '>= 0.10.0'} + + merge-descriptors@1.0.3: + resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + merkle-patricia-tree@4.2.4: + resolution: {integrity: sha512-eHbf/BG6eGNsqqfbLED9rIqbsF4+sykEaBn6OLNs71tjclbMcMOk1tEPmJKcNcNCLkvbpY/lwyOlizWsqPNo8w==} + + methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + + micro-eth-signer@0.14.0: + resolution: {integrity: sha512-5PLLzHiVYPWClEvZIXXFu5yutzpadb73rnQCpUqIHu3No3coFuWQNfE5tkBQJ7djuLYl6aRLaS0MgWJYGoqiBw==} + + micro-ftch@0.3.1: + resolution: {integrity: sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==} + + micro-memoize@4.1.3: + resolution: {integrity: sha512-DzRMi8smUZXT7rCGikRwldEh6eO6qzKiPPopcr1+2EY3AYKpy5fu159PKWwIS9A6IWnrvPKDMcuFtyrroZa8Bw==} + + micro-packed@0.7.3: + resolution: {integrity: sha512-2Milxs+WNC00TRlem41oRswvw31146GiSaoCT7s3Xi2gMUglW5QBeqlQaZeHr5tJx9nm3i57LNXPqxOOaWtTYg==} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + miller-rabin@4.0.1: + resolution: {integrity: sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==} + hasBin: true + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + mimic-fn@3.1.0: + resolution: {integrity: sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==} + engines: {node: '>=8'} + + mimic-response@1.0.1: + resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} + engines: {node: '>=4'} + + mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + + 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} + + min-document@2.19.2: + resolution: {integrity: sha512-8S5I8db/uZN8r9HSLFVWPdJCvYOejMcEC82VIzNUc6Zkklf/d1gg2psfE79/vyhWOj4+J8MtwmoOz3TmvaGu5A==} + + minimalistic-assert@1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + + minimalistic-crypto-utils@1.0.1: + resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@2.9.0: + resolution: {integrity: sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==} + + minizlib@1.3.3: + resolution: {integrity: sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==} + + 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. + + mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + + mkdirp@3.0.1: + resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} + engines: {node: '>=10'} + hasBin: true + + mnemonist@0.38.5: + resolution: {integrity: sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==} + + mocha@10.8.2: + resolution: {integrity: sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg==} + engines: {node: '>= 14.0.0'} + hasBin: true + + mock-fs@4.14.0: + resolution: {integrity: sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw==} + + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + multibase@0.6.1: + resolution: {integrity: sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw==} + deprecated: This module has been superseded by the multiformats module + + multibase@0.7.0: + resolution: {integrity: sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg==} + deprecated: This module has been superseded by the multiformats module + + multicodec@0.5.7: + resolution: {integrity: sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA==} + deprecated: This module has been superseded by the multiformats module + + multicodec@1.0.4: + resolution: {integrity: sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg==} + deprecated: This module has been superseded by the multiformats module + + multihashes@0.4.21: + resolution: {integrity: sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw==} + + murmur-128@0.2.1: + resolution: {integrity: sha512-WseEgiRkI6aMFBbj8Cg9yBj/y+OdipwVC7zUo3W2W1JAJITwouUOtpqsmGSg67EQmwwSyod7hsVsWY5LsrfQVg==} + + nano-json-stream-parser@0.1.2: + resolution: {integrity: sha512-9MqxMH/BSJC7dnLsEMPyfN5Dvoo49IsPFYMcHw3Bcfc2kN0lpHRBSzlMSVx4HGyJ7s9B31CyBTVehWJoQ8Ctew==} + + napi-postinstall@0.3.4: + resolution: {integrity: sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + + next-tick@1.1.0: + resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} + + no-case@3.0.4: + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + + node-addon-api@2.0.2: + resolution: {integrity: sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==} + + node-addon-api@5.1.0: + resolution: {integrity: sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==} + + 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 + + node-gyp-build@4.3.0: + resolution: {integrity: sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q==} + hasBin: true + + node-gyp-build@4.8.4: + resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} + hasBin: true + + node-int64@0.4.0: + resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + + node-releases@2.0.27: + resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} + + normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + normalize-url@6.1.0: + resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} + engines: {node: '>=10'} + + normalize-url@8.1.1: + resolution: {integrity: sha512-JYc0DPlpGWB40kH5g07gGTrYuMqV653k3uBKY6uITPWds3M0ov3GaWGp9lbE3Bzngx8+XkfzgvASb9vk9JDFXQ==} + engines: {node: '>=14.16'} + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + + number-is-nan@1.0.1: + resolution: {integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==} + engines: {node: '>=0.10.0'} + + number-to-bn@1.7.0: + resolution: {integrity: sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==} + engines: {node: '>=6.5.0', npm: '>=3'} + + oauth-sign@0.9.0: + resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-hash@2.2.0: + resolution: {integrity: sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==} + engines: {node: '>= 6'} + + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + object-is@1.1.6: + resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} + + object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} + engines: {node: '>= 0.4'} + + object.groupby@1.0.3: + resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} + engines: {node: '>= 0.4'} + + object.values@1.2.1: + resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} + engines: {node: '>= 0.4'} + + obliterator@2.0.5: + resolution: {integrity: sha512-42CPE9AhahZRsMNslczq0ctAEtqk8Eka26QofnqC346BZdHDySk3LWka23LI7ULIw11NmltpiLagIq8gBozxTw==} + + oboe@2.1.5: + resolution: {integrity: sha512-zRFWiF+FoicxEs3jNI/WYUrVEgA7DeET/InK0XQuudGHRg8iIob3cNPrJTKaz4004uaA9Pbe+Dwa8iluhjLZWA==} + + on-exit-leak-free@2.1.2: + resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} + engines: {node: '>=14.0.0'} + + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + one-time@1.0.0: + resolution: {integrity: sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + os-locale@1.4.0: + resolution: {integrity: sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==} + engines: {node: '>=0.10.0'} + + os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + + own-keys@1.0.1: + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + engines: {node: '>= 0.4'} + + ox@0.11.3: + resolution: {integrity: sha512-1bWYGk/xZel3xro3l8WGg6eq4YEKlaqvyMtVhfMFpbJzK2F6rj4EDRtqDCWVEJMkzcmEi9uW2QxsqELokOlarw==} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + p-cancelable@2.1.1: + resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} + engines: {node: '>=8'} + + p-cancelable@3.0.0: + resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==} + engines: {node: '>=12.20'} + + p-defer@1.0.0: + resolution: {integrity: sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==} + engines: {node: '>=4'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-map@4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} + + p-memoize@4.0.4: + resolution: {integrity: sha512-ijdh0DP4Mk6J4FXlOM6vPPoCjPytcEseW8p/k5SDTSSfGV3E9bpt9Yzfifvzp6iohIieoLTkXRb32OWV0fB2Lw==} + engines: {node: '>=10'} + + p-reflect@2.1.0: + resolution: {integrity: sha512-paHV8NUz8zDHu5lhr/ngGWQiW067DK/+IbJ+RfZ4k+s8y4EKyYCz8pGYWjxCg35eHztpJAt+NUgvN4L+GCbPlg==} + engines: {node: '>=8'} + + p-settle@4.1.1: + resolution: {integrity: sha512-6THGh13mt3gypcNMm0ADqVNCcYa3BK6DWsuJWFCuEKP1rpY+OKGp7gaZwVmLspmic01+fsg/fN57MfvDzZ/PuQ==} + engines: {node: '>=10'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + package-json@8.1.1: + resolution: {integrity: sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==} + engines: {node: '>=14.16'} + + pako@2.1.0: + resolution: {integrity: sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-headers@2.0.6: + resolution: {integrity: sha512-Tz11t3uKztEW5FEVZnj1ox8GKblWn+PvHY9TmJV5Mll2uHEwRdR/5Li1OlXoECjLYkApdhWy44ocONwXLiKO5A==} + + parse-json@2.2.0: + resolution: {integrity: sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==} + engines: {node: '>=0.10.0'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + patch-console@1.0.0: + resolution: {integrity: sha512-nxl9nrnLQmh64iTzMfyylSlRozL7kAXIaxw1fVcLYdyhNkJCRUzirRZTikXGJsg+hc4fqpneTK6iU2H1Q8THSA==} + engines: {node: '>=10'} + + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + + path-exists@2.1.0: + resolution: {integrity: sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==} + engines: {node: '>=0.10.0'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-to-regexp@0.1.12: + resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} + + path-type@1.1.0: + resolution: {integrity: sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==} + engines: {node: '>=0.10.0'} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + + pbkdf2@3.1.5: + resolution: {integrity: sha512-Q3CG/cYvCO1ye4QKkuH7EXxs3VC/rI1/trd+qX2+PolbaKG0H+bgcZzrTt96mMyRtejk+JMCiLUn3y29W8qmFQ==} + engines: {node: '>= 0.10'} + + performance-now@2.1.0: + resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} + + picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + + pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + + pinkie-promise@2.0.1: + resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} + engines: {node: '>=0.10.0'} + + pinkie@2.0.4: + resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} + engines: {node: '>=0.10.0'} + + pino-abstract-transport@1.2.0: + resolution: {integrity: sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q==} + + pino-std-serializers@6.2.2: + resolution: {integrity: sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==} + + pino@8.21.0: + resolution: {integrity: sha512-ip4qdzjkAyDDZklUaZkcRFb2iA118H9SgRh8yzTkSQK8HilsOJF7rSY8HoW5+I0M46AZgX/pxbprf2vvzQCE0Q==} + hasBin: true + + pirates@4.0.7: + resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} + engines: {node: '>= 6'} + + pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + + pluralize@8.0.0: + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} + engines: {node: '>=4'} + + poseidon-lite@0.2.1: + resolution: {integrity: sha512-xIr+G6HeYfOhCuswdqcFpSX47SPhm0EpisWJ6h7fHlWwaVIvH3dLnejpatrtw6Xc6HaLrpq05y7VRfvDmDGIog==} + + possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} + engines: {node: '>= 0.4'} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier-linter-helpers@1.0.1: + resolution: {integrity: sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg==} + engines: {node: '>=6.0.0'} + + prettier-plugin-packagejson@2.5.22: + resolution: {integrity: sha512-G6WalmoUssKF8ZXkni0+n4324K+gG143KPysSQNW+FrR0XyNb3BdRxchGC/Q1FE/F702p7/6KU7r4mv0WSWbzA==} + peerDependencies: + prettier: '>= 1.16.0' + peerDependenciesMeta: + prettier: + optional: true + + prettier-plugin-solidity@1.4.3: + resolution: {integrity: sha512-Mrr/iiR9f9IaeGRMZY2ApumXcn/C5Gs3S7B7hWB3gigBFML06C0yEyW86oLp0eqiA0qg+46FaChgLPJCj/pIlg==} + engines: {node: '>=18'} + peerDependencies: + prettier: '>=2.3.0' + + prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + + prettier@3.8.1: + resolution: {integrity: sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==} + engines: {node: '>=14'} + hasBin: 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} + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + process-warning@3.0.0: + resolution: {integrity: sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==} + + process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + + prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + + prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + + proto-list@1.2.4: + resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} + + protobufjs@7.5.4: + resolution: {integrity: sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==} + engines: {node: '>=12.0.0'} + + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + prr@1.0.1: + resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} + + psl@1.15.0: + resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==} + + pump@3.0.3: + resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==} + + punycode@1.4.1: + resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} + + punycode@2.1.0: + resolution: {integrity: sha512-Yxz2kRwT90aPiWEMHVYnEf4+rhwF1tBmmZ4KepCP+Wkium9JxtWnUm1nqGwpiAHr/tnTSeHqr3wb++jgSkXjhA==} + engines: {node: '>=6'} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + pure-rand@6.1.0: + resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} + + pvtsutils@1.3.6: + resolution: {integrity: sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==} + + pvutils@1.1.5: + resolution: {integrity: sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA==} + engines: {node: '>=16.0.0'} + + qs@6.14.1: + resolution: {integrity: sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==} + engines: {node: '>=0.6'} + + qs@6.5.3: + resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==} + engines: {node: '>=0.6'} + + query-string@5.1.1: + resolution: {integrity: sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==} + engines: {node: '>=0.10.0'} + + querystring-es3@0.2.1: + resolution: {integrity: sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==} + engines: {node: '>=0.4.x'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + quick-format-unescaped@4.0.4: + resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} + + quick-lru@5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + raw-body@2.5.3: + resolution: {integrity: sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==} + engines: {node: '>= 0.8'} + + rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + + react-devtools-core@4.28.5: + resolution: {integrity: sha512-cq/o30z9W2Wb4rzBefjv5fBalHU0rJGZCHAkf/RHSBWSSYwh8PlQTqqOJmgIIbBtpj27T6FIPXeomIjZtCNVqA==} + + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + + react-reconciler@0.26.2: + resolution: {integrity: sha512-nK6kgY28HwrMNwDnMui3dvm3rCFjZrcGiuwLc5COUipBK5hWHLOxMJhSnSomirqWwjPBJKV1QcbkI0VJr7Gl1Q==} + engines: {node: '>=0.10.0'} + peerDependencies: + react: ^17.0.2 + + react@17.0.2: + resolution: {integrity: sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==} + engines: {node: '>=0.10.0'} + + read-pkg-up@1.0.1: + resolution: {integrity: sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==} + engines: {node: '>=0.10.0'} + + read-pkg@1.1.0: + resolution: {integrity: sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==} + engines: {node: '>=0.10.0'} + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readable-stream@4.7.0: + resolution: {integrity: sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + + real-require@0.2.0: + resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} + engines: {node: '>= 12.13.0'} + + redeyed@2.1.1: + resolution: {integrity: sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ==} + + reduce-flatten@2.0.0: + resolution: {integrity: sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==} + engines: {node: '>=6'} + + reflect.getprototypeof@1.0.10: + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} + engines: {node: '>= 0.4'} + + regexp.prototype.flags@1.5.4: + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} + engines: {node: '>= 0.4'} + + registry-auth-token@5.1.1: + resolution: {integrity: sha512-P7B4+jq8DeD2nMsAcdfaqHbssgHtZ7Z5+++a5ask90fvmJ8p5je4mOa+wzu+DB4vQ5tdJV/xywY+UnVFeQLV5Q==} + engines: {node: '>=14'} + + registry-url@6.0.1: + resolution: {integrity: sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==} + engines: {node: '>=12'} + + 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 + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@1.2.1: + resolution: {integrity: sha512-H7AkJWMobeskkttHyhTVtS0fxpFLjxhbfMa6Bk3wimP7sdPRGL3EyCg3sAQenFfAe+xQ+oAc85Nmtvq0ROM83Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + require-main-filename@1.0.1: + resolution: {integrity: sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==} + + resolve-alpn@1.2.1: + resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + + resolve-cwd@3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + resolve.exports@2.0.3: + resolution: {integrity: sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==} + engines: {node: '>=10'} + + resolve@1.17.0: + resolution: {integrity: sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==} + + resolve@1.22.11: + resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} + engines: {node: '>= 0.4'} + hasBin: true + + responselike@2.0.1: + resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} + + responselike@3.0.0: + resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==} + engines: {node: '>=14.16'} + + restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rimraf@2.7.1: + resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + ripemd160@2.0.3: + resolution: {integrity: sha512-5Di9UC0+8h1L6ZD2d7awM7E/T4uA1fJRlx6zk/NvdCCVEoAnFqvHmCuNeIKoCeIixBX/q8uM+6ycDvF8woqosA==} + engines: {node: '>= 0.8'} + + rlp@2.2.6: + resolution: {integrity: sha512-HAfAmL6SDYNWPUOJNrM500x4Thn4PZsEy5pijPh40U9WfNk0z15hUYzO9xVIMAdIHdFtD8CBDHd75Td1g36Mjg==} + hasBin: true + + rlp@2.2.7: + resolution: {integrity: sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==} + hasBin: true + + rpc-websockets@9.3.3: + resolution: {integrity: sha512-OkCsBBzrwxX4DoSv4Zlf9DgXKRB0MzVfCFg5MC+fNnf9ktr4SMWjsri0VNZQlDbCnGcImT6KNEv4ZoxktQhdpA==} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + rustbn.js@0.2.0: + resolution: {integrity: sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==} + + rxjs@7.8.2: + resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} + + safe-array-concat@1.1.3: + resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} + engines: {node: '>=0.4'} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-push-apply@1.0.0: + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} + + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + + safe-stable-stringify@2.5.0: + resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} + engines: {node: '>=10'} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + scheduler@0.20.2: + resolution: {integrity: sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==} + + scrypt-js@3.0.1: + resolution: {integrity: sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==} + + secp256k1@4.0.4: + resolution: {integrity: sha512-6JfvwvjUOn8F/jUoBY2Q1v5WY5XS+rj8qSe0v8Y4ezH4InLgTEeOOPQsRll9OV429Pvo6BCHGavIyJfr3TAhsw==} + engines: {node: '>=18.0.0'} + + secp256k1@5.0.1: + resolution: {integrity: sha512-lDFs9AAIaWP9UCdtWrotXWWF9t8PWgQDcxqgAnpM9rMqxb3Oaq2J0thzPVSxBwdJgyQtkU/sYtFtbM1RSt/iYA==} + engines: {node: '>=18.0.0'} + + seedrandom@3.0.5: + resolution: {integrity: sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==} + + semaphore-async-await@1.5.1: + resolution: {integrity: sha512-b/ptP11hETwYWpeilHXXQiV5UJNJl7ZWWooKRE5eBIYWoom6dZ0SluCIdCtKycsMtZgKWE01/qAw6jblw1YVhg==} + engines: {node: '>=4.1'} + + semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.7.3: + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} + engines: {node: '>=10'} + hasBin: true + + send@0.19.2: + resolution: {integrity: sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==} + engines: {node: '>= 0.8.0'} + + serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + + serve-static@1.16.3: + resolution: {integrity: sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==} + engines: {node: '>= 0.8.0'} + + servify@0.1.12: + resolution: {integrity: sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==} + engines: {node: '>=6'} + + set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + set-proto@1.0.0: + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} + engines: {node: '>= 0.4'} + + setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + sha.js@2.4.12: + resolution: {integrity: sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==} + engines: {node: '>= 0.10'} + hasBin: true + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + shell-quote@1.8.3: + resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==} + engines: {node: '>= 0.4'} + + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + + simple-get@2.8.2: + resolution: {integrity: sha512-Ijd/rV5o+mSBBs4F/x9oDPtTx9Zb6X9brmnXvMW4J7IR15ngi9q5xxqWBKU744jTZiaXtxaPL7uHG6vtN8kUkw==} + + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + slice-ansi@3.0.0: + resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} + engines: {node: '>=8'} + + slice-ansi@4.0.0: + resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} + engines: {node: '>=10'} + + snake-case@3.0.4: + resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} + + solc@0.4.26: + resolution: {integrity: sha512-o+c6FpkiHd+HPjmjEVpQgH7fqZ14tJpXhho+/bQXlXbliLIS/xjXb42Vxh+qQY1WCSTMQ0+a5vR9vi0MfhU6mA==} + hasBin: true + + solc@0.8.15: + resolution: {integrity: sha512-Riv0GNHNk/SddN/JyEuFKwbcWcEeho15iyupTSHw5Np6WuXA5D8kEHbyzDHi6sqmvLzu2l+8b1YmL8Ytple+8w==} + engines: {node: '>=10.0.0'} + hasBin: true + + solc@0.8.26: + resolution: {integrity: sha512-yiPQNVf5rBFHwN6SIf3TUUvVAFKcQqmSUFeq+fb6pNRCo0ZCgpYOZDi3BVoezCPIAcKrVYd/qXlBLUP9wVrZ9g==} + engines: {node: '>=10.0.0'} + hasBin: true + + solhint@4.5.4: + resolution: {integrity: sha512-Cu1XiJXub2q1eCr9kkJ9VPv1sGcmj3V7Zb76B0CoezDOB9bu3DxKIFFH7ggCl9fWpEPD6xBmRLfZrYijkVmujQ==} + hasBin: true + + solidity-bytes-utils@0.8.4: + resolution: {integrity: sha512-/bjac5YR12i0plOKvGlhE51F5IWGP6rI8DJetCQlXcnwKWz/Hgf/vr+Qlk1BWz56xVcwVhmhCaDkTMnx5xvt0g==} + + sonic-boom@3.8.1: + resolution: {integrity: sha512-y4Z8LCDBuum+PBP3lSV7RHrXscqksve/bi0as7mhwVnBW+/wUqKT/2Kb7um8yqcFy0duYbbPxzt89Zy2nOCaxg==} + + sort-object-keys@2.1.0: + resolution: {integrity: sha512-SOiEnthkJKPv2L6ec6HMwhUcN0/lppkeYuN1x63PbyPRrgSPIuBJCiYxYyvWRTtjMlOi14vQUCGUJqS6PLVm8g==} + + sort-package-json@3.6.0: + resolution: {integrity: sha512-fyJsPLhWvY7u2KsKPZn1PixbXp+1m7V8NWqU8CvgFRbMEX41Ffw1kD8n0CfJiGoaSfoAvbrqRRl/DcHO8omQOQ==} + engines: {node: '>=20'} + hasBin: true + + source-map-support@0.5.13: + resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + + spdx-exceptions@2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + + spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + + spdx-license-ids@3.0.22: + resolution: {integrity: sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==} + + split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + sshpk@1.18.0: + resolution: {integrity: sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==} + engines: {node: '>=0.10.0'} + hasBin: true + + stable-hash@0.0.5: + resolution: {integrity: sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==} + + stack-trace@0.0.10: + resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} + + stack-utils@2.0.6: + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + engines: {node: '>=10'} + + stacktrace-parser@0.1.11: + resolution: {integrity: sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg==} + engines: {node: '>=6'} + + starknet@8.9.2: + resolution: {integrity: sha512-+dp+o2w67fV6JyVOVkYeM1Ec71aORHc/JrF4VHLlfeGee0nLilooCQLE2u6hUcSGQG2x2/fvzkxYpIN+k1JBvA==} + engines: {node: '>=22'} + + statuses@2.0.2: + resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} + engines: {node: '>= 0.8'} + + stop-iteration-iterator@1.1.0: + resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} + engines: {node: '>= 0.4'} + + stream-chain@2.2.5: + resolution: {integrity: sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==} + + stream-json@1.9.1: + resolution: {integrity: sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==} + + strict-uri-encode@1.1.0: + resolution: {integrity: sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==} + engines: {node: '>=0.10.0'} + + string-format@2.0.0: + resolution: {integrity: sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==} + + string-length@4.0.2: + resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} + engines: {node: '>=10'} + + 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. + + string-width@1.0.2: + resolution: {integrity: sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==} + engines: {node: '>=0.10.0'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string.prototype.trim@1.2.10: + resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.9: + resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + engines: {node: '>= 0.4'} + + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + strip-ansi@3.0.1: + resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} + engines: {node: '>=0.10.0'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-bom@2.0.0: + resolution: {integrity: sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==} + engines: {node: '>=0.10.0'} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + strip-bom@4.0.0: + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + engines: {node: '>=8'} + + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + strip-hex-prefix@1.0.0: + resolution: {integrity: sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==} + engines: {node: '>=6.5.0', npm: '>=3'} + + strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + superstruct@0.15.5: + resolution: {integrity: sha512-4AOeU+P5UuE/4nOUkmcQdW5y7i9ndt1cQd/3iUe+LTz3RxESf/W/5lg4B74HbDMMv8PHnPnGCQFH45kBcrQYoQ==} + + superstruct@2.0.2: + resolution: {integrity: sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==} + engines: {node: '>=14.0.0'} + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + swarm-js@0.1.42: + resolution: {integrity: sha512-BV7c/dVlA3R6ya1lMlSSNPLYrntt0LUq4YMgy3iwpCIc6rZnS5W2wUoctarZ5pXlpKtxDDf9hNziEkcfrxdhqQ==} + + symbol.inspect@1.0.1: + resolution: {integrity: sha512-YQSL4duoHmLhsTD1Pw8RW6TZ5MaTX5rXJnqacJottr2P2LZBF/Yvrc3ku4NUpMOm8aM0KOCqM+UAkMA5HWQCzQ==} + + synckit@0.11.12: + resolution: {integrity: sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==} + engines: {node: ^14.18.0 || >=16.0.0} + + table-layout@1.0.2: + resolution: {integrity: sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==} + engines: {node: '>=8.0.0'} + + table@6.8.2: + resolution: {integrity: sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==} + engines: {node: '>=10.0.0'} + + table@6.9.0: + resolution: {integrity: sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==} + engines: {node: '>=10.0.0'} + + tar@4.4.19: + resolution: {integrity: sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==} + engines: {node: '>=4.5'} + deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exhorbitant rates) by contacting i@izs.me + + teslabot@1.5.0: + resolution: {integrity: sha512-e2MmELhCgrgZEGo7PQu/6bmYG36IDH+YrBI1iGm6jovXkeDIGa3pZ2WSqRjzkuw2vt1EqfkZoV5GpXgqL8QJVg==} + + test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + + 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. + + text-encoding-utf-8@1.0.2: + resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} + + text-hex@1.0.0: + resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + thread-stream@2.7.0: + resolution: {integrity: sha512-qQiRWsU/wvNolI6tbbCKd9iKaTnCXsTwVxhhKM6nctPdujTyztjlbUkUTUymidWcMnZ5pWR0ej4a0tjsW021vw==} + + timed-out@4.0.1: + resolution: {integrity: sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==} + engines: {node: '>=0.10.0'} + + timers-ext@0.1.8: + resolution: {integrity: sha512-wFH7+SEAcKfJpfLPkrgMPvvwnEtj8W4IurvEyrKsDleXnKLCDw71w8jltvfLa8Rm4qQxxT4jmDBYbJG/z7qoww==} + engines: {node: '>=0.12'} + + tiny-invariant@1.3.3: + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + + tinycolor2@1.6.0: + resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==} + + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} + + tinygradient@0.4.3: + resolution: {integrity: sha512-tBPYQSs6eWukzzAITBSmqcOwZCKACvRa/XjPPh1mj4mnx4G3Drm51HxyCTU/TKnY8kG4hmTe5QlOh9O82aNtJQ==} + + tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + + tmpl@1.0.5: + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + + to-buffer@1.2.2: + resolution: {integrity: sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==} + engines: {node: '>= 0.4'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + toml@3.0.0: + resolution: {integrity: sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==} + + tough-cookie@2.5.0: + resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==} + engines: {node: '>=0.8'} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + + triple-beam@1.4.1: + resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==} + engines: {node: '>= 14.0.0'} + + tronweb@5.3.4: + resolution: {integrity: sha512-79HEnwSAqyCKrT7QB8dkxad0RqYx3dSulEg4dfBQQVwzhRr+AqdE1yz+nfTUpftu54RejqaHjqz40ZzWNy077w==} + + ts-api-utils@1.4.3: + resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' + + ts-command-line-args@2.5.1: + resolution: {integrity: sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw==} + hasBin: true + + ts-essentials@7.0.3: + resolution: {integrity: sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==} + peerDependencies: + typescript: '>=3.7.0' + + ts-mixer@6.0.4: + resolution: {integrity: sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA==} + + ts-node@10.9.2: + 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 + + tsconfig-paths@3.15.0: + resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + + tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tsort@0.0.1: + resolution: {integrity: sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==} + + tsutils@3.21.0: + 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' + + tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + + tweetnacl@0.14.5: + resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} + + tweetnacl@1.0.3: + resolution: {integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==} + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + + type-detect@4.1.0: + resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} + engines: {node: '>=4'} + + type-fest@0.12.0: + resolution: {integrity: sha512-53RyidyjvkGpnWPMF9bQgFtWp+Sl8O2Rp13VavmJgfAP9WWG6q6TkrKU8iyJdnwnfgHI6k2hTlgqH4aSdjoTbg==} + engines: {node: '>=10'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + + type-fest@0.7.1: + resolution: {integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==} + engines: {node: '>=8'} + + type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + + type@2.7.3: + resolution: {integrity: sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==} + + typechain@8.3.2: + resolution: {integrity: sha512-x/sQYr5w9K7yv3es7jo4KTX05CLxOf7TRWwoHlrjRh8H82G64g+k7VuWPJlgMo6qrjfCulOdfBjiaDtmhFYD/Q==} + hasBin: true + peerDependencies: + typescript: '>=4.3.0' + + typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.3: + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.4: + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.7: + resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} + engines: {node: '>= 0.4'} + + typedarray-to-buffer@3.1.5: + resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + typical@4.0.0: + resolution: {integrity: sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==} + engines: {node: '>=8'} + + typical@5.2.0: + resolution: {integrity: sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==} + engines: {node: '>=8'} + + uint8array-tools@0.0.8: + resolution: {integrity: sha512-xS6+s8e0Xbx++5/0L+yyexukU7pz//Yg6IHg3BKhXotg1JcYtgxVcUctQ0HxLByiJzpAkNFawz1Nz5Xadzo82g==} + engines: {node: '>=14.0.0'} + + ultron@1.1.1: + resolution: {integrity: sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==} + + unbox-primitive@1.1.0: + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} + + undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + undici@5.29.0: + resolution: {integrity: sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==} + engines: {node: '>=14.0'} + + universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + unrs-resolver@1.11.1: + resolution: {integrity: sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==} + + update-browserslist-db@1.2.3: + resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + url-set-query@1.0.0: + resolution: {integrity: sha512-3AChu4NiXquPfeckE5R5cGdiHCMWJx1dwCWOmWIL4KHAziJNOFIYJlpGFeKDvwLPHovZRCxK3cYlwzqI9Vp+Gg==} + + url@0.11.4: + resolution: {integrity: sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==} + engines: {node: '>= 0.4'} + + utf-8-validate@5.0.10: + resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} + engines: {node: '>=6.14.2'} + + utf-8-validate@5.0.7: + resolution: {integrity: sha512-vLt1O5Pp+flcArHGIyKEQq883nBt8nN8tVBcoL0qUXj2XT1n7p70yGIq2VK98I5FdZ1YHc0wk/koOnHjnXWk1Q==} + engines: {node: '>=6.14.2'} + + utf8@3.0.0: + resolution: {integrity: sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + util@0.12.5: + resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} + + utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + + 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 + + uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + + uuid@9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + hasBin: true + + v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + + v8-to-istanbul@9.3.0: + resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} + engines: {node: '>=10.12.0'} + + valibot@0.37.0: + resolution: {integrity: sha512-FQz52I8RXgFgOHym3XHYSREbNtkgSjF9prvMFH1nBsRyfL6SfCzoT1GuSDTlbsuPubM7/6Kbw0ZMQb8A+V+VsQ==} + peerDependencies: + typescript: '>=5' + peerDependenciesMeta: + typescript: + optional: true + + valibot@1.2.0: + resolution: {integrity: sha512-mm1rxUsmOxzrwnX5arGS+U4T25RdvpPjPN4yR0u9pUBov9+zGVtO84tif1eY4r6zWxVxu3KzIyknJy3rxfRZZg==} + peerDependencies: + typescript: '>=5' + peerDependenciesMeta: + typescript: + optional: true + + validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + + validator@13.15.26: + resolution: {integrity: sha512-spH26xU080ydGggxRyR1Yhcbgx+j3y5jbNXk/8L+iRvdIEQ4uTRH2Sgf2dokud6Q4oAtsbNvJ1Ft+9xmm6IZcA==} + engines: {node: '>= 0.10'} + + varint@5.0.2: + resolution: {integrity: sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==} + + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + verror@1.10.0: + resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} + engines: {'0': node >=0.6.0} + + viem@2.45.0: + resolution: {integrity: sha512-iVA9qrAgRdtpWa80lCZ6Jri6XzmLOwwA1wagX2HnKejKeliFLpON0KOdyfqvcy+gUpBVP59LBxP2aKiL3aj8fg==} + peerDependencies: + typescript: '>=5.0.4' + peerDependenciesMeta: + typescript: + optional: true + + walker@1.0.8: + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + + web3-bzz@1.10.4: + resolution: {integrity: sha512-ZZ/X4sJ0Uh2teU9lAGNS8EjveEppoHNQiKlOXAjedsrdWuaMErBPdLQjXfcrYvN6WM6Su9PMsAxf3FXXZ+HwQw==} + engines: {node: '>=8.0.0'} + + web3-core-helpers@1.10.4: + resolution: {integrity: sha512-r+L5ylA17JlD1vwS8rjhWr0qg7zVoVMDvWhajWA5r5+USdh91jRUYosp19Kd1m2vE034v7Dfqe1xYRoH2zvG0g==} + engines: {node: '>=8.0.0'} + + web3-core-method@1.10.4: + resolution: {integrity: sha512-uZTb7flr+Xl6LaDsyTeE2L1TylokCJwTDrIVfIfnrGmnwLc6bmTWCCrm71sSrQ0hqs6vp/MKbQYIYqUN0J8WyA==} + engines: {node: '>=8.0.0'} + + web3-core-promievent@1.10.4: + resolution: {integrity: sha512-2de5WnJQ72YcIhYwV/jHLc4/cWJnznuoGTJGD29ncFQHAfwW/MItHFSVKPPA5v8AhJe+r6y4Y12EKvZKjQVBvQ==} + engines: {node: '>=8.0.0'} + + web3-core-requestmanager@1.10.4: + resolution: {integrity: sha512-vqP6pKH8RrhT/2MoaU+DY/OsYK9h7HmEBNCdoMj+4ZwujQtw/Mq2JifjwsJ7gits7Q+HWJwx8q6WmQoVZAWugg==} + engines: {node: '>=8.0.0'} + + web3-core-subscriptions@1.10.4: + resolution: {integrity: sha512-o0lSQo/N/f7/L76C0HV63+S54loXiE9fUPfHFcTtpJRQNDBVsSDdWRdePbWwR206XlsBqD5VHApck1//jEafTw==} + engines: {node: '>=8.0.0'} + + web3-core@1.10.4: + resolution: {integrity: sha512-B6elffYm81MYZDTrat7aEhnhdtVE3lDBUZft16Z8awYMZYJDbnykEbJVS+l3mnA7AQTnSDr/1MjWofGDLBJPww==} + engines: {node: '>=8.0.0'} + + web3-eth-abi@1.10.4: + resolution: {integrity: sha512-cZ0q65eJIkd/jyOlQPDjr8X4fU6CRL1eWgdLwbWEpo++MPU/2P4PFk5ZLAdye9T5Sdp+MomePPJ/gHjLMj2VfQ==} + engines: {node: '>=8.0.0'} + + web3-eth-accounts@1.10.4: + resolution: {integrity: sha512-ysy5sVTg9snYS7tJjxVoQAH6DTOTkRGR8emEVCWNGLGiB9txj+qDvSeT0izjurS/g7D5xlMAgrEHLK1Vi6I3yg==} + engines: {node: '>=8.0.0'} + + web3-eth-contract@1.10.4: + resolution: {integrity: sha512-Q8PfolOJ4eV9TvnTj1TGdZ4RarpSLmHnUnzVxZ/6/NiTfe4maJz99R0ISgwZkntLhLRtw0C7LRJuklzGYCNN3A==} + engines: {node: '>=8.0.0'} + + web3-eth-ens@1.10.4: + resolution: {integrity: sha512-LLrvxuFeVooRVZ9e5T6OWKVflHPFgrVjJ/jtisRWcmI7KN/b64+D/wJzXqgmp6CNsMQcE7rpmf4CQmJCrTdsgg==} + engines: {node: '>=8.0.0'} + + web3-eth-iban@1.10.4: + resolution: {integrity: sha512-0gE5iNmOkmtBmbKH2aTodeompnNE8jEyvwFJ6s/AF6jkw9ky9Op9cqfzS56AYAbrqEFuClsqB/AoRves7LDELw==} + engines: {node: '>=8.0.0'} + + web3-eth-personal@1.10.4: + resolution: {integrity: sha512-BRa/hs6jU1hKHz+AC/YkM71RP3f0Yci1dPk4paOic53R4ZZG4MgwKRkJhgt3/GPuPliwS46f/i5A7fEGBT4F9w==} + engines: {node: '>=8.0.0'} + + web3-eth@1.10.4: + resolution: {integrity: sha512-Sql2kYKmgt+T/cgvg7b9ce24uLS7xbFrxE4kuuor1zSCGrjhTJ5rRNG8gTJUkAJGKJc7KgnWmgW+cOfMBPUDSA==} + engines: {node: '>=8.0.0'} + + web3-net@1.10.4: + resolution: {integrity: sha512-mKINnhOOnZ4koA+yV2OT5s5ztVjIx7IY9a03w6s+yao/BUn+Luuty0/keNemZxTr1E8Ehvtn28vbOtW7Ids+Ow==} + engines: {node: '>=8.0.0'} + + web3-providers-http@1.10.4: + resolution: {integrity: sha512-m2P5Idc8hdiO0l60O6DSCPw0kw64Zgi0pMjbEFRmxKIck2Py57RQMu4bxvkxJwkF06SlGaEQF8rFZBmuX7aagQ==} + engines: {node: '>=8.0.0'} + + web3-providers-ipc@1.10.4: + resolution: {integrity: sha512-YRF/bpQk9z3WwjT+A6FI/GmWRCASgd+gC0si7f9zbBWLXjwzYAKG73bQBaFRAHex1hl4CVcM5WUMaQXf3Opeuw==} + engines: {node: '>=8.0.0'} + + web3-providers-ws@1.10.4: + resolution: {integrity: sha512-j3FBMifyuFFmUIPVQR4pj+t5ILhAexAui0opgcpu9R5LxQrLRUZxHSnU+YO25UycSOa/NAX8A+qkqZNpcFAlxA==} + engines: {node: '>=8.0.0'} + + web3-shh@1.10.4: + resolution: {integrity: sha512-cOH6iFFM71lCNwSQrC3niqDXagMqrdfFW85hC9PFUrAr3PUrIem8TNstTc3xna2bwZeWG6OBy99xSIhBvyIACw==} + engines: {node: '>=8.0.0'} + + web3-utils@1.10.4: + resolution: {integrity: sha512-tsu8FiKJLk2PzhDl9fXbGUWTkkVXYhtTA+SmEFkKft+9BgwLxfCRpU96sWv7ICC8zixBNd3JURVoiR3dUXgP8A==} + engines: {node: '>=8.0.0'} + + web3@1.10.4: + resolution: {integrity: sha512-kgJvQZjkmjOEKimx/tJQsqWfRDPTTcBfYPa9XletxuHLpHcXdx67w8EFn5AW3eVxCutE9dTVHgGa9VYe8vgsEA==} + engines: {node: '>=8.0.0'} + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + websocket@1.0.35: + resolution: {integrity: sha512-/REy6amwPZl44DDzvRCkaI1q1bIiQB0mEFQLUrhz3z2EK91cp3n72rAjUlrTP0zV22HJIUOVHQGPxhFRjxjt+Q==} + engines: {node: '>=4.0.0'} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + which-boxed-primitive@1.1.1: + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} + + which-builtin-type@1.2.1: + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} + engines: {node: '>= 0.4'} + + which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + + which-module@1.0.0: + resolution: {integrity: sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ==} + + which-typed-array@1.1.20: + resolution: {integrity: sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==} + engines: {node: '>= 0.4'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + widest-line@3.1.0: + resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} + engines: {node: '>=8'} + + wif@5.0.0: + resolution: {integrity: sha512-iFzrC/9ne740qFbNjTZ2FciSRJlHIXoxqk/Y5EnE08QOXu1WjJyCCswwDTYbohAOEnlCtLaAAQBhyaLRFh2hMA==} + + window-size@0.2.0: + resolution: {integrity: sha512-UD7d8HFA2+PZsbKyaOCEy8gMh1oDtHgJh1LfgjQ4zVXmYjAT/kvz3PueITKuqDiIXQe7yzpPnxX3lNc+AhQMyw==} + engines: {node: '>= 0.10.0'} + hasBin: true + + winston-transport@4.9.0: + resolution: {integrity: sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==} + engines: {node: '>= 12.0.0'} + + winston@3.19.0: + resolution: {integrity: sha512-LZNJgPzfKR+/J3cHkxcpHKpKKvGfDZVPS4hfJCc4cCG0CgYzvlD6yE/S3CIL/Yt91ak327YCpiF/0MyeZHEHKA==} + engines: {node: '>= 12.0.0'} + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wordwrapjs@4.0.1: + resolution: {integrity: sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==} + engines: {node: '>=8.0.0'} + + workerpool@6.5.1: + resolution: {integrity: sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==} + + wrap-ansi@2.1.0: + resolution: {integrity: sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==} + engines: {node: '>=0.10.0'} + + wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + 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} + + 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 + + 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 + + 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 + + ws@8.18.3: + 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 + + ws@8.19.0: + resolution: {integrity: sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==} + 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 + + xhr-request-promise@0.1.3: + resolution: {integrity: sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg==} + + xhr-request@1.1.0: + resolution: {integrity: sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==} + + xhr@2.6.0: + resolution: {integrity: sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==} + + xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + + y18n@3.2.2: + resolution: {integrity: sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + 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. + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yargs-parser@2.4.1: + resolution: {integrity: sha512-9pIKIJhnI5tonzG6OnCFlz/yln8xHYcGl+pn3xR0Vzff0vzN1PbNRaelgfgRUwZ3s4i3jvxT9WhmUGL4whnasA==} + + yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs-unparser@2.0.0: + resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} + engines: {node: '>=10'} + + yargs@16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yargs@4.8.1: + resolution: {integrity: sha512-LqodLrnIDM3IFT+Hf/5sxBnEGECrfdC1uIbgZeJmESCSo4HoCAaKEus8MylXHAkdacGc0ye+Qa+dpkuom8uVYA==} + + yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + yoga-layout-prebuilt@1.10.0: + resolution: {integrity: sha512-YnOmtSbv4MTf7RGJMK0FvZ+KD8OEe/J5BNnR0GHhD8J/XcG/Qvxgszm0Un6FTHWW4uHlTgP0IztiXQnGyIR45g==} + engines: {node: '>=8'} + + zksync-ethers@5.11.1: + resolution: {integrity: sha512-Znl2p0gporGnHbAO0KKM1TIQpyRQKCi8nf1kOlZuTVCvlgBwhweWjTy53le96ZOoR3J5LUXAk7aYil2czSLJZw==} + engines: {node: '>=16.0.0'} + peerDependencies: + ethers: ^5.7.2 + + zksync-web3@0.14.4: + 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 + + zod@3.25.76: + resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} + +snapshots: + + '@0no-co/graphql.web@1.2.0(graphql@16.12.0)': + optionalDependencies: + graphql: 16.12.0 + + '@0no-co/graphqlsp@1.15.2(graphql@16.12.0)(typescript@5.9.3)': + dependencies: + '@gql.tada/internal': 1.0.8(graphql@16.12.0)(typescript@5.9.3) + graphql: 16.12.0 + typescript: 5.9.3 + + '@adraffy/ens-normalize@1.11.1': {} + + '@aptos-labs/aptos-client@2.1.0(got@12.6.1)': + dependencies: + got: 12.6.1 + + '@axelar-network/axelar-gmp-sdk-solidity@5.10.0': {} + + '@babel/code-frame@7.28.6': + dependencies: + '@babel/helper-validator-identifier': 7.28.5 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.28.6': {} + + '@babel/core@7.28.6': + dependencies: + '@babel/code-frame': 7.28.6 + '@babel/generator': 7.28.6 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.28.6) + '@babel/helpers': 7.28.6 + '@babel/parser': 7.28.6 + '@babel/template': 7.28.6 + '@babel/traverse': 7.28.6 + '@babel/types': 7.28.6 + '@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 + + '@babel/generator@7.28.6': + dependencies: + '@babel/parser': 7.28.6 + '@babel/types': 7.28.6 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + + '@babel/helper-compilation-targets@7.28.6': + dependencies: + '@babel/compat-data': 7.28.6 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.28.1 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-globals@7.28.0': {} + + '@babel/helper-module-imports@7.28.6': + dependencies: + '@babel/traverse': 7.28.6 + '@babel/types': 7.28.6 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-module-imports': 7.28.6 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.28.6 + transitivePeerDependencies: + - supports-color + + '@babel/helper-plugin-utils@7.28.6': {} + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.28.5': {} + + '@babel/helper-validator-option@7.27.1': {} + + '@babel/helpers@7.28.6': + dependencies: + '@babel/template': 7.28.6 + '@babel/types': 7.28.6 + + '@babel/parser@7.28.6': + dependencies: + '@babel/types': 7.28.6 + + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-import-attributes@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-typescript@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/runtime@7.28.6': {} + + '@babel/template@7.28.6': + dependencies: + '@babel/code-frame': 7.28.6 + '@babel/parser': 7.28.6 + '@babel/types': 7.28.6 + + '@babel/traverse@7.28.6': + dependencies: + '@babel/code-frame': 7.28.6 + '@babel/generator': 7.28.6 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.28.6 + '@babel/template': 7.28.6 + '@babel/types': 7.28.6 + debug: 4.4.3(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + + '@babel/types@7.28.6': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + + '@bcoe/v8-coverage@0.2.3': {} + + '@bitcoinerlab/secp256k1@1.2.0': + dependencies: + '@noble/curves': 1.9.7 + + '@chainlink/contracts-ccip@0.7.6(bufferutil@4.1.0)(ethers@5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': + dependencies: + '@eth-optimism/contracts': 0.5.40(bufferutil@4.1.0)(ethers@5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + '@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 + + '@colors/colors@1.5.0': + optional: true + + '@colors/colors@1.6.0': {} + + '@coral-xyz/anchor-errors@0.30.1': {} + + '@coral-xyz/anchor-errors@0.31.1': {} + + '@coral-xyz/anchor@0.26.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)': + dependencies: + '@coral-xyz/borsh': 0.26.0(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + 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 + + '@coral-xyz/anchor@0.29.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)': + dependencies: + '@coral-xyz/borsh': 0.29.0(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@noble/hashes': 1.8.0 + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + 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 + + '@coral-xyz/anchor@0.30.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)': + dependencies: + '@coral-xyz/anchor-errors': 0.30.1 + '@coral-xyz/borsh': 0.30.1(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@noble/hashes': 1.8.0 + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + 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 + + '@coral-xyz/anchor@0.31.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)': + dependencies: + '@coral-xyz/anchor-errors': 0.31.1 + '@coral-xyz/borsh': 0.31.1(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@noble/hashes': 1.8.0 + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + 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 + + '@coral-xyz/borsh@0.26.0(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))': + dependencies: + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + bn.js: 5.2.2 + buffer-layout: 1.2.2 + + '@coral-xyz/borsh@0.29.0(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))': + dependencies: + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + bn.js: 5.2.2 + buffer-layout: 1.2.2 + + '@coral-xyz/borsh@0.30.1(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))': + dependencies: + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + bn.js: 5.2.2 + buffer-layout: 1.2.2 + + '@coral-xyz/borsh@0.31.1(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))': + dependencies: + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + bn.js: 5.2.2 + buffer-layout: 1.2.2 + + '@cspotcode/source-map-support@0.8.1': + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + + '@dabh/diagnostics@2.0.8': + dependencies: + '@so-ric/colorspace': 1.1.6 + enabled: 2.0.0 + kuler: 2.0.0 + + '@emnapi/core@1.8.1': + dependencies: + '@emnapi/wasi-threads': 1.1.0 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.8.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.1.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@ensdomains/ens@0.4.5': + dependencies: + bluebird: 3.7.2 + eth-ens-namehash: 2.0.8 + solc: 0.4.26 + testrpc: 0.0.1 + web3-utils: 1.10.4 + + '@ensdomains/resolver@0.2.4': {} + + '@eslint-community/eslint-utils@4.9.1(eslint@8.57.1)': + dependencies: + eslint: 8.57.1 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.2': {} + + '@eslint/eslintrc@2.1.4': + 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.1 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@8.57.1': {} + + '@eth-optimism/contracts@0.5.40(bufferutil@4.1.0)(ethers@5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': + dependencies: + '@eth-optimism/core-utils': 0.12.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@ethersproject/abstract-provider': 5.8.0 + '@ethersproject/abstract-signer': 5.8.0 + ethers: 5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@eth-optimism/contracts@0.6.0(bufferutil@4.1.0)(ethers@5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': + dependencies: + '@eth-optimism/core-utils': 0.12.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@ethersproject/abstract-provider': 5.8.0 + '@ethersproject/abstract-signer': 5.8.0 + ethers: 5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@eth-optimism/core-utils@0.12.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)': + 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(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@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 + + '@ethereum-waffle/chai@4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(ethers@5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))': + dependencies: + '@ethereum-waffle/provider': 4.0.5(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(ethers@5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + debug: 4.4.3(supports-color@8.1.1) + ethers: 5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + json-bigint: 1.0.0 + transitivePeerDependencies: + - '@ensdomains/ens' + - '@ensdomains/resolver' + - supports-color + + '@ethereum-waffle/compiler@4.0.3(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(solc@0.8.15)(typechain@8.3.2(typescript@5.9.3))(typescript@5.9.3)': + 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(bufferutil@4.1.0)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.9.3))(typescript@5.9.3) + '@types/mkdirp': 0.5.2 + '@types/node-fetch': 2.6.13 + ethers: 5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + 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 + + '@ethereum-waffle/ens@4.0.3(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(ethers@5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))': + dependencies: + '@ensdomains/ens': 0.4.5 + '@ensdomains/resolver': 0.2.4 + ethers: 5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + + '@ethereum-waffle/mock-contract@4.0.4(ethers@5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))': + dependencies: + ethers: 5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + + '@ethereum-waffle/provider@4.0.5(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(ethers@5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))': + dependencies: + '@ethereum-waffle/ens': 4.0.3(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(ethers@5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@ganache/ethereum-options': 0.1.4 + debug: 4.4.3(supports-color@8.1.1) + ethers: 5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + ganache: 7.4.3 + transitivePeerDependencies: + - '@ensdomains/ens' + - '@ensdomains/resolver' + - supports-color + + '@ethereumjs/block@3.6.3': + dependencies: + '@ethereumjs/common': 2.6.5 + '@ethereumjs/tx': 3.5.2 + ethereumjs-util: 7.1.5 + merkle-patricia-tree: 4.2.4 + + '@ethereumjs/blockchain@5.5.3': + 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 + + '@ethereumjs/common@2.6.0': + dependencies: + crc-32: 1.2.2 + ethereumjs-util: 7.1.5 + + '@ethereumjs/common@2.6.5': + dependencies: + crc-32: 1.2.2 + ethereumjs-util: 7.1.5 + + '@ethereumjs/ethash@1.1.0': + 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 + + '@ethereumjs/rlp@4.0.1': {} + + '@ethereumjs/rlp@5.0.2': {} + + '@ethereumjs/tx@3.4.0': + dependencies: + '@ethereumjs/common': 2.6.0 + ethereumjs-util: 7.1.5 + + '@ethereumjs/tx@3.5.2': + dependencies: + '@ethereumjs/common': 2.6.5 + ethereumjs-util: 7.1.5 + + '@ethereumjs/util@8.1.0': + dependencies: + '@ethereumjs/rlp': 4.0.1 + ethereum-cryptography: 2.2.1 + micro-ftch: 0.3.1 + + '@ethereumjs/util@9.1.0': + dependencies: + '@ethereumjs/rlp': 5.0.2 + ethereum-cryptography: 2.2.1 + + '@ethereumjs/vm@5.6.0': + dependencies: + '@ethereumjs/block': 3.6.3 + '@ethereumjs/blockchain': 5.5.3 + '@ethereumjs/common': 2.6.0 + '@ethereumjs/tx': 3.4.0 + async-eventemitter: 0.2.4 + core-js-pure: 3.48.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 + + '@ethersproject/abi@5.8.0': + 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 + + '@ethersproject/abstract-provider@5.8.0': + 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 + + '@ethersproject/abstract-signer@5.8.0': + 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 + + '@ethersproject/address@5.7.0': + 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 + + '@ethersproject/address@5.8.0': + 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 + + '@ethersproject/base64@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 + + '@ethersproject/basex@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 + '@ethersproject/properties': 5.8.0 + + '@ethersproject/bignumber@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + bn.js: 5.2.2 + + '@ethersproject/bytes@5.8.0': + dependencies: + '@ethersproject/logger': 5.8.0 + + '@ethersproject/constants@5.8.0': + dependencies: + '@ethersproject/bignumber': 5.8.0 + + '@ethersproject/contracts@5.8.0': + 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 + + '@ethersproject/hash@5.8.0': + 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 + + '@ethersproject/hdnode@5.8.0': + 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 + + '@ethersproject/json-wallets@5.8.0': + 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 + + '@ethersproject/keccak256@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 + js-sha3: 0.8.0 + + '@ethersproject/logger@5.8.0': {} + + '@ethersproject/networks@5.8.0': + dependencies: + '@ethersproject/logger': 5.8.0 + + '@ethersproject/pbkdf2@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 + '@ethersproject/sha2': 5.8.0 + + '@ethersproject/properties@5.8.0': + dependencies: + '@ethersproject/logger': 5.8.0 + + '@ethersproject/providers@5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)': + 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(bufferutil@4.1.0)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@ethersproject/random@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + + '@ethersproject/rlp@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + + '@ethersproject/sha2@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + hash.js: 1.1.7 + + '@ethersproject/signing-key@5.8.0': + 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 + + '@ethersproject/solidity@5.8.0': + 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 + + '@ethersproject/strings@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 + '@ethersproject/constants': 5.8.0 + '@ethersproject/logger': 5.8.0 + + '@ethersproject/transactions@5.8.0': + 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 + + '@ethersproject/units@5.8.0': + dependencies: + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/constants': 5.8.0 + '@ethersproject/logger': 5.8.0 + + '@ethersproject/wallet@5.8.0': + 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 + + '@ethersproject/web@5.8.0': + 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 + + '@ethersproject/wordlists@5.8.0': + 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 + + '@fastify/busboy@2.1.1': {} + + '@ganache/ethereum-address@0.1.4': + dependencies: + '@ganache/utils': 0.1.4 + + '@ganache/ethereum-options@0.1.4': + 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 + + '@ganache/ethereum-utils@0.1.4': + 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 + + '@ganache/options@0.1.4': + dependencies: + '@ganache/utils': 0.1.4 + bip39: 3.0.4 + seedrandom: 3.0.5 + + '@ganache/rlp@0.1.4': + dependencies: + '@ganache/utils': 0.1.4 + rlp: 2.2.6 + + '@ganache/utils@0.1.4': + dependencies: + emittery: 0.10.0 + keccak: 3.0.1 + seedrandom: 3.0.5 + optionalDependencies: + '@trufflesuite/bigint-buffer': 1.1.9 + + '@gql.tada/cli-utils@1.7.2(@0no-co/graphqlsp@1.15.2(graphql@16.12.0)(typescript@5.9.3))(graphql@16.12.0)(typescript@5.9.3)': + dependencies: + '@0no-co/graphqlsp': 1.15.2(graphql@16.12.0)(typescript@5.9.3) + '@gql.tada/internal': 1.0.8(graphql@16.12.0)(typescript@5.9.3) + graphql: 16.12.0 + typescript: 5.9.3 + + '@gql.tada/internal@1.0.8(graphql@16.12.0)(typescript@5.9.3)': + dependencies: + '@0no-co/graphql.web': 1.2.0(graphql@16.12.0) + graphql: 16.12.0 + typescript: 5.9.3 + + '@graphql-typed-document-node/core@3.2.0(graphql@16.12.0)': + dependencies: + graphql: 16.12.0 + + '@humanwhocodes/config-array@0.13.0': + dependencies: + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.4.3(supports-color@8.1.1) + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/object-schema@2.0.3': {} + + '@improbable-eng/grpc-web@0.15.0(google-protobuf@3.21.4)': + dependencies: + browser-headers: 0.4.1 + google-protobuf: 3.21.4 + + '@initia/initia.js@1.0.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)': + dependencies: + '@bitcoinerlab/secp256k1': 1.2.0 + '@initia/initia.proto': 0.2.6 + '@initia/opinit.proto': 0.0.11 + '@ledgerhq/hw-transport': 6.32.0 + '@ledgerhq/hw-transport-webhid': 6.31.0 + '@ledgerhq/hw-transport-webusb': 6.30.0 + '@mysten/bcs': 1.9.2 + axios: 1.13.3 + 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.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - debug + - typescript + - utf-8-validate + + '@initia/initia.proto@0.2.6': + 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 + + '@initia/opinit.proto@0.0.11': + 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 + + '@iota/bcs@1.4.0': + dependencies: + bs58: 6.0.0 + + '@iota/iota-sdk@1.10.1(typescript@5.9.3)': + dependencies: + '@graphql-typed-document-node/core': 3.2.0(graphql@16.12.0) + '@iota/bcs': 1.4.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.9.0(graphql@16.12.0)(typescript@5.9.3) + graphql: 16.12.0 + tweetnacl: 1.0.3 + valibot: 1.2.0(typescript@5.9.3) + transitivePeerDependencies: + - '@gql.tada/svelte-support' + - '@gql.tada/vue-support' + - typescript + + '@istanbuljs/load-nyc-config@1.1.0': + dependencies: + camelcase: 5.3.1 + find-up: 4.1.0 + get-package-type: 0.1.0 + js-yaml: 3.14.2 + resolve-from: 5.0.0 + + '@istanbuljs/schema@0.1.3': {} + + '@jest/console@29.7.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 + + '@jest/core@29.7.0(ts-node@10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.18))(@types/node@18.18.14)(typescript@5.9.3))': + 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(@swc/core@1.15.10(@swc/helpers@0.5.18))(@types/node@18.18.14)(typescript@5.9.3)) + 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 + + '@jest/create-cache-key-function@30.2.0': + dependencies: + '@jest/types': 30.2.0 + + '@jest/environment@29.7.0': + dependencies: + '@jest/fake-timers': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 18.18.14 + jest-mock: 29.7.0 + + '@jest/expect-utils@29.7.0': + dependencies: + jest-get-type: 29.6.3 + + '@jest/expect@29.7.0': + dependencies: + expect: 29.7.0 + jest-snapshot: 29.7.0 + transitivePeerDependencies: + - supports-color + + '@jest/fake-timers@29.7.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 + + '@jest/globals@29.7.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 + + '@jest/pattern@30.0.1': + dependencies: + '@types/node': 18.18.14 + jest-regex-util: 30.0.1 + + '@jest/reporters@29.7.0': + 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 + + '@jest/schemas@29.6.3': + dependencies: + '@sinclair/typebox': 0.27.8 + + '@jest/schemas@30.0.5': + dependencies: + '@sinclair/typebox': 0.34.48 + + '@jest/source-map@29.6.3': + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + callsites: 3.1.0 + graceful-fs: 4.2.11 + + '@jest/test-result@29.7.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 + + '@jest/test-sequencer@29.7.0': + dependencies: + '@jest/test-result': 29.7.0 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + slash: 3.0.0 + + '@jest/transform@29.7.0': + dependencies: + '@babel/core': 7.28.6 + '@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 + + '@jest/types@29.6.3': + 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.35 + chalk: 4.1.2 + + '@jest/types@30.2.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.35 + chalk: 4.1.2 + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@jridgewell/trace-mapping@0.3.9': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@layerzerolabs/devtools-evm-hardhat@4.0.4(bd17817fbe618b486ab39186dfd61b3d)': + dependencies: + '@ethersproject/abi': 5.8.0 + '@ethersproject/abstract-signer': 5.8.0 + '@ethersproject/contracts': 5.8.0 + '@ethersproject/providers': 5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@layerzerolabs/devtools': 2.0.5(@ethersproject/bytes@5.8.0)(@layerzerolabs/io-devtools@0.3.2(ink-gradient@2.0.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink-table@3.1.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76))(@layerzerolabs/lz-definitions@3.0.156)(zod@3.25.76) + '@layerzerolabs/devtools-evm': 3.0.2(ba1b8dd3c831373795921a05962d4f39) + '@layerzerolabs/export-deployments': 0.0.16 + '@layerzerolabs/io-devtools': 0.3.2(ink-gradient@2.0.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink-table@3.1.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76) + '@layerzerolabs/lz-definitions': 3.0.156 + '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(hardhat@2.28.3(bufferutil@4.1.0)(ts-node@10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.18))(@types/node@18.18.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@safe-global/protocol-kit': 1.3.0(bufferutil@4.1.0)(ethers@5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + fp-ts: 2.16.11 + hardhat: 2.28.3(bufferutil@4.1.0)(ts-node@10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.18))(@types/node@18.18.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) + hardhat-deploy: 0.12.4(bufferutil@4.1.0)(utf-8-validate@5.0.10) + micro-memoize: 4.1.3 + p-memoize: 4.0.4 + zod: 3.25.76 + transitivePeerDependencies: + - bufferutil + - encoding + - ethers + - supports-color + - utf-8-validate + + '@layerzerolabs/devtools-evm@3.0.2(ba1b8dd3c831373795921a05962d4f39)': + 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(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@layerzerolabs/devtools': 2.0.5(@ethersproject/bytes@5.8.0)(@layerzerolabs/io-devtools@0.3.2(ink-gradient@2.0.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink-table@3.1.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76))(@layerzerolabs/lz-definitions@3.0.156)(zod@3.25.76) + '@layerzerolabs/io-devtools': 0.3.2(ink-gradient@2.0.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink-table@3.1.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76) + '@layerzerolabs/lz-definitions': 3.0.156 + '@safe-global/api-kit': 4.0.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@safe-global/protocol-kit': 1.3.0(bufferutil@4.1.0)(ethers@5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + ethers: 5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + fp-ts: 2.16.11 + p-memoize: 4.0.4 + zod: 3.25.76 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - typescript + - utf-8-validate + + '@layerzerolabs/devtools-solana@3.0.6(7bcaf507b8ccf147de34f5c81d15d234)': + dependencies: + '@layerzerolabs/devtools': 2.0.5(@ethersproject/bytes@5.8.0)(@layerzerolabs/io-devtools@0.3.2(ink-gradient@2.0.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink-table@3.1.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76))(@layerzerolabs/lz-definitions@3.0.156)(zod@3.25.76) + '@layerzerolabs/io-devtools': 0.3.2(ink-gradient@2.0.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink-table@3.1.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76) + '@layerzerolabs/lz-definitions': 3.0.156 + '@solana-developers/helpers': 2.8.0(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + 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 + + '@layerzerolabs/devtools@2.0.5(@ethersproject/bytes@5.8.0)(@layerzerolabs/io-devtools@0.3.2(ink-gradient@2.0.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink-table@3.1.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76))(@layerzerolabs/lz-definitions@3.0.156)(zod@3.25.76)': + dependencies: + '@ethersproject/bytes': 5.8.0 + '@layerzerolabs/io-devtools': 0.3.2(ink-gradient@2.0.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink-table@3.1.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76) + '@layerzerolabs/lz-definitions': 3.0.156 + bs58: 6.0.0 + exponential-backoff: 3.1.3 + js-yaml: 4.1.1 + zod: 3.25.76 + + '@layerzerolabs/eslint-config-next@2.3.44(typescript@5.9.3)': + 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)(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@8.57.1)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) + eslint-plugin-prettier: 5.5.5(eslint-config-prettier@9.1.2(eslint@8.57.1))(eslint@8.57.1)(prettier@3.8.1) + eslint-plugin-unused-imports: 3.2.0(@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)(typescript@5.9.3))(eslint@8.57.1) + prettier: 3.8.1 + transitivePeerDependencies: + - '@types/eslint' + - eslint-import-resolver-webpack + - eslint-plugin-import-x + - supports-color + - typescript + + '@layerzerolabs/evm-sdks-core@3.0.156(bufferutil@4.1.0)(utf-8-validate@5.0.10)': + dependencies: + ethers: 5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@layerzerolabs/export-deployments@0.0.16': + dependencies: + typescript: 5.9.3 + + '@layerzerolabs/io-devtools@0.3.2(ink-gradient@2.0.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink-table@3.1.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76)': + dependencies: + chalk: 4.1.2 + logform: 2.7.0 + prompts: 2.4.2 + table: 6.8.2 + winston: 3.19.0 + zod: 3.25.76 + optionalDependencies: + ink: 3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10) + ink-gradient: 2.0.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2) + ink-table: 3.1.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2) + react: 17.0.2 + yoga-layout-prebuilt: 1.10.0 + + '@layerzerolabs/lz-core@3.0.156': {} + + '@layerzerolabs/lz-corekit-solana@3.0.156(bufferutil@4.1.0)(got@12.6.1)(typescript@5.9.3)(utf-8-validate@5.0.10)': + dependencies: + '@layerzerolabs/lz-core': 3.0.156 + '@layerzerolabs/lz-utilities': 3.0.156(bufferutil@4.1.0)(got@12.6.1)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@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(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@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(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@metaplex-foundation/umi-transaction-factory-web3js': 0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@noble/hashes': 1.8.0 + '@noble/secp256k1': 1.7.2 + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + 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 + + '@layerzerolabs/lz-definitions@3.0.156': + dependencies: + tiny-invariant: 1.3.3 + + '@layerzerolabs/lz-evm-messagelib-v2@3.0.156(@axelar-network/axelar-gmp-sdk-solidity@5.10.0)(@chainlink/contracts-ccip@0.7.6(bufferutil@4.1.0)(ethers@5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@eth-optimism/contracts@0.6.0(bufferutil@4.1.0)(ethers@5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@layerzerolabs/lz-evm-protocol-v2@3.0.156(@openzeppelin/contracts-upgradeable@5.4.0(@openzeppelin/contracts@5.4.0))(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4(bufferutil@4.1.0)(utf-8-validate@5.0.10))(solidity-bytes-utils@0.8.4))(@layerzerolabs/lz-evm-v1-0.7@3.0.156(@openzeppelin/contracts-upgradeable@5.4.0(@openzeppelin/contracts@5.4.0))(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(@openzeppelin/contracts-upgradeable@5.4.0(@openzeppelin/contracts@5.4.0))(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4(bufferutil@4.1.0)(utf-8-validate@5.0.10))(solidity-bytes-utils@0.8.4)': + dependencies: + '@axelar-network/axelar-gmp-sdk-solidity': 5.10.0 + '@chainlink/contracts-ccip': 0.7.6(bufferutil@4.1.0)(ethers@5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + '@eth-optimism/contracts': 0.6.0(bufferutil@4.1.0)(ethers@5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + '@layerzerolabs/lz-evm-protocol-v2': 3.0.156(@openzeppelin/contracts-upgradeable@5.4.0(@openzeppelin/contracts@5.4.0))(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4(bufferutil@4.1.0)(utf-8-validate@5.0.10))(solidity-bytes-utils@0.8.4) + '@layerzerolabs/lz-evm-v1-0.7': 3.0.156(@openzeppelin/contracts-upgradeable@5.4.0(@openzeppelin/contracts@5.4.0))(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@openzeppelin/contracts': 5.4.0 + '@openzeppelin/contracts-upgradeable': 5.4.0(@openzeppelin/contracts@5.4.0) + hardhat-deploy: 0.12.4(bufferutil@4.1.0)(utf-8-validate@5.0.10) + solidity-bytes-utils: 0.8.4 + + '@layerzerolabs/lz-evm-protocol-v2@3.0.156(@openzeppelin/contracts-upgradeable@5.4.0(@openzeppelin/contracts@5.4.0))(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4(bufferutil@4.1.0)(utf-8-validate@5.0.10))(solidity-bytes-utils@0.8.4)': + dependencies: + '@openzeppelin/contracts': 5.4.0 + '@openzeppelin/contracts-upgradeable': 5.4.0(@openzeppelin/contracts@5.4.0) + hardhat-deploy: 0.12.4(bufferutil@4.1.0)(utf-8-validate@5.0.10) + solidity-bytes-utils: 0.8.4 + + '@layerzerolabs/lz-evm-sdk-v1@3.0.156(bufferutil@4.1.0)(utf-8-validate@5.0.10)': + dependencies: + '@ethersproject/abi': 5.8.0 + '@ethersproject/providers': 5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@layerzerolabs/evm-sdks-core': 3.0.156(bufferutil@4.1.0)(utf-8-validate@5.0.10) + ethers: 5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@layerzerolabs/lz-evm-sdk-v2@3.0.156(bufferutil@4.1.0)(utf-8-validate@5.0.10)': + dependencies: + '@layerzerolabs/evm-sdks-core': 3.0.156(bufferutil@4.1.0)(utf-8-validate@5.0.10) + ethers: 5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@layerzerolabs/lz-evm-v1-0.7@3.0.156(@openzeppelin/contracts-upgradeable@5.4.0(@openzeppelin/contracts@5.4.0))(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4(bufferutil@4.1.0)(utf-8-validate@5.0.10))': + dependencies: + '@openzeppelin/contracts': 5.4.0 + '@openzeppelin/contracts-upgradeable': 5.4.0(@openzeppelin/contracts@5.4.0) + hardhat-deploy: 0.12.4(bufferutil@4.1.0)(utf-8-validate@5.0.10) + + '@layerzerolabs/lz-foundation@3.0.156(bufferutil@4.1.0)(got@12.6.1)(typescript@5.9.3)(utf-8-validate@5.0.10)': + dependencies: + '@layerzerolabs/lz-definitions': 3.0.156 + '@layerzerolabs/lz-utilities': 3.0.156(bufferutil@4.1.0)(got@12.6.1)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@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 + + '@layerzerolabs/lz-serdes@3.0.156(bufferutil@4.1.0)(got@12.6.1)(typescript@5.9.3)(utf-8-validate@5.0.10)': + dependencies: + '@coral-xyz/anchor': 0.29.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@layerzerolabs/lz-core': 3.0.156 + '@layerzerolabs/lz-utilities': 3.0.156(bufferutil@4.1.0)(got@12.6.1)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@layerzerolabs/tron-utilities': 3.0.156(bufferutil@4.1.0)(got@12.6.1)(typescript@5.9.3)(utf-8-validate@5.0.10) + aptos: 1.22.1(got@12.6.1) + bip39: 3.1.0 + ed25519-hd-key: 1.3.0 + ethers: 5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + memoizee: 0.4.17 + tronweb: 5.3.4(bufferutil@4.1.0)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - '@gql.tada/svelte-support' + - '@gql.tada/vue-support' + - bufferutil + - debug + - encoding + - got + - typescript + - utf-8-validate + + '@layerzerolabs/lz-solana-sdk-v2@3.0.156(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(got@12.6.1)(typescript@5.9.3)(utf-8-validate@5.0.10)': + dependencies: + '@layerzerolabs/lz-corekit-solana': 3.0.156(bufferutil@4.1.0)(got@12.6.1)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@layerzerolabs/lz-definitions': 3.0.156 + '@layerzerolabs/lz-foundation': 3.0.156(bufferutil@4.1.0)(got@12.6.1)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@layerzerolabs/lz-serdes': 3.0.156(bufferutil@4.1.0)(got@12.6.1)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@layerzerolabs/lz-utilities': 3.0.156(bufferutil@4.1.0)(got@12.6.1)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@layerzerolabs/lz-v2-utilities': 3.0.156 + '@metaplex-foundation/beet': 0.7.2 + '@metaplex-foundation/beet-solana': 0.4.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@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(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@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(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@metaplex-foundation/umi-web3js-adapters': 0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@solana/spl-token': 0.3.11(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + 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 + + '@layerzerolabs/lz-sui-oft-sdk-v2@3.0.156(typescript@5.9.3)': + dependencies: + '@layerzerolabs/lz-definitions': 3.0.156 + '@layerzerolabs/lz-sui-sdk-v2': 3.0.156(typescript@5.9.3) + '@mysten/sui': 1.45.2(typescript@5.9.3) + transitivePeerDependencies: + - '@gql.tada/svelte-support' + - '@gql.tada/vue-support' + - typescript + + '@layerzerolabs/lz-sui-sdk-v2@3.0.156(typescript@5.9.3)': + dependencies: + '@layerzerolabs/lz-definitions': 3.0.156 + '@mysten/sui': 1.45.2(typescript@5.9.3) + js-sha3: 0.8.0 + transitivePeerDependencies: + - '@gql.tada/svelte-support' + - '@gql.tada/vue-support' + - typescript + + '@layerzerolabs/lz-utilities@3.0.156(bufferutil@4.1.0)(got@12.6.1)(typescript@5.9.3)(utf-8-validate@5.0.10)': + dependencies: + '@ethersproject/bytes': 5.8.0 + '@initia/initia.js': 1.0.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@iota/iota-sdk': 1.10.1(typescript@5.9.3) + '@layerzerolabs/lz-definitions': 3.0.156 + '@mysten/sui': 1.45.2(typescript@5.9.3) + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@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))(@ton/crypto@3.3.0) + aptos: 1.22.1(got@12.6.1) + bip39: 3.1.0 + dayjs: 1.11.19 + ed25519-hd-key: 1.3.0 + ethers: 5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + 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 + + '@layerzerolabs/lz-v2-utilities@3.0.156': + 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 + + '@layerzerolabs/metadata-tools@3.0.3(@layerzerolabs/devtools-evm-hardhat@4.0.4(bd17817fbe618b486ab39186dfd61b3d))(@layerzerolabs/ua-devtools@5.0.2(2fd617c273bebe4d9e9cb36131e29510))': + dependencies: + '@layerzerolabs/devtools-evm-hardhat': 4.0.4(bd17817fbe618b486ab39186dfd61b3d) + '@layerzerolabs/ua-devtools': 5.0.2(2fd617c273bebe4d9e9cb36131e29510) + + '@layerzerolabs/oapp-evm@0.4.1(c1ec61c2fa4e9839f312831737d13b53)': + dependencies: + '@layerzerolabs/lz-evm-messagelib-v2': 3.0.156(@axelar-network/axelar-gmp-sdk-solidity@5.10.0)(@chainlink/contracts-ccip@0.7.6(bufferutil@4.1.0)(ethers@5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@eth-optimism/contracts@0.6.0(bufferutil@4.1.0)(ethers@5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@layerzerolabs/lz-evm-protocol-v2@3.0.156(@openzeppelin/contracts-upgradeable@5.4.0(@openzeppelin/contracts@5.4.0))(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4(bufferutil@4.1.0)(utf-8-validate@5.0.10))(solidity-bytes-utils@0.8.4))(@layerzerolabs/lz-evm-v1-0.7@3.0.156(@openzeppelin/contracts-upgradeable@5.4.0(@openzeppelin/contracts@5.4.0))(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(@openzeppelin/contracts-upgradeable@5.4.0(@openzeppelin/contracts@5.4.0))(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4(bufferutil@4.1.0)(utf-8-validate@5.0.10))(solidity-bytes-utils@0.8.4) + '@layerzerolabs/lz-evm-protocol-v2': 3.0.156(@openzeppelin/contracts-upgradeable@5.4.0(@openzeppelin/contracts@5.4.0))(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4(bufferutil@4.1.0)(utf-8-validate@5.0.10))(solidity-bytes-utils@0.8.4) + '@layerzerolabs/lz-evm-v1-0.7': 3.0.156(@openzeppelin/contracts-upgradeable@5.4.0(@openzeppelin/contracts@5.4.0))(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@openzeppelin/contracts': 5.4.0 + '@openzeppelin/contracts-upgradeable': 5.4.0(@openzeppelin/contracts@5.4.0) + ethers: 5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@layerzerolabs/oft-evm@4.0.1(3c0dd36ef62aad2617a6f8e84fa2fc5d)': + dependencies: + '@layerzerolabs/lz-evm-messagelib-v2': 3.0.156(@axelar-network/axelar-gmp-sdk-solidity@5.10.0)(@chainlink/contracts-ccip@0.7.6(bufferutil@4.1.0)(ethers@5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@eth-optimism/contracts@0.6.0(bufferutil@4.1.0)(ethers@5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@layerzerolabs/lz-evm-protocol-v2@3.0.156(@openzeppelin/contracts-upgradeable@5.4.0(@openzeppelin/contracts@5.4.0))(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4(bufferutil@4.1.0)(utf-8-validate@5.0.10))(solidity-bytes-utils@0.8.4))(@layerzerolabs/lz-evm-v1-0.7@3.0.156(@openzeppelin/contracts-upgradeable@5.4.0(@openzeppelin/contracts@5.4.0))(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(@openzeppelin/contracts-upgradeable@5.4.0(@openzeppelin/contracts@5.4.0))(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4(bufferutil@4.1.0)(utf-8-validate@5.0.10))(solidity-bytes-utils@0.8.4) + '@layerzerolabs/lz-evm-protocol-v2': 3.0.156(@openzeppelin/contracts-upgradeable@5.4.0(@openzeppelin/contracts@5.4.0))(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4(bufferutil@4.1.0)(utf-8-validate@5.0.10))(solidity-bytes-utils@0.8.4) + '@layerzerolabs/lz-evm-v1-0.7': 3.0.156(@openzeppelin/contracts-upgradeable@5.4.0(@openzeppelin/contracts@5.4.0))(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@layerzerolabs/oapp-evm': 0.4.1(c1ec61c2fa4e9839f312831737d13b53) + '@openzeppelin/contracts': 5.4.0 + '@openzeppelin/contracts-upgradeable': 5.4.0(@openzeppelin/contracts@5.4.0) + + '@layerzerolabs/oft-mint-burn-starknet@0.2.20(@layerzerolabs/protocol-starknet-v2@0.2.20)': + dependencies: + '@layerzerolabs/protocol-starknet-v2': 0.2.20 + + '@layerzerolabs/oft-v2-solana-sdk@3.0.156(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(got@12.6.1)(typescript@5.9.3)(utf-8-validate@5.0.10)': + dependencies: + '@ethersproject/bytes': 5.8.0 + '@layerzerolabs/lz-foundation': 3.0.156(bufferutil@4.1.0)(got@12.6.1)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@layerzerolabs/lz-solana-sdk-v2': 3.0.156(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(got@12.6.1)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@layerzerolabs/lz-v2-utilities': 3.0.156 + '@metaplex-foundation/beet': 0.7.2 + '@metaplex-foundation/beet-solana': 0.4.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@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(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@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(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + 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 + + '@layerzerolabs/prettier-config-next@2.3.44': + dependencies: + prettier: 3.8.1 + prettier-plugin-packagejson: 2.5.22(prettier@3.8.1) + prettier-plugin-solidity: 1.4.3(prettier@3.8.1) + + '@layerzerolabs/protocol-devtools-evm@5.0.2(33cc7f0bc733869899c8e881bf943c1c)': + 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(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@layerzerolabs/devtools': 2.0.5(@ethersproject/bytes@5.8.0)(@layerzerolabs/io-devtools@0.3.2(ink-gradient@2.0.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink-table@3.1.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76))(@layerzerolabs/lz-definitions@3.0.156)(zod@3.25.76) + '@layerzerolabs/devtools-evm': 3.0.2(ba1b8dd3c831373795921a05962d4f39) + '@layerzerolabs/io-devtools': 0.3.2(ink-gradient@2.0.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink-table@3.1.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76) + '@layerzerolabs/lz-definitions': 3.0.156 + '@layerzerolabs/protocol-devtools': 3.0.2(@layerzerolabs/devtools@2.0.5(@ethersproject/bytes@5.8.0)(@layerzerolabs/io-devtools@0.3.2(ink-gradient@2.0.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink-table@3.1.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76))(@layerzerolabs/lz-definitions@3.0.156)(zod@3.25.76))(@layerzerolabs/io-devtools@0.3.2(ink-gradient@2.0.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink-table@3.1.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76))(@layerzerolabs/lz-definitions@3.0.156)(zod@3.25.76) + p-memoize: 4.0.4 + zod: 3.25.76 + + '@layerzerolabs/protocol-devtools-solana@8.0.6(9a31ec2be9bb6e9e04112b31f8500670)': + dependencies: + '@layerzerolabs/devtools': 2.0.5(@ethersproject/bytes@5.8.0)(@layerzerolabs/io-devtools@0.3.2(ink-gradient@2.0.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink-table@3.1.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76))(@layerzerolabs/lz-definitions@3.0.156)(zod@3.25.76) + '@layerzerolabs/devtools-solana': 3.0.6(7bcaf507b8ccf147de34f5c81d15d234) + '@layerzerolabs/io-devtools': 0.3.2(ink-gradient@2.0.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink-table@3.1.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76) + '@layerzerolabs/lz-definitions': 3.0.156 + '@layerzerolabs/lz-solana-sdk-v2': 3.0.156(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(got@12.6.1)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@layerzerolabs/lz-v2-utilities': 3.0.156 + '@layerzerolabs/protocol-devtools': 3.0.2(@layerzerolabs/devtools@2.0.5(@ethersproject/bytes@5.8.0)(@layerzerolabs/io-devtools@0.3.2(ink-gradient@2.0.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink-table@3.1.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76))(@layerzerolabs/lz-definitions@3.0.156)(zod@3.25.76))(@layerzerolabs/io-devtools@0.3.2(ink-gradient@2.0.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink-table@3.1.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76))(@layerzerolabs/lz-definitions@3.0.156)(zod@3.25.76) + '@layerzerolabs/ua-devtools': 5.0.2(2fd617c273bebe4d9e9cb36131e29510) + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + fp-ts: 2.16.11 + zod: 3.25.76 + + '@layerzerolabs/protocol-devtools@3.0.2(@layerzerolabs/devtools@2.0.5(@ethersproject/bytes@5.8.0)(@layerzerolabs/io-devtools@0.3.2(ink-gradient@2.0.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink-table@3.1.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76))(@layerzerolabs/lz-definitions@3.0.156)(zod@3.25.76))(@layerzerolabs/io-devtools@0.3.2(ink-gradient@2.0.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink-table@3.1.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76))(@layerzerolabs/lz-definitions@3.0.156)(zod@3.25.76)': + dependencies: + '@layerzerolabs/devtools': 2.0.5(@ethersproject/bytes@5.8.0)(@layerzerolabs/io-devtools@0.3.2(ink-gradient@2.0.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink-table@3.1.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76))(@layerzerolabs/lz-definitions@3.0.156)(zod@3.25.76) + '@layerzerolabs/io-devtools': 0.3.2(ink-gradient@2.0.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink-table@3.1.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76) + '@layerzerolabs/lz-definitions': 3.0.156 + zod: 3.25.76 + + '@layerzerolabs/protocol-starknet-v2@0.2.20': {} + + '@layerzerolabs/solhint-config@3.0.156(typescript@5.9.3)': + dependencies: + solhint: 4.5.4(typescript@5.9.3) + transitivePeerDependencies: + - typescript + + '@layerzerolabs/test-devtools-evm-foundry@8.0.1(128b5fb4e94e2e1bbbe3bdce7ddbf0b9)': + dependencies: + '@layerzerolabs/lz-evm-messagelib-v2': 3.0.156(@axelar-network/axelar-gmp-sdk-solidity@5.10.0)(@chainlink/contracts-ccip@0.7.6(bufferutil@4.1.0)(ethers@5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@eth-optimism/contracts@0.6.0(bufferutil@4.1.0)(ethers@5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@layerzerolabs/lz-evm-protocol-v2@3.0.156(@openzeppelin/contracts-upgradeable@5.4.0(@openzeppelin/contracts@5.4.0))(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4(bufferutil@4.1.0)(utf-8-validate@5.0.10))(solidity-bytes-utils@0.8.4))(@layerzerolabs/lz-evm-v1-0.7@3.0.156(@openzeppelin/contracts-upgradeable@5.4.0(@openzeppelin/contracts@5.4.0))(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(@openzeppelin/contracts-upgradeable@5.4.0(@openzeppelin/contracts@5.4.0))(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4(bufferutil@4.1.0)(utf-8-validate@5.0.10))(solidity-bytes-utils@0.8.4) + '@layerzerolabs/lz-evm-protocol-v2': 3.0.156(@openzeppelin/contracts-upgradeable@5.4.0(@openzeppelin/contracts@5.4.0))(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4(bufferutil@4.1.0)(utf-8-validate@5.0.10))(solidity-bytes-utils@0.8.4) + '@layerzerolabs/lz-evm-v1-0.7': 3.0.156(@openzeppelin/contracts-upgradeable@5.4.0(@openzeppelin/contracts@5.4.0))(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@layerzerolabs/oapp-evm': 0.4.1(c1ec61c2fa4e9839f312831737d13b53) + '@layerzerolabs/oft-evm': 4.0.1(3c0dd36ef62aad2617a6f8e84fa2fc5d) + '@openzeppelin/contracts': 5.4.0 + '@openzeppelin/contracts-upgradeable': 5.4.0(@openzeppelin/contracts@5.4.0) + + '@layerzerolabs/test-devtools-evm-hardhat@0.5.3(hardhat@2.28.3(bufferutil@4.1.0)(ts-node@10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.18))(@types/node@18.18.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(solidity-bytes-utils@0.8.4)': + dependencies: + hardhat: 2.28.3(bufferutil@4.1.0)(ts-node@10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.18))(@types/node@18.18.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) + solidity-bytes-utils: 0.8.4 + + '@layerzerolabs/toolbox-foundry@0.1.13': {} + + '@layerzerolabs/toolbox-hardhat@0.6.13(e174733816a20ea8b7a0ccb42b2ef14b)': + 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.5(@ethersproject/bytes@5.8.0)(@layerzerolabs/io-devtools@0.3.2(ink-gradient@2.0.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink-table@3.1.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76))(@layerzerolabs/lz-definitions@3.0.156)(zod@3.25.76) + '@layerzerolabs/devtools-evm': 3.0.2(ba1b8dd3c831373795921a05962d4f39) + '@layerzerolabs/devtools-evm-hardhat': 4.0.4(bd17817fbe618b486ab39186dfd61b3d) + '@layerzerolabs/io-devtools': 0.3.2(ink-gradient@2.0.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink-table@3.1.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76) + '@layerzerolabs/lz-definitions': 3.0.156 + '@layerzerolabs/lz-evm-sdk-v1': 3.0.156(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@layerzerolabs/lz-evm-sdk-v2': 3.0.156(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@layerzerolabs/lz-v2-utilities': 3.0.156 + '@layerzerolabs/protocol-devtools': 3.0.2(@layerzerolabs/devtools@2.0.5(@ethersproject/bytes@5.8.0)(@layerzerolabs/io-devtools@0.3.2(ink-gradient@2.0.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink-table@3.1.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76))(@layerzerolabs/lz-definitions@3.0.156)(zod@3.25.76))(@layerzerolabs/io-devtools@0.3.2(ink-gradient@2.0.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink-table@3.1.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76))(@layerzerolabs/lz-definitions@3.0.156)(zod@3.25.76) + '@layerzerolabs/protocol-devtools-evm': 5.0.2(33cc7f0bc733869899c8e881bf943c1c) + '@layerzerolabs/test-devtools-evm-hardhat': 0.5.3(hardhat@2.28.3(bufferutil@4.1.0)(ts-node@10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.18))(@types/node@18.18.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(solidity-bytes-utils@0.8.4) + '@layerzerolabs/ua-devtools': 5.0.2(2fd617c273bebe4d9e9cb36131e29510) + '@layerzerolabs/ua-devtools-evm': 7.0.1(92ebb0c070cf4b1b3ffeb57cc8992705) + '@layerzerolabs/ua-devtools-evm-hardhat': 9.0.2(72d215c29c4022f28081b04b7c4ee7d4) + '@nomicfoundation/hardhat-ethers': 3.1.3(ethers@5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(hardhat@2.28.3(bufferutil@4.1.0)(ts-node@10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.18))(@types/node@18.18.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + ethers: 5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + fp-ts: 2.16.11 + hardhat: 2.28.3(bufferutil@4.1.0)(ts-node@10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.18))(@types/node@18.18.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) + hardhat-deploy: 0.12.4(bufferutil@4.1.0)(utf-8-validate@5.0.10) + ink: 3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10) + ink-gradient: 2.0.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2) + ink-table: 3.1.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(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 + - typescript + - utf-8-validate + + '@layerzerolabs/tron-utilities@3.0.156(bufferutil@4.1.0)(got@12.6.1)(typescript@5.9.3)(utf-8-validate@5.0.10)': + dependencies: + '@layerzerolabs/lz-utilities': 3.0.156(bufferutil@4.1.0)(got@12.6.1)(typescript@5.9.3)(utf-8-validate@5.0.10) + ethers: 5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + tronweb: 5.3.4(bufferutil@4.1.0)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - '@gql.tada/svelte-support' + - '@gql.tada/vue-support' + - bufferutil + - debug + - encoding + - got + - typescript + - utf-8-validate + + '@layerzerolabs/ua-devtools-evm-hardhat@9.0.2(72d215c29c4022f28081b04b7c4ee7d4)': + 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.5(@ethersproject/bytes@5.8.0)(@layerzerolabs/io-devtools@0.3.2(ink-gradient@2.0.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink-table@3.1.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76))(@layerzerolabs/lz-definitions@3.0.156)(zod@3.25.76) + '@layerzerolabs/devtools-evm': 3.0.2(ba1b8dd3c831373795921a05962d4f39) + '@layerzerolabs/devtools-evm-hardhat': 4.0.4(bd17817fbe618b486ab39186dfd61b3d) + '@layerzerolabs/io-devtools': 0.3.2(ink-gradient@2.0.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink-table@3.1.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76) + '@layerzerolabs/lz-definitions': 3.0.156 + '@layerzerolabs/protocol-devtools': 3.0.2(@layerzerolabs/devtools@2.0.5(@ethersproject/bytes@5.8.0)(@layerzerolabs/io-devtools@0.3.2(ink-gradient@2.0.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink-table@3.1.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76))(@layerzerolabs/lz-definitions@3.0.156)(zod@3.25.76))(@layerzerolabs/io-devtools@0.3.2(ink-gradient@2.0.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink-table@3.1.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76))(@layerzerolabs/lz-definitions@3.0.156)(zod@3.25.76) + '@layerzerolabs/protocol-devtools-evm': 5.0.2(33cc7f0bc733869899c8e881bf943c1c) + '@layerzerolabs/ua-devtools': 5.0.2(2fd617c273bebe4d9e9cb36131e29510) + '@layerzerolabs/ua-devtools-evm': 7.0.1(92ebb0c070cf4b1b3ffeb57cc8992705) + ethers: 5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + hardhat: 2.28.3(bufferutil@4.1.0)(ts-node@10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.18))(@types/node@18.18.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) + hardhat-deploy: 0.12.4(bufferutil@4.1.0)(utf-8-validate@5.0.10) + p-memoize: 4.0.4 + typescript: 5.9.3 + + '@layerzerolabs/ua-devtools-evm@7.0.1(92ebb0c070cf4b1b3ffeb57cc8992705)': + dependencies: + '@ethersproject/constants': 5.8.0 + '@ethersproject/contracts': 5.8.0 + '@layerzerolabs/devtools': 2.0.5(@ethersproject/bytes@5.8.0)(@layerzerolabs/io-devtools@0.3.2(ink-gradient@2.0.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink-table@3.1.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76))(@layerzerolabs/lz-definitions@3.0.156)(zod@3.25.76) + '@layerzerolabs/devtools-evm': 3.0.2(ba1b8dd3c831373795921a05962d4f39) + '@layerzerolabs/io-devtools': 0.3.2(ink-gradient@2.0.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink-table@3.1.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76) + '@layerzerolabs/lz-definitions': 3.0.156 + '@layerzerolabs/lz-v2-utilities': 3.0.156 + '@layerzerolabs/protocol-devtools': 3.0.2(@layerzerolabs/devtools@2.0.5(@ethersproject/bytes@5.8.0)(@layerzerolabs/io-devtools@0.3.2(ink-gradient@2.0.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink-table@3.1.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76))(@layerzerolabs/lz-definitions@3.0.156)(zod@3.25.76))(@layerzerolabs/io-devtools@0.3.2(ink-gradient@2.0.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink-table@3.1.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76))(@layerzerolabs/lz-definitions@3.0.156)(zod@3.25.76) + '@layerzerolabs/protocol-devtools-evm': 5.0.2(33cc7f0bc733869899c8e881bf943c1c) + '@layerzerolabs/ua-devtools': 5.0.2(2fd617c273bebe4d9e9cb36131e29510) + p-memoize: 4.0.4 + zod: 3.25.76 + + '@layerzerolabs/ua-devtools-solana@8.0.7(46edc29d709e8246275b097e2042fcad)': + dependencies: + '@layerzerolabs/devtools': 2.0.5(@ethersproject/bytes@5.8.0)(@layerzerolabs/io-devtools@0.3.2(ink-gradient@2.0.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink-table@3.1.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76))(@layerzerolabs/lz-definitions@3.0.156)(zod@3.25.76) + '@layerzerolabs/devtools-solana': 3.0.6(7bcaf507b8ccf147de34f5c81d15d234) + '@layerzerolabs/io-devtools': 0.3.2(ink-gradient@2.0.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink-table@3.1.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76) + '@layerzerolabs/lz-definitions': 3.0.156 + '@layerzerolabs/lz-solana-sdk-v2': 3.0.156(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(got@12.6.1)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@layerzerolabs/lz-v2-utilities': 3.0.156 + '@layerzerolabs/oft-v2-solana-sdk': 3.0.156(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(got@12.6.1)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@layerzerolabs/protocol-devtools': 3.0.2(@layerzerolabs/devtools@2.0.5(@ethersproject/bytes@5.8.0)(@layerzerolabs/io-devtools@0.3.2(ink-gradient@2.0.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink-table@3.1.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76))(@layerzerolabs/lz-definitions@3.0.156)(zod@3.25.76))(@layerzerolabs/io-devtools@0.3.2(ink-gradient@2.0.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink-table@3.1.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76))(@layerzerolabs/lz-definitions@3.0.156)(zod@3.25.76) + '@layerzerolabs/protocol-devtools-solana': 8.0.6(9a31ec2be9bb6e9e04112b31f8500670) + '@layerzerolabs/ua-devtools': 5.0.2(2fd617c273bebe4d9e9cb36131e29510) + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + fp-ts: 2.16.11 + p-memoize: 4.0.4 + zod: 3.25.76 + + '@layerzerolabs/ua-devtools@5.0.2(2fd617c273bebe4d9e9cb36131e29510)': + dependencies: + '@layerzerolabs/devtools': 2.0.5(@ethersproject/bytes@5.8.0)(@layerzerolabs/io-devtools@0.3.2(ink-gradient@2.0.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink-table@3.1.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76))(@layerzerolabs/lz-definitions@3.0.156)(zod@3.25.76) + '@layerzerolabs/io-devtools': 0.3.2(ink-gradient@2.0.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink-table@3.1.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76) + '@layerzerolabs/lz-definitions': 3.0.156 + '@layerzerolabs/lz-v2-utilities': 3.0.156 + '@layerzerolabs/protocol-devtools': 3.0.2(@layerzerolabs/devtools@2.0.5(@ethersproject/bytes@5.8.0)(@layerzerolabs/io-devtools@0.3.2(ink-gradient@2.0.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink-table@3.1.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76))(@layerzerolabs/lz-definitions@3.0.156)(zod@3.25.76))(@layerzerolabs/io-devtools@0.3.2(ink-gradient@2.0.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink-table@3.1.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2))(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76))(@layerzerolabs/lz-definitions@3.0.156)(zod@3.25.76) + zod: 3.25.76 + + '@ledgerhq/devices@8.10.0': + dependencies: + '@ledgerhq/errors': 6.29.0 + '@ledgerhq/logs': 6.14.0 + rxjs: 7.8.2 + semver: 7.7.3 + + '@ledgerhq/errors@6.29.0': {} + + '@ledgerhq/hw-transport-webhid@6.31.0': + dependencies: + '@ledgerhq/devices': 8.10.0 + '@ledgerhq/errors': 6.29.0 + '@ledgerhq/hw-transport': 6.32.0 + '@ledgerhq/logs': 6.14.0 + + '@ledgerhq/hw-transport-webusb@6.30.0': + dependencies: + '@ledgerhq/devices': 8.10.0 + '@ledgerhq/errors': 6.29.0 + '@ledgerhq/hw-transport': 6.32.0 + '@ledgerhq/logs': 6.14.0 + + '@ledgerhq/hw-transport@6.32.0': + dependencies: + '@ledgerhq/devices': 8.10.0 + '@ledgerhq/errors': 6.29.0 + '@ledgerhq/logs': 6.14.0 + events: 3.3.0 + + '@ledgerhq/logs@6.14.0': {} + + '@mdn/browser-compat-data@5.7.6': {} + + '@metaplex-foundation/beet-solana@0.4.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)': + dependencies: + '@metaplex-foundation/beet': 0.7.2 + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + bs58: 5.0.0 + debug: 4.4.3(supports-color@8.1.1) + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - typescript + - utf-8-validate + + '@metaplex-foundation/beet@0.7.2': + 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 + + '@metaplex-foundation/mpl-token-metadata@3.4.0(@metaplex-foundation/umi@0.9.2)': + dependencies: + '@metaplex-foundation/mpl-toolbox': 0.10.0(@metaplex-foundation/umi@0.9.2) + '@metaplex-foundation/umi': 0.9.2 + + '@metaplex-foundation/mpl-toolbox@0.10.0(@metaplex-foundation/umi@0.9.2)': + dependencies: + '@metaplex-foundation/umi': 0.9.2 + + '@metaplex-foundation/mpl-toolbox@0.9.4(@metaplex-foundation/umi@0.9.2)': + dependencies: + '@metaplex-foundation/umi': 0.9.2 + + '@metaplex-foundation/umi-bundle-defaults@0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))': + 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(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@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(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@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(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - encoding + + '@metaplex-foundation/umi-downloader-http@0.9.2(@metaplex-foundation/umi@0.9.2)': + dependencies: + '@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(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))': + 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(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@noble/curves': 1.9.7 + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + + '@metaplex-foundation/umi-http-fetch@0.9.2(@metaplex-foundation/umi@0.9.2)': + dependencies: + '@metaplex-foundation/umi': 0.9.2 + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + + '@metaplex-foundation/umi-options@0.8.9': {} + + '@metaplex-foundation/umi-program-repository@0.9.2(@metaplex-foundation/umi@0.9.2)': + dependencies: + '@metaplex-foundation/umi': 0.9.2 + + '@metaplex-foundation/umi-public-keys@0.8.9': + dependencies: + '@metaplex-foundation/umi-serializers-encodings': 0.8.9 + + '@metaplex-foundation/umi-rpc-chunk-get-accounts@0.9.2(@metaplex-foundation/umi@0.9.2)': + dependencies: + '@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(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))': + 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(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + + '@metaplex-foundation/umi-serializer-data-view@0.9.2(@metaplex-foundation/umi@0.9.2)': + dependencies: + '@metaplex-foundation/umi': 0.9.2 + + '@metaplex-foundation/umi-serializers-core@0.8.9': {} + + '@metaplex-foundation/umi-serializers-encodings@0.8.9': + dependencies: + '@metaplex-foundation/umi-serializers-core': 0.8.9 + + '@metaplex-foundation/umi-serializers-numbers@0.8.9': + dependencies: + '@metaplex-foundation/umi-serializers-core': 0.8.9 + + '@metaplex-foundation/umi-serializers@0.9.0': + 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 + + '@metaplex-foundation/umi-transaction-factory-web3js@0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))': + 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(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + + '@metaplex-foundation/umi-web3js-adapters@0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))': + dependencies: + '@metaplex-foundation/umi': 0.9.2 + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + buffer: 6.0.3 + + '@metaplex-foundation/umi@0.9.2': + dependencies: + '@metaplex-foundation/umi-options': 0.8.9 + '@metaplex-foundation/umi-public-keys': 0.8.9 + '@metaplex-foundation/umi-serializers': 0.9.0 + + '@mysten/bcs@1.9.2': + dependencies: + '@mysten/utils': 0.2.0 + '@scure/base': 1.2.6 + + '@mysten/sui@1.45.2(typescript@5.9.3)': + dependencies: + '@graphql-typed-document-node/core': 3.2.0(graphql@16.12.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.9.0(graphql@16.12.0)(typescript@5.9.3) + graphql: 16.12.0 + poseidon-lite: 0.2.1 + valibot: 1.2.0(typescript@5.9.3) + transitivePeerDependencies: + - '@gql.tada/svelte-support' + - '@gql.tada/vue-support' + - typescript + + '@mysten/utils@0.2.0': + dependencies: + '@scure/base': 1.2.6 + + '@napi-rs/wasm-runtime@0.2.12': + dependencies: + '@emnapi/core': 1.8.1 + '@emnapi/runtime': 1.8.1 + '@tybys/wasm-util': 0.10.1 + optional: true + + '@noble/ciphers@1.3.0': {} + + '@noble/curves@1.4.2': + dependencies: + '@noble/hashes': 1.4.0 + + '@noble/curves@1.7.0': + dependencies: + '@noble/hashes': 1.6.0 + + '@noble/curves@1.8.2': + dependencies: + '@noble/hashes': 1.7.2 + + '@noble/curves@1.9.1': + dependencies: + '@noble/hashes': 1.8.0 + + '@noble/curves@1.9.4': + dependencies: + '@noble/hashes': 1.8.0 + + '@noble/curves@1.9.7': + dependencies: + '@noble/hashes': 1.8.0 + + '@noble/ed25519@1.7.5': {} + + '@noble/hashes@1.2.0': {} + + '@noble/hashes@1.3.3': {} + + '@noble/hashes@1.4.0': {} + + '@noble/hashes@1.6.0': {} + + '@noble/hashes@1.6.1': {} + + '@noble/hashes@1.7.2': {} + + '@noble/hashes@1.8.0': {} + + '@noble/secp256k1@1.7.1': {} + + '@noble/secp256k1@1.7.2': {} + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.20.1 + + '@nolyfill/is-core-module@1.0.39': {} + + '@nomicfoundation/edr-darwin-arm64@0.12.0-next.22': {} + + '@nomicfoundation/edr-darwin-x64@0.12.0-next.22': {} + + '@nomicfoundation/edr-linux-arm64-gnu@0.12.0-next.22': {} + + '@nomicfoundation/edr-linux-arm64-musl@0.12.0-next.22': {} + + '@nomicfoundation/edr-linux-x64-gnu@0.12.0-next.22': {} + + '@nomicfoundation/edr-linux-x64-musl@0.12.0-next.22': {} + + '@nomicfoundation/edr-win32-x64-msvc@0.12.0-next.22': {} + + '@nomicfoundation/edr@0.12.0-next.22': + dependencies: + '@nomicfoundation/edr-darwin-arm64': 0.12.0-next.22 + '@nomicfoundation/edr-darwin-x64': 0.12.0-next.22 + '@nomicfoundation/edr-linux-arm64-gnu': 0.12.0-next.22 + '@nomicfoundation/edr-linux-arm64-musl': 0.12.0-next.22 + '@nomicfoundation/edr-linux-x64-gnu': 0.12.0-next.22 + '@nomicfoundation/edr-linux-x64-musl': 0.12.0-next.22 + '@nomicfoundation/edr-win32-x64-msvc': 0.12.0-next.22 + + '@nomicfoundation/hardhat-ethers@3.1.3(ethers@5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(hardhat@2.28.3(bufferutil@4.1.0)(ts-node@10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.18))(@types/node@18.18.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))': + dependencies: + debug: 4.4.3(supports-color@8.1.1) + ethers: 5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + hardhat: 2.28.3(bufferutil@4.1.0)(ts-node@10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.18))(@types/node@18.18.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) + lodash.isequal: 4.5.0 + transitivePeerDependencies: + - supports-color + + '@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.2': + optional: true + + '@nomicfoundation/solidity-analyzer-darwin-x64@0.1.2': + optional: true + + '@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.2': + optional: true + + '@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.2': + optional: true + + '@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.2': + optional: true + + '@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.2': + optional: true + + '@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.2': + optional: true + + '@nomicfoundation/solidity-analyzer@0.1.2': + 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 + + '@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(hardhat@2.28.3(bufferutil@4.1.0)(ts-node@10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.18))(@types/node@18.18.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))': + dependencies: + ethers: 5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + hardhat: 2.28.3(bufferutil@4.1.0)(ts-node@10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.18))(@types/node@18.18.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) + + '@nomiclabs/hardhat-waffle@2.0.6(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(hardhat@2.28.3(bufferutil@4.1.0)(ts-node@10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.18))(@types/node@18.18.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(@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(bufferutil@4.1.0)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(typescript@5.9.3))(ethers@5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(hardhat@2.28.3(bufferutil@4.1.0)(ts-node@10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.18))(@types/node@18.18.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))': + dependencies: + '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(hardhat@2.28.3(bufferutil@4.1.0)(ts-node@10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.18))(@types/node@18.18.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@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(bufferutil@4.1.0)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(typescript@5.9.3) + ethers: 5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + hardhat: 2.28.3(bufferutil@4.1.0)(ts-node@10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.18))(@types/node@18.18.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) + + '@openzeppelin/contracts-upgradeable@4.7.3': {} + + '@openzeppelin/contracts-upgradeable@5.4.0(@openzeppelin/contracts@5.4.0)': + dependencies: + '@openzeppelin/contracts': 5.4.0 + + '@openzeppelin/contracts@3.4.2': {} + + '@openzeppelin/contracts@4.3.3': {} + + '@openzeppelin/contracts@5.4.0': {} + + '@peculiar/asn1-schema@2.6.0': + dependencies: + asn1js: 3.0.7 + pvtsutils: 1.3.6 + tslib: 2.8.1 + optional: true + + '@pkgr/core@0.2.9': {} + + '@pnpm/config.env-replace@1.1.0': {} + + '@pnpm/network.ca-file@1.0.2': + dependencies: + graceful-fs: 4.2.10 + + '@pnpm/npm-conf@3.0.2': + dependencies: + '@pnpm/config.env-replace': 1.1.0 + '@pnpm/network.ca-file': 1.0.2 + config-chain: 1.1.13 + + '@protobuf-ts/grpcweb-transport@2.11.1': + dependencies: + '@protobuf-ts/runtime': 2.11.1 + '@protobuf-ts/runtime-rpc': 2.11.1 + + '@protobuf-ts/runtime-rpc@2.11.1': + dependencies: + '@protobuf-ts/runtime': 2.11.1 + + '@protobuf-ts/runtime@2.11.1': {} + + '@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': + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/inquire': 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': {} + + '@resolver-engine/core@0.3.3': + dependencies: + debug: 3.2.7 + is-url: 1.2.4 + request: 2.88.2 + transitivePeerDependencies: + - supports-color + + '@resolver-engine/fs@0.3.3': + dependencies: + '@resolver-engine/core': 0.3.3 + debug: 3.2.7 + transitivePeerDependencies: + - supports-color + + '@resolver-engine/imports-fs@0.3.3': + dependencies: + '@resolver-engine/fs': 0.3.3 + '@resolver-engine/imports': 0.3.3 + debug: 3.2.7 + transitivePeerDependencies: + - supports-color + + '@resolver-engine/imports@0.3.3': + 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 + + '@rtsao/scc@1.1.0': {} + + '@rushstack/eslint-patch@1.15.0': {} + + '@safe-global/api-kit@4.0.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@safe-global/protocol-kit': 6.1.2(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@safe-global/types-kit': 3.0.0(typescript@5.9.3)(zod@3.25.76) + node-fetch: 2.7.0 + viem: 2.45.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + transitivePeerDependencies: + - bufferutil + - encoding + - typescript + - utf-8-validate + - zod + + '@safe-global/protocol-kit@1.3.0(bufferutil@4.1.0)(ethers@5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': + dependencies: + '@ethersproject/address': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/solidity': 5.8.0 + '@safe-global/safe-deployments': 1.37.50 + ethereumjs-util: 7.1.5 + semver: 7.7.3 + web3: 1.10.4(bufferutil@4.1.0)(utf-8-validate@5.0.10) + web3-core: 1.10.4 + web3-utils: 1.10.4 + zksync-web3: 0.14.4(ethers@5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + transitivePeerDependencies: + - bufferutil + - encoding + - ethers + - supports-color + - utf-8-validate + + '@safe-global/protocol-kit@6.1.2(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@safe-global/safe-deployments': 1.37.50 + '@safe-global/safe-modules-deployments': 2.2.22 + '@safe-global/types-kit': 3.0.0(typescript@5.9.3)(zod@3.25.76) + abitype: 1.2.3(typescript@5.9.3)(zod@3.25.76) + semver: 7.7.3 + viem: 2.45.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + optionalDependencies: + '@noble/curves': 1.9.7 + '@peculiar/asn1-schema': 2.6.0 + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + - zod + + '@safe-global/safe-core-sdk-types@2.3.0': + dependencies: + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/contracts': 5.8.0 + '@safe-global/safe-deployments': 1.37.50 + web3-core: 1.10.4 + web3-utils: 1.10.4 + transitivePeerDependencies: + - encoding + - supports-color + + '@safe-global/safe-deployments@1.37.50': + dependencies: + semver: 7.7.3 + + '@safe-global/safe-modules-deployments@2.2.22': {} + + '@safe-global/types-kit@3.0.0(typescript@5.9.3)(zod@3.25.76)': + dependencies: + abitype: 1.2.3(typescript@5.9.3)(zod@3.25.76) + transitivePeerDependencies: + - typescript + - zod + + '@scure/base@1.1.9': {} + + '@scure/base@1.2.6': {} + + '@scure/bip32@1.1.5': + dependencies: + '@noble/hashes': 1.2.0 + '@noble/secp256k1': 1.7.1 + '@scure/base': 1.1.9 + + '@scure/bip32@1.4.0': + dependencies: + '@noble/curves': 1.4.2 + '@noble/hashes': 1.4.0 + '@scure/base': 1.1.9 + + '@scure/bip32@1.7.0': + dependencies: + '@noble/curves': 1.9.4 + '@noble/hashes': 1.8.0 + '@scure/base': 1.2.6 + + '@scure/bip39@1.1.1': + dependencies: + '@noble/hashes': 1.2.0 + '@scure/base': 1.1.9 + + '@scure/bip39@1.2.1': + dependencies: + '@noble/hashes': 1.3.3 + '@scure/base': 1.1.9 + + '@scure/bip39@1.3.0': + dependencies: + '@noble/hashes': 1.4.0 + '@scure/base': 1.1.9 + + '@scure/bip39@1.6.0': + dependencies: + '@noble/hashes': 1.8.0 + '@scure/base': 1.2.6 + + '@scure/starknet@1.1.0': + dependencies: + '@noble/curves': 1.7.0 + '@noble/hashes': 1.6.1 + + '@sentry/core@5.30.0': + 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 + + '@sentry/hub@5.30.0': + dependencies: + '@sentry/types': 5.30.0 + '@sentry/utils': 5.30.0 + tslib: 1.14.1 + + '@sentry/minimal@5.30.0': + dependencies: + '@sentry/hub': 5.30.0 + '@sentry/types': 5.30.0 + tslib: 1.14.1 + + '@sentry/node@5.30.0': + 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 + + '@sentry/tracing@5.30.0': + 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 + + '@sentry/types@5.30.0': {} + + '@sentry/utils@5.30.0': + dependencies: + '@sentry/types': 5.30.0 + tslib: 1.14.1 + + '@sinclair/typebox@0.27.8': {} + + '@sinclair/typebox@0.34.48': {} + + '@sindresorhus/is@4.6.0': {} + + '@sindresorhus/is@5.6.0': {} + + '@sinonjs/commons@3.0.1': + dependencies: + type-detect: 4.0.8 + + '@sinonjs/fake-timers@10.3.0': + dependencies: + '@sinonjs/commons': 3.0.1 + + '@so-ric/colorspace@1.1.6': + dependencies: + color: 5.0.3 + text-hex: 1.0.0 + + '@solana-developers/helpers@2.8.0(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10)': + dependencies: + '@coral-xyz/anchor': 0.30.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@solana/spl-token': 0.4.14(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@solana/spl-token-metadata': 0.1.6(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + bn.js: 5.2.2 + bs58: 6.0.0 + dotenv: 16.6.1 + transitivePeerDependencies: + - bufferutil + - encoding + - fastestsmallesttextencoderdecoder + - typescript + - utf-8-validate + + '@solana-developers/helpers@2.8.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10)': + dependencies: + '@coral-xyz/anchor': 0.30.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@solana/spl-token': 0.4.14(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@solana/spl-token-metadata': 0.1.6(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + bn.js: 5.2.2 + bs58: 6.0.0 + dotenv: 16.6.1 + transitivePeerDependencies: + - bufferutil + - encoding + - fastestsmallesttextencoderdecoder + - typescript + - utf-8-validate + + '@solana/buffer-layout-utils@0.2.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)': + dependencies: + '@solana/buffer-layout': 4.0.1 + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + bigint-buffer: 1.1.5 + bignumber.js: 9.3.1 + transitivePeerDependencies: + - bufferutil + - encoding + - typescript + - utf-8-validate + + '@solana/buffer-layout@4.0.1': + dependencies: + buffer: 6.0.3 + + '@solana/codecs-core@2.0.0-rc.1(typescript@5.9.3)': + dependencies: + '@solana/errors': 2.0.0-rc.1(typescript@5.9.3) + typescript: 5.9.3 + + '@solana/codecs-core@2.3.0(typescript@5.9.3)': + dependencies: + '@solana/errors': 2.3.0(typescript@5.9.3) + typescript: 5.9.3 + + '@solana/codecs-data-structures@2.0.0-rc.1(typescript@5.9.3)': + 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 + + '@solana/codecs-numbers@2.0.0-rc.1(typescript@5.9.3)': + 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 + + '@solana/codecs-numbers@2.3.0(typescript@5.9.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 + + '@solana/codecs-strings@2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + 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 + + '@solana/codecs@2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + 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 + + '@solana/errors@2.0.0-rc.1(typescript@5.9.3)': + dependencies: + chalk: 5.6.2 + commander: 12.1.0 + typescript: 5.9.3 + + '@solana/errors@2.3.0(typescript@5.9.3)': + dependencies: + chalk: 5.6.2 + commander: 14.0.2 + typescript: 5.9.3 + + '@solana/options@2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + 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 + + '@solana/spl-token-group@0.0.7(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/codecs': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + - typescript + + '@solana/spl-token-metadata@0.1.6(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/codecs': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + - typescript + + '@solana/spl-token@0.3.11(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10)': + dependencies: + '@solana/buffer-layout': 4.0.1 + '@solana/buffer-layout-utils': 0.2.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@solana/spl-token-metadata': 0.1.6(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + buffer: 6.0.3 + transitivePeerDependencies: + - bufferutil + - encoding + - fastestsmallesttextencoderdecoder + - typescript + - utf-8-validate + + '@solana/spl-token@0.4.14(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10)': + dependencies: + '@solana/buffer-layout': 4.0.1 + '@solana/buffer-layout-utils': 0.2.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@solana/spl-token-group': 0.0.7(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/spl-token-metadata': 0.1.6(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + buffer: 6.0.3 + transitivePeerDependencies: + - bufferutil + - encoding + - fastestsmallesttextencoderdecoder + - typescript + - utf-8-validate + + '@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)': + dependencies: + '@babel/runtime': 7.28.6 + '@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.3.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + node-fetch: 2.7.0 + rpc-websockets: 9.3.3 + superstruct: 2.0.2 + transitivePeerDependencies: + - bufferutil + - encoding + - typescript + - utf-8-validate + + '@solidity-parser/parser@0.18.0': {} + + '@solidity-parser/parser@0.20.2': {} + + '@sqds/sdk@2.0.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)': + dependencies: + '@coral-xyz/anchor': 0.26.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + bn.js: 5.2.2 + transitivePeerDependencies: + - bufferutil + - encoding + - typescript + - utf-8-validate + + '@starknet-io/types-js@0.8.4': {} + + '@starknet-io/types-js@0.9.2': {} + + '@suchipi/femver@1.0.0': {} + + '@swc/core-darwin-arm64@1.15.10': + optional: true + + '@swc/core-darwin-x64@1.15.10': + optional: true + + '@swc/core-linux-arm-gnueabihf@1.15.10': + optional: true + + '@swc/core-linux-arm64-gnu@1.15.10': + optional: true + + '@swc/core-linux-arm64-musl@1.15.10': + optional: true + + '@swc/core-linux-x64-gnu@1.15.10': + optional: true + + '@swc/core-linux-x64-musl@1.15.10': + optional: true + + '@swc/core-win32-arm64-msvc@1.15.10': + optional: true + + '@swc/core-win32-ia32-msvc@1.15.10': + optional: true + + '@swc/core-win32-x64-msvc@1.15.10': + optional: true + + '@swc/core@1.15.10(@swc/helpers@0.5.18)': + dependencies: + '@swc/counter': 0.1.3 + '@swc/types': 0.1.25 + optionalDependencies: + '@swc/core-darwin-arm64': 1.15.10 + '@swc/core-darwin-x64': 1.15.10 + '@swc/core-linux-arm-gnueabihf': 1.15.10 + '@swc/core-linux-arm64-gnu': 1.15.10 + '@swc/core-linux-arm64-musl': 1.15.10 + '@swc/core-linux-x64-gnu': 1.15.10 + '@swc/core-linux-x64-musl': 1.15.10 + '@swc/core-win32-arm64-msvc': 1.15.10 + '@swc/core-win32-ia32-msvc': 1.15.10 + '@swc/core-win32-x64-msvc': 1.15.10 + '@swc/helpers': 0.5.18 + + '@swc/counter@0.1.3': {} + + '@swc/helpers@0.5.18': + dependencies: + tslib: 2.8.1 + + '@swc/jest@0.2.39(@swc/core@1.15.10(@swc/helpers@0.5.18))': + dependencies: + '@jest/create-cache-key-function': 30.2.0 + '@swc/core': 1.15.10(@swc/helpers@0.5.18) + '@swc/counter': 0.1.3 + jsonc-parser: 3.3.1 + + '@swc/types@0.1.25': + dependencies: + '@swc/counter': 0.1.3 + + '@szmarczak/http-timer@4.0.6': + dependencies: + defer-to-connect: 2.0.1 + + '@szmarczak/http-timer@5.0.1': + dependencies: + defer-to-connect: 2.0.1 + + '@ton/core@0.59.1(@ton/crypto@3.3.0)': + dependencies: + '@ton/crypto': 3.3.0 + symbol.inspect: 1.0.1 + + '@ton/crypto-primitives@2.1.0': + dependencies: + jssha: 3.2.0 + + '@ton/crypto@3.3.0': + dependencies: + '@ton/crypto-primitives': 2.1.0 + jssha: 3.2.0 + tweetnacl: 1.0.3 + + '@ton/ton@15.1.0(@ton/core@0.59.1(@ton/crypto@3.3.0))(@ton/crypto@3.3.0)': + dependencies: + '@ton/core': 0.59.1(@ton/crypto@3.3.0) + '@ton/crypto': 3.3.0 + axios: 1.13.3 + dataloader: 2.2.3 + symbol.inspect: 1.0.1 + teslabot: 1.5.0 + zod: 3.25.76 + transitivePeerDependencies: + - debug + + '@tronweb3/google-protobuf@3.21.4': {} + + '@trufflesuite/bigint-buffer@1.1.9': + dependencies: + node-gyp-build: 4.3.0 + optional: true + + '@tsconfig/node10@1.0.12': {} + + '@tsconfig/node12@1.0.11': {} + + '@tsconfig/node14@1.0.3': {} + + '@tsconfig/node16@1.0.4': {} + + '@tybys/wasm-util@0.10.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@typechain/ethers-v5@10.2.1(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.9.3))(typescript@5.9.3)': + dependencies: + '@ethersproject/abi': 5.8.0 + '@ethersproject/providers': 5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + ethers: 5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + lodash: 4.17.23 + ts-essentials: 7.0.3(typescript@5.9.3) + typechain: 8.3.2(typescript@5.9.3) + typescript: 5.9.3 + + '@types/abstract-leveldown@7.2.5': {} + + '@types/babel__core@7.20.5': + dependencies: + '@babel/parser': 7.28.6 + '@babel/types': 7.28.6 + '@types/babel__generator': 7.27.0 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.28.0 + + '@types/babel__generator@7.27.0': + dependencies: + '@babel/types': 7.28.6 + + '@types/babel__template@7.4.4': + dependencies: + '@babel/parser': 7.28.6 + '@babel/types': 7.28.6 + + '@types/babel__traverse@7.28.0': + dependencies: + '@babel/types': 7.28.6 + + '@types/bn.js@4.11.6': + dependencies: + '@types/node': 18.18.14 + + '@types/bn.js@5.2.0': + dependencies: + '@types/node': 18.18.14 + + '@types/cacheable-request@6.0.3': + dependencies: + '@types/http-cache-semantics': 4.0.4 + '@types/keyv': 3.1.4 + '@types/node': 18.18.14 + '@types/responselike': 1.0.3 + + '@types/chai@4.3.20': {} + + '@types/connect@3.4.38': + dependencies: + '@types/node': 18.18.14 + + '@types/graceful-fs@4.1.9': + dependencies: + '@types/node': 18.18.14 + + '@types/http-cache-semantics@4.0.4': {} + + '@types/istanbul-lib-coverage@2.0.6': {} + + '@types/istanbul-lib-report@3.0.3': + dependencies: + '@types/istanbul-lib-coverage': 2.0.6 + + '@types/istanbul-reports@3.0.4': + dependencies: + '@types/istanbul-lib-report': 3.0.3 + + '@types/jest@29.5.14': + dependencies: + expect: 29.7.0 + pretty-format: 29.7.0 + + '@types/json-schema@7.0.15': {} + + '@types/json5@0.0.29': {} + + '@types/keyv@3.1.4': + dependencies: + '@types/node': 18.18.14 + + '@types/level-errors@3.0.2': {} + + '@types/levelup@4.3.3': + dependencies: + '@types/abstract-leveldown': 7.2.5 + '@types/level-errors': 3.0.2 + '@types/node': 18.18.14 + + '@types/mkdirp@0.5.2': + dependencies: + '@types/node': 18.18.14 + + '@types/mocha@10.0.10': {} + + '@types/node-fetch@2.6.13': + dependencies: + '@types/node': 18.18.14 + form-data: 4.0.5 + + '@types/node@11.11.6': {} + + '@types/node@12.20.55': {} + + '@types/node@18.18.14': + dependencies: + undici-types: 5.26.5 + + '@types/pbkdf2@3.1.2': + dependencies: + '@types/node': 18.18.14 + + '@types/prettier@2.7.3': {} + + '@types/qs@6.14.0': {} + + '@types/responselike@1.0.3': + dependencies: + '@types/node': 18.18.14 + + '@types/secp256k1@4.0.7': + dependencies: + '@types/node': 18.18.14 + + '@types/semver@7.7.1': {} + + '@types/sinon-chai@3.2.12': + dependencies: + '@types/chai': 4.3.20 + '@types/sinon': 21.0.0 + + '@types/sinon@21.0.0': + dependencies: + '@types/sinonjs__fake-timers': 15.0.1 + + '@types/sinonjs__fake-timers@15.0.1': {} + + '@types/stack-utils@2.0.3': {} + + '@types/tinycolor2@1.4.6': {} + + '@types/triple-beam@1.3.5': {} + + '@types/uuid@8.3.4': {} + + '@types/ws@7.4.7': + dependencies: + '@types/node': 18.18.14 + + '@types/ws@8.18.1': + dependencies: + '@types/node': 18.18.14 + + '@types/yargs-parser@21.0.3': {} + + '@types/yargs@17.0.35': + dependencies: + '@types/yargs-parser': 21.0.3 + + '@types/yoga-layout@1.9.2': {} + + '@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)(typescript@5.9.3)': + 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) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.3)': + 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 + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@5.62.0': + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + + '@typescript-eslint/scope-manager@7.18.0': + dependencies: + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/visitor-keys': 7.18.0 + + '@typescript-eslint/type-utils@7.18.0(eslint@8.57.1)(typescript@5.9.3)': + 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) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@5.62.0': {} + + '@typescript-eslint/types@7.18.0': {} + + '@typescript-eslint/typescript-estree@5.62.0(typescript@5.9.3)': + 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) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/typescript-estree@7.18.0(typescript@5.9.3)': + 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) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@5.62.0(eslint@8.57.1)(typescript@5.9.3)': + dependencies: + '@eslint-community/eslint-utils': 4.9.1(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 + + '@typescript-eslint/utils@7.18.0(eslint@8.57.1)(typescript@5.9.3)': + dependencies: + '@eslint-community/eslint-utils': 4.9.1(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 + + '@typescript-eslint/visitor-keys@5.62.0': + dependencies: + '@typescript-eslint/types': 5.62.0 + eslint-visitor-keys: 3.4.3 + + '@typescript-eslint/visitor-keys@7.18.0': + dependencies: + '@typescript-eslint/types': 7.18.0 + eslint-visitor-keys: 3.4.3 + + '@ungap/structured-clone@1.3.0': {} + + '@unrs/resolver-binding-android-arm-eabi@1.11.1': + optional: true + + '@unrs/resolver-binding-android-arm64@1.11.1': + optional: true + + '@unrs/resolver-binding-darwin-arm64@1.11.1': + optional: true + + '@unrs/resolver-binding-darwin-x64@1.11.1': + optional: true + + '@unrs/resolver-binding-freebsd-x64@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-arm-musleabihf@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-arm64-gnu@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-arm64-musl@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-x64-gnu@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-x64-musl@1.11.1': + optional: true + + '@unrs/resolver-binding-wasm32-wasi@1.11.1': + dependencies: + '@napi-rs/wasm-runtime': 0.2.12 + optional: true + + '@unrs/resolver-binding-win32-arm64-msvc@1.11.1': + optional: true + + '@unrs/resolver-binding-win32-ia32-msvc@1.11.1': + optional: true + + '@unrs/resolver-binding-win32-x64-msvc@1.11.1': + optional: true + + abi-wan-kanabi@2.2.4: + dependencies: + ansicolors: 0.3.2 + cardinal: 2.1.1 + fs-extra: 10.1.0 + yargs: 17.7.2 + + abitype@1.2.3(typescript@5.9.3)(zod@3.25.76): + optionalDependencies: + typescript: 5.9.3 + zod: 3.25.76 + + abort-controller@3.0.0: + dependencies: + event-target-shim: 5.0.1 + + abortcontroller-polyfill@1.7.8: {} + + abstract-leveldown@6.2.3: + dependencies: + buffer: 5.7.1 + immediate: 3.2.3 + level-concat-iterator: 2.0.1 + level-supports: 1.0.1 + xtend: 4.0.2 + + abstract-leveldown@6.3.0: + dependencies: + buffer: 5.7.1 + immediate: 3.3.0 + level-concat-iterator: 2.0.1 + level-supports: 1.0.1 + xtend: 4.0.2 + + accepts@1.3.8: + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + + acorn-jsx@5.3.2(acorn@8.15.0): + dependencies: + acorn: 8.15.0 + + acorn-walk@8.3.4: + dependencies: + acorn: 8.15.0 + + acorn@8.15.0: {} + + adm-zip@0.4.16: {} + + aes-js@3.0.0: {} + + agent-base@6.0.2: + dependencies: + debug: 4.4.3(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + + agentkeepalive@4.6.0: + dependencies: + humanize-ms: 1.2.1 + + aggregate-error@3.1.0: + dependencies: + clean-stack: 2.2.0 + indent-string: 4.0.0 + + ajv@6.12.6: + 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 + + ajv@8.17.1: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.0 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + ansi-align@3.0.1: + dependencies: + string-width: 4.2.3 + + ansi-colors@4.1.3: {} + + ansi-escapes@4.3.2: + dependencies: + type-fest: 0.21.3 + + ansi-regex@2.1.1: {} + + ansi-regex@5.0.1: {} + + ansi-styles@3.2.1: + dependencies: + color-convert: 1.9.3 + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@5.2.0: {} + + ansicolors@0.3.2: {} + + antlr4@4.13.2: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + aptos@1.22.1(got@12.6.1): + dependencies: + '@aptos-labs/aptos-client': 2.1.0(got@12.6.1) + '@noble/hashes': 1.3.3 + '@scure/bip39': 1.2.1 + eventemitter3: 5.0.4 + tweetnacl: 1.0.3 + transitivePeerDependencies: + - got + + arg@4.1.3: {} + + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + + argparse@2.0.1: {} + + array-back@3.1.0: {} + + array-back@4.0.2: {} + + array-buffer-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + is-array-buffer: 3.0.5 + + array-flatten@1.1.1: {} + + array-includes@3.1.9: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + is-string: 1.1.1 + math-intrinsics: 1.1.0 + + array-union@2.1.0: {} + + array.prototype.findlastindex@1.2.6: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-shim-unscopables: 1.1.0 + + array.prototype.flat@1.3.3: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-shim-unscopables: 1.1.0 + + array.prototype.flatmap@1.3.3: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-shim-unscopables: 1.1.0 + + arraybuffer.prototype.slice@1.0.4: + dependencies: + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + is-array-buffer: 3.0.5 + + asn1@0.2.6: + dependencies: + safer-buffer: 2.1.2 + + asn1js@3.0.7: + dependencies: + pvtsutils: 1.3.6 + pvutils: 1.1.5 + tslib: 2.8.1 + optional: true + + assert-plus@1.0.0: {} + + assert@2.1.0: + 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 + + assertion-error@1.1.0: {} + + ast-metadata-inferer@0.8.1: + dependencies: + '@mdn/browser-compat-data': 5.7.6 + + ast-parents@0.0.1: {} + + astral-regex@2.0.0: {} + + async-eventemitter@0.2.4: + dependencies: + async: 2.6.4 + + async-function@1.0.0: {} + + async-limiter@1.0.1: {} + + async@2.6.4: + dependencies: + lodash: 4.17.23 + + async@3.2.6: {} + + asynckit@0.4.0: {} + + atomic-sleep@1.0.0: {} + + auto-bind@4.0.0: {} + + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.1.0 + + aws-sign2@0.7.0: {} + + aws4@1.13.2: {} + + axios@0.21.4(debug@4.4.3): + dependencies: + follow-redirects: 1.15.11(debug@4.4.3) + transitivePeerDependencies: + - debug + + axios@1.13.3: + dependencies: + follow-redirects: 1.15.11(debug@4.4.3) + form-data: 4.0.5 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + babel-jest@29.7.0(@babel/core@7.28.6): + dependencies: + '@babel/core': 7.28.6 + '@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.6) + chalk: 4.1.2 + graceful-fs: 4.2.11 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-istanbul@6.1.1: + dependencies: + '@babel/helper-plugin-utils': 7.28.6 + '@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 + + babel-plugin-jest-hoist@29.6.3: + dependencies: + '@babel/template': 7.28.6 + '@babel/types': 7.28.6 + '@types/babel__core': 7.20.5 + '@types/babel__traverse': 7.28.0 + + babel-preset-current-node-syntax@1.2.0(@babel/core@7.28.6): + dependencies: + '@babel/core': 7.28.6 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.28.6) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.28.6) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.28.6) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.28.6) + '@babel/plugin-syntax-import-attributes': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.28.6) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.28.6) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.28.6) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.28.6) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.28.6) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.28.6) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.28.6) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.28.6) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.28.6) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.28.6) + + babel-preset-jest@29.6.3(@babel/core@7.28.6): + dependencies: + '@babel/core': 7.28.6 + babel-plugin-jest-hoist: 29.6.3 + babel-preset-current-node-syntax: 1.2.0(@babel/core@7.28.6) + + balanced-match@1.0.2: {} + + base-x@3.0.11: + dependencies: + safe-buffer: 5.2.1 + + base-x@4.0.1: {} + + base-x@5.0.1: {} + + base64-js@1.5.1: {} + + baseline-browser-mapping@2.9.18: {} + + bcrypt-pbkdf@1.0.2: + dependencies: + tweetnacl: 0.14.5 + + bech32@1.1.4: {} + + bech32@2.0.0: {} + + bigint-buffer@1.1.5: + dependencies: + bindings: 1.5.0 + + bignumber.js@9.3.1: {} + + binary-extensions@2.3.0: {} + + bindings@1.5.0: + dependencies: + file-uri-to-path: 1.0.0 + + bip32@5.0.0(typescript@5.9.3): + 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 + + bip39@3.0.4: + dependencies: + '@types/node': 11.11.6 + create-hash: 1.2.0 + pbkdf2: 3.1.5 + randombytes: 2.1.0 + + bip39@3.1.0: + dependencies: + '@noble/hashes': 1.8.0 + + blakejs@1.2.1: {} + + bluebird@3.7.2: {} + + bn.js@4.11.6: {} + + bn.js@4.12.2: {} + + bn.js@5.2.2: {} + + body-parser@1.20.4: + 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.1 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.14.1 + raw-body: 2.5.3 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + borsh@0.7.0: + dependencies: + bn.js: 5.2.2 + bs58: 4.0.1 + text-encoding-utf-8: 1.0.2 + + boxen@5.1.2: + 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 + + brace-expansion@1.1.12: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.2: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + brorand@1.1.0: {} + + browser-headers@0.4.1: {} + + browser-stdout@1.3.1: {} + + browserify-aes@1.2.0: + 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 + + browserslist@4.28.1: + dependencies: + baseline-browser-mapping: 2.9.18 + caniuse-lite: 1.0.30001766 + electron-to-chromium: 1.5.279 + node-releases: 2.0.27 + update-browserslist-db: 1.2.3(browserslist@4.28.1) + + bs58@4.0.1: + dependencies: + base-x: 3.0.11 + + bs58@5.0.0: + dependencies: + base-x: 4.0.1 + + bs58@6.0.0: + dependencies: + base-x: 5.0.1 + + bs58check@2.1.2: + dependencies: + bs58: 4.0.1 + create-hash: 1.2.0 + safe-buffer: 5.2.1 + + bs58check@4.0.0: + dependencies: + '@noble/hashes': 1.8.0 + bs58: 6.0.0 + + bser@2.1.1: + dependencies: + node-int64: 0.4.0 + + buffer-from@1.1.2: {} + + buffer-layout@1.2.2: {} + + buffer-to-arraybuffer@0.0.5: {} + + buffer-xor@1.0.3: {} + + buffer-xor@2.0.2: + dependencies: + safe-buffer: 5.2.1 + + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + buffer@6.0.3: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + bufferutil@4.0.5: + dependencies: + node-gyp-build: 4.8.4 + optional: true + + bufferutil@4.1.0: + dependencies: + node-gyp-build: 4.8.4 + + bufio@1.2.3: {} + + bytes@3.1.2: {} + + cacheable-lookup@5.0.4: {} + + cacheable-lookup@6.1.0: {} + + cacheable-lookup@7.0.0: {} + + cacheable-request@10.2.14: + 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.1 + responselike: 3.0.0 + + cacheable-request@7.0.4: + 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 + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bind@1.0.8: + 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 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + callsites@3.1.0: {} + + camelcase@3.0.0: {} + + camelcase@5.3.1: {} + + camelcase@6.3.0: {} + + caniuse-lite@1.0.30001766: {} + + cardinal@2.1.1: + dependencies: + ansicolors: 0.3.2 + redeyed: 2.1.1 + + caseless@0.12.0: {} + + chai@4.5.0: + 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 + + chalk@2.4.2: + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chalk@5.6.2: {} + + char-regex@1.0.2: {} + + check-error@1.0.3: + dependencies: + get-func-name: 2.0.2 + + chokidar@3.6.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 + + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + + chownr@1.1.4: {} + + ci-info@2.0.0: {} + + ci-info@3.9.0: {} + + cids@0.7.5: + dependencies: + buffer: 5.7.1 + class-is: 1.1.0 + multibase: 0.6.1 + multicodec: 1.0.4 + multihashes: 0.4.21 + + cipher-base@1.0.7: + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + to-buffer: 1.2.2 + + cjs-module-lexer@1.4.3: {} + + class-is@1.1.0: {} + + clean-stack@2.2.0: {} + + cli-boxes@2.2.1: {} + + cli-cursor@3.1.0: + dependencies: + restore-cursor: 3.1.0 + + cli-table3@0.6.5: + dependencies: + string-width: 4.2.3 + optionalDependencies: + '@colors/colors': 1.5.0 + + cli-truncate@2.1.0: + dependencies: + slice-ansi: 3.0.0 + string-width: 4.2.3 + + cliui@3.2.0: + dependencies: + string-width: 1.0.2 + strip-ansi: 3.0.1 + wrap-ansi: 2.1.0 + + cliui@7.0.4: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + clone-response@1.0.3: + dependencies: + mimic-response: 1.0.1 + + co@4.6.0: {} + + code-excerpt@3.0.0: + dependencies: + convert-to-spaces: 1.0.2 + + code-point-at@1.1.0: {} + + collect-v8-coverage@1.0.3: {} + + color-convert@1.9.3: + dependencies: + color-name: 1.1.3 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-convert@3.1.3: + dependencies: + color-name: 2.1.0 + + color-name@1.1.3: {} + + color-name@1.1.4: {} + + color-name@2.1.0: {} + + color-string@2.1.4: + dependencies: + color-name: 2.1.0 + + color@5.0.3: + dependencies: + color-convert: 3.1.3 + color-string: 2.1.4 + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + command-exists@1.2.9: {} + + command-line-args@5.2.1: + dependencies: + array-back: 3.1.0 + find-replace: 3.0.0 + lodash.camelcase: 4.3.0 + typical: 4.0.0 + + command-line-usage@6.1.3: + dependencies: + array-back: 4.0.2 + chalk: 2.4.2 + table-layout: 1.0.2 + typical: 5.2.0 + + commander@10.0.1: {} + + commander@12.1.0: {} + + commander@14.0.2: {} + + commander@2.20.3: {} + + commander@8.3.0: {} + + concat-map@0.0.1: {} + + concurrently@9.1.2: + dependencies: + chalk: 4.1.2 + lodash: 4.17.23 + rxjs: 7.8.2 + shell-quote: 1.8.3 + supports-color: 8.1.1 + tree-kill: 1.2.2 + yargs: 17.7.2 + + config-chain@1.1.13: + dependencies: + ini: 1.3.8 + proto-list: 1.2.4 + + content-disposition@0.5.4: + dependencies: + safe-buffer: 5.2.1 + + content-hash@2.5.2: + dependencies: + cids: 0.7.5 + multicodec: 0.5.7 + multihashes: 0.4.21 + + content-type@1.0.5: {} + + convert-source-map@2.0.0: {} + + convert-to-spaces@1.0.2: {} + + cookie-signature@1.0.7: {} + + cookie@0.4.2: {} + + cookie@0.7.2: {} + + core-js-pure@3.48.0: {} + + core-util-is@1.0.2: {} + + core-util-is@1.0.3: {} + + cors@2.8.6: + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + + cosmiconfig@8.3.6(typescript@5.9.3): + dependencies: + import-fresh: 3.3.1 + js-yaml: 4.1.1 + parse-json: 5.2.0 + path-type: 4.0.0 + optionalDependencies: + typescript: 5.9.3 + + crc-32@1.2.2: {} + + create-hash@1.2.0: + dependencies: + cipher-base: 1.0.7 + inherits: 2.0.4 + md5.js: 1.3.5 + ripemd160: 2.0.3 + sha.js: 2.4.12 + + create-hmac@1.1.7: + 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 + + create-jest@29.7.0(@types/node@18.18.14)(ts-node@10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.18))(@types/node@18.18.14)(typescript@5.9.3)): + 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(@swc/core@1.15.10(@swc/helpers@0.5.18))(@types/node@18.18.14)(typescript@5.9.3)) + jest-util: 29.7.0 + prompts: 2.4.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + + create-require@1.1.1: {} + + cross-fetch@3.2.0: + dependencies: + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + + cross-fetch@4.1.0: + dependencies: + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + crypto-hash@1.3.0: {} + + d@1.0.2: + dependencies: + es5-ext: 0.10.64 + type: 2.7.3 + + dashdash@1.14.1: + dependencies: + assert-plus: 1.0.0 + + data-view-buffer@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-offset@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + dataloader@2.2.3: {} + + dayjs@1.11.19: {} + + debug@2.6.9: + dependencies: + ms: 2.0.0 + + debug@3.2.7: + dependencies: + ms: 2.1.3 + + debug@4.4.3(supports-color@8.1.1): + dependencies: + ms: 2.1.3 + optionalDependencies: + supports-color: 8.1.1 + + decamelize@1.2.0: {} + + decamelize@4.0.0: {} + + decode-uri-component@0.2.2: {} + + decompress-response@3.3.0: + dependencies: + mimic-response: 1.0.1 + + decompress-response@6.0.0: + dependencies: + mimic-response: 3.1.0 + + dedent@1.7.1: {} + + deep-eql@4.1.4: + dependencies: + type-detect: 4.1.0 + + deep-extend@0.6.0: {} + + deep-is@0.1.4: {} + + deepmerge@4.3.1: {} + + defer-to-connect@2.0.1: {} + + deferred-leveldown@5.3.0: + dependencies: + abstract-leveldown: 6.2.3 + inherits: 2.0.4 + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + + delay@5.0.0: {} + + delayed-stream@1.0.0: {} + + depd@2.0.0: {} + + destroy@1.2.0: {} + + detect-indent@7.0.2: {} + + detect-newline@3.1.0: {} + + detect-newline@4.0.1: {} + + diff-sequences@29.6.3: {} + + diff@4.0.4: {} + + diff@5.2.2: {} + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + doctrine@2.1.0: + dependencies: + esutils: 2.0.3 + + doctrine@3.0.0: + dependencies: + esutils: 2.0.3 + + dom-walk@0.1.2: {} + + dot-case@3.0.4: + dependencies: + no-case: 3.0.4 + tslib: 2.8.1 + + dotenv@16.6.1: {} + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + ecc-jsbn@0.1.2: + dependencies: + jsbn: 0.1.1 + safer-buffer: 2.1.2 + + ed25519-hd-key@1.3.0: + dependencies: + create-hmac: 1.1.7 + tweetnacl: 1.0.3 + + ee-first@1.1.1: {} + + electron-to-chromium@1.5.279: {} + + elliptic@6.6.1: + 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 + + emittery@0.10.0: {} + + emittery@0.13.1: {} + + emoji-regex@8.0.0: {} + + enabled@2.0.0: {} + + encode-utf8@1.0.3: {} + + encodeurl@2.0.0: {} + + encoding-down@6.3.0: + dependencies: + abstract-leveldown: 6.3.0 + inherits: 2.0.4 + level-codec: 9.0.2 + level-errors: 2.0.1 + + end-of-stream@1.4.5: + dependencies: + once: 1.4.0 + + enquirer@2.4.1: + dependencies: + ansi-colors: 4.1.3 + strip-ansi: 6.0.1 + + env-paths@2.2.1: {} + + errno@0.1.8: + dependencies: + prr: 1.0.1 + + error-ex@1.3.4: + dependencies: + is-arrayish: 0.2.1 + + es-abstract@1.24.1: + 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.20 + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + es-shim-unscopables@1.1.0: + dependencies: + hasown: 2.0.2 + + es-to-primitive@1.3.0: + dependencies: + is-callable: 1.2.7 + is-date-object: 1.1.0 + is-symbol: 1.1.1 + + es5-ext@0.10.64: + dependencies: + es6-iterator: 2.0.3 + es6-symbol: 3.1.4 + esniff: 2.0.1 + next-tick: 1.1.0 + + es6-iterator@2.0.3: + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + es6-symbol: 3.1.4 + + es6-promise@4.2.8: {} + + es6-promisify@5.0.0: + dependencies: + es6-promise: 4.2.8 + + es6-symbol@3.1.4: + dependencies: + d: 1.0.2 + ext: 1.7.0 + + es6-weak-map@2.0.3: + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + es6-iterator: 2.0.3 + es6-symbol: 3.1.4 + + escalade@3.2.0: {} + + escape-html@1.0.3: {} + + escape-string-regexp@1.0.5: {} + + escape-string-regexp@2.0.0: {} + + escape-string-regexp@4.0.0: {} + + eslint-config-prettier@9.1.2(eslint@8.57.1): + dependencies: + eslint: 8.57.1 + + eslint-import-resolver-node@0.3.9: + dependencies: + debug: 3.2.7 + is-core-module: 2.16.1 + resolve: 1.22.11 + transitivePeerDependencies: + - supports-color + + eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@8.57.1): + dependencies: + '@nolyfill/is-core-module': 1.0.39 + debug: 4.4.3(supports-color@8.1.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 + optionalDependencies: + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) + transitivePeerDependencies: + - supports-color + + eslint-module-utils@2.12.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1): + dependencies: + debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.9.3) + 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 + + eslint-plugin-autofix@2.2.0(eslint@8.57.1): + dependencies: + eslint: 8.57.1 + eslint-rule-composer: 0.3.0 + espree: 9.6.1 + esutils: 2.0.3 + string-similarity: 4.0.4 + + eslint-plugin-compat@4.2.0(eslint@8.57.1): + dependencies: + '@mdn/browser-compat-data': 5.7.6 + ast-metadata-inferer: 0.8.1 + browserslist: 4.28.1 + caniuse-lite: 1.0.30001766 + eslint: 8.57.1 + find-up: 5.0.0 + lodash.memoize: 4.1.2 + semver: 7.7.3 + + eslint-plugin-import@2.32.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1): + dependencies: + '@rtsao/scc': 1.1.0 + 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@8.57.1)(typescript@5.9.3))(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 + optionalDependencies: + '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.9.3) + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + + eslint-plugin-jest-extended@2.0.3(eslint@8.57.1)(typescript@5.9.3): + dependencies: + '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@5.9.3) + eslint: 8.57.1 + transitivePeerDependencies: + - supports-color + - typescript + + eslint-plugin-prettier@5.5.5(eslint-config-prettier@9.1.2(eslint@8.57.1))(eslint@8.57.1)(prettier@3.8.1): + dependencies: + eslint: 8.57.1 + prettier: 3.8.1 + prettier-linter-helpers: 1.0.1 + synckit: 0.11.12 + optionalDependencies: + eslint-config-prettier: 9.1.2(eslint@8.57.1) + + eslint-plugin-unused-imports@3.2.0(@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)(typescript@5.9.3))(eslint@8.57.1): + dependencies: + eslint: 8.57.1 + eslint-rule-composer: 0.3.0 + optionalDependencies: + '@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)(typescript@5.9.3) + + eslint-rule-composer@0.3.0: {} + + eslint-scope@5.1.1: + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + + eslint-scope@7.2.2: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint@8.57.1: + dependencies: + '@eslint-community/eslint-utils': 4.9.1(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.7.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.1 + 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 + + esniff@2.0.1: + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + event-emitter: 0.3.5 + type: 2.7.3 + + espree@9.6.1: + dependencies: + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + eslint-visitor-keys: 3.4.3 + + esprima@4.0.1: {} + + esquery@1.7.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@4.3.0: {} + + estraverse@5.3.0: {} + + esutils@2.0.3: {} + + etag@1.8.1: {} + + eth-ens-namehash@2.0.8: + dependencies: + idna-uts46-hx: 2.3.1 + js-sha3: 0.5.7 + + eth-lib@0.1.29(bufferutil@4.1.0)(utf-8-validate@5.0.10): + 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(bufferutil@4.1.0)(utf-8-validate@5.0.10) + xhr-request-promise: 0.1.3 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + eth-lib@0.2.8: + dependencies: + bn.js: 4.12.2 + elliptic: 6.6.1 + xhr-request-promise: 0.1.3 + + ethereum-bloom-filters@1.2.0: + dependencies: + '@noble/hashes': 1.8.0 + + ethereum-cryptography@0.1.3: + 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 + + ethereum-cryptography@1.2.0: + dependencies: + '@noble/hashes': 1.2.0 + '@noble/secp256k1': 1.7.1 + '@scure/bip32': 1.1.5 + '@scure/bip39': 1.1.1 + + ethereum-cryptography@2.2.1: + dependencies: + '@noble/curves': 1.4.2 + '@noble/hashes': 1.4.0 + '@scure/bip32': 1.4.0 + '@scure/bip39': 1.3.0 + + 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(bufferutil@4.1.0)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(typescript@5.9.3): + dependencies: + '@ethereum-waffle/chai': 4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(ethers@5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@ethereum-waffle/compiler': 4.0.3(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(solc@0.8.15)(typechain@8.3.2(typescript@5.9.3))(typescript@5.9.3) + '@ethereum-waffle/mock-contract': 4.0.4(ethers@5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@ethereum-waffle/provider': 4.0.5(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(ethers@5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + ethers: 5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + 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 + + ethereumjs-abi@0.6.8: + dependencies: + bn.js: 4.12.2 + ethereumjs-util: 6.2.1 + + ethereumjs-util@6.2.1: + 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 + + ethereumjs-util@7.1.3: + 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 + + ethereumjs-util@7.1.5: + 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 + + ethers@5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10): + 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(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@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 + + ethjs-unit@0.1.6: + dependencies: + bn.js: 4.11.6 + number-to-bn: 1.7.0 + + ethjs-util@0.1.6: + dependencies: + is-hex-prefixed: 1.0.0 + strip-hex-prefix: 1.0.0 + + event-emitter@0.3.5: + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + + event-target-shim@5.0.1: {} + + eventemitter3@3.1.2: {} + + eventemitter3@4.0.4: {} + + eventemitter3@4.0.7: {} + + eventemitter3@5.0.1: {} + + eventemitter3@5.0.4: {} + + events@3.3.0: {} + + evp_bytestokey@1.0.3: + dependencies: + md5.js: 1.3.5 + safe-buffer: 5.2.1 + + execa@5.1.1: + 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 + + exit@0.1.2: {} + + expect@29.7.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 + + exponential-backoff@3.1.3: {} + + express@4.22.1: + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.4 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookie: 0.7.2 + cookie-signature: 1.0.7 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.3.2 + fresh: 0.5.2 + http-errors: 2.0.1 + 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.14.1 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.19.2 + serve-static: 1.16.3 + setprototypeof: 1.2.0 + statuses: 2.0.2 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + ext@1.7.0: + dependencies: + type: 2.7.3 + + extend@3.0.2: {} + + extsprintf@1.3.0: {} + + eyes@0.1.8: {} + + fast-deep-equal@3.1.3: {} + + fast-diff@1.3.0: {} + + fast-glob@3.3.3: + 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 + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fast-redact@3.5.0: {} + + fast-stable-stringify@1.0.0: {} + + fast-uri@3.1.0: {} + + fastestsmallesttextencoderdecoder@1.0.22: {} + + fastq@1.20.1: + dependencies: + reusify: 1.1.0 + + fb-watchman@2.0.2: + dependencies: + bser: 2.1.1 + + fdir@6.5.0(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + + fecha@4.2.3: {} + + file-entry-cache@6.0.1: + dependencies: + flat-cache: 3.2.0 + + file-uri-to-path@1.0.0: {} + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + finalhandler@1.3.2: + 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.2 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + find-replace@3.0.0: + dependencies: + array-back: 3.1.0 + + find-up@1.1.2: + dependencies: + path-exists: 2.1.0 + pinkie-promise: 2.0.1 + + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@3.2.0: + dependencies: + flatted: 3.3.3 + keyv: 4.5.4 + rimraf: 3.0.2 + + flat@5.0.2: {} + + flatted@3.3.3: {} + + fmix@0.1.0: + dependencies: + imul: 1.0.1 + + fn.name@1.1.0: {} + + follow-redirects@1.15.11(debug@4.4.3): + optionalDependencies: + debug: 4.4.3(supports-color@8.1.1) + + for-each@0.3.5: + dependencies: + is-callable: 1.2.7 + + forever-agent@0.6.1: {} + + form-data-encoder@1.7.1: {} + + form-data-encoder@2.1.4: {} + + form-data@2.3.3: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + form-data@4.0.5: + 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 + + forwarded@0.2.0: {} + + fp-ts@1.19.3: {} + + fp-ts@2.16.11: {} + + fresh@0.5.2: {} + + fs-extra@0.30.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 2.4.0 + klaw: 1.3.1 + path-is-absolute: 1.0.1 + rimraf: 2.7.1 + + fs-extra@10.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.2.0 + universalify: 2.0.1 + + fs-extra@4.0.3: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + fs-extra@7.0.1: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + fs-minipass@1.2.7: + dependencies: + minipass: 2.9.0 + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + function.prototype.name@1.1.8: + 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 + + functional-red-black-tree@1.0.1: {} + + functions-have-names@1.2.3: {} + + ganache@7.4.3: + optionalDependencies: + bufferutil: 4.0.5 + utf-8-validate: 5.0.7 + + generator-function@2.0.1: {} + + gensync@1.0.0-beta.2: {} + + get-caller-file@1.0.3: {} + + get-caller-file@2.0.5: {} + + get-func-name@2.0.2: {} + + get-intrinsic@1.3.0: + 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 + + get-package-type@0.1.0: {} + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + get-stream@5.2.0: + dependencies: + pump: 3.0.3 + + get-stream@6.0.1: {} + + get-symbol-description@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + + get-tsconfig@4.13.0: + dependencies: + resolve-pkg-maps: 1.0.0 + + getpass@0.1.7: + dependencies: + assert-plus: 1.0.0 + + git-hooks-list@4.2.1: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@7.1.7: + 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 + + glob@7.2.3: + 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 + + glob@8.1.0: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 5.1.6 + once: 1.4.0 + + global@4.4.0: + dependencies: + min-document: 2.19.2 + process: 0.11.10 + + globals@13.24.0: + dependencies: + type-fest: 0.20.2 + + globalthis@1.0.4: + dependencies: + define-properties: 1.2.1 + gopd: 1.2.0 + + globby@11.1.0: + 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 + + google-protobuf@3.21.4: {} + + gopd@1.2.0: {} + + got@11.8.6: + 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 + + got@12.1.0: + 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 + + got@12.6.1: + 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 + + gql.tada@1.9.0(graphql@16.12.0)(typescript@5.9.3): + dependencies: + '@0no-co/graphql.web': 1.2.0(graphql@16.12.0) + '@0no-co/graphqlsp': 1.15.2(graphql@16.12.0)(typescript@5.9.3) + '@gql.tada/cli-utils': 1.7.2(@0no-co/graphqlsp@1.15.2(graphql@16.12.0)(typescript@5.9.3))(graphql@16.12.0)(typescript@5.9.3) + '@gql.tada/internal': 1.0.8(graphql@16.12.0)(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - '@gql.tada/svelte-support' + - '@gql.tada/vue-support' + - graphql + + graceful-fs@4.2.10: {} + + graceful-fs@4.2.11: {} + + gradient-string@1.2.0: + dependencies: + chalk: 2.4.2 + tinygradient: 0.4.3 + + graphemer@1.4.0: {} + + graphql@16.12.0: {} + + har-schema@2.0.0: {} + + har-validator@5.1.5: + dependencies: + ajv: 6.12.6 + har-schema: 2.0.0 + + hardhat-contract-sizer@2.10.1(hardhat@2.28.3(bufferutil@4.1.0)(ts-node@10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.18))(@types/node@18.18.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)): + dependencies: + chalk: 4.1.2 + cli-table3: 0.6.5 + hardhat: 2.28.3(bufferutil@4.1.0)(ts-node@10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.18))(@types/node@18.18.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) + strip-ansi: 6.0.1 + + hardhat-deploy-ethers@0.4.2(@nomicfoundation/hardhat-ethers@3.1.3(ethers@5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(hardhat@2.28.3(bufferutil@4.1.0)(ts-node@10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.18))(@types/node@18.18.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(hardhat-deploy@0.12.4(bufferutil@4.1.0)(utf-8-validate@5.0.10))(hardhat@2.28.3(bufferutil@4.1.0)(ts-node@10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.18))(@types/node@18.18.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)): + dependencies: + '@nomicfoundation/hardhat-ethers': 3.1.3(ethers@5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(hardhat@2.28.3(bufferutil@4.1.0)(ts-node@10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.18))(@types/node@18.18.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + hardhat: 2.28.3(bufferutil@4.1.0)(ts-node@10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.18))(@types/node@18.18.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) + hardhat-deploy: 0.12.4(bufferutil@4.1.0)(utf-8-validate@5.0.10) + + hardhat-deploy@0.12.4(bufferutil@4.1.0)(utf-8-validate@5.0.10): + 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(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@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(bufferutil@4.1.0)(utf-8-validate@5.0.10) + form-data: 4.0.5 + fs-extra: 10.1.0 + match-all: 1.2.7 + murmur-128: 0.2.1 + qs: 6.14.1 + zksync-ethers: 5.11.1(ethers@5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + hardhat@2.28.3(bufferutil@4.1.0)(ts-node@10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.18))(@types/node@18.18.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10): + dependencies: + '@ethereumjs/util': 9.1.0 + '@ethersproject/abi': 5.8.0 + '@nomicfoundation/edr': 0.12.0-next.22 + '@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.23 + 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.3 + 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 + tsort: 0.0.1 + undici: 5.29.0 + uuid: 8.3.2 + ws: 7.5.10(bufferutil@4.1.0)(utf-8-validate@5.0.10) + optionalDependencies: + ts-node: 10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.18))(@types/node@18.18.14)(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + has-bigints@1.1.0: {} + + has-flag@3.0.0: {} + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + + has-proto@1.2.0: + dependencies: + dunder-proto: 1.0.1 + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hash-base@3.1.2: + dependencies: + inherits: 2.0.4 + readable-stream: 2.3.8 + safe-buffer: 5.2.1 + to-buffer: 1.2.2 + + hash.js@1.1.7: + dependencies: + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + he@1.2.0: {} + + hmac-drbg@1.0.1: + dependencies: + hash.js: 1.1.7 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + + hosted-git-info@2.8.9: {} + + html-escaper@2.0.2: {} + + http-cache-semantics@4.2.0: {} + + http-errors@2.0.1: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.2 + toidentifier: 1.0.1 + + http-https@1.0.0: {} + + http-signature@1.2.0: + dependencies: + assert-plus: 1.0.0 + jsprim: 1.4.2 + sshpk: 1.18.0 + + http2-wrapper@1.0.3: + dependencies: + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 + + http2-wrapper@2.2.1: + dependencies: + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 + + https-proxy-agent@5.0.1: + dependencies: + agent-base: 6.0.2 + debug: 4.4.3(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + + human-signals@2.1.0: {} + + humanize-ms@1.2.1: + dependencies: + ms: 2.1.3 + + iconv-lite@0.4.24: + dependencies: + safer-buffer: 2.1.2 + + idna-uts46-hx@2.3.1: + dependencies: + punycode: 2.1.0 + + ieee754@1.2.1: {} + + ignore@5.3.2: {} + + immediate@3.2.3: {} + + immediate@3.3.0: {} + + immutable@4.3.7: {} + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + import-local@3.2.0: + dependencies: + pkg-dir: 4.2.0 + resolve-cwd: 3.0.0 + + imul@1.0.1: {} + + imurmurhash@0.1.4: {} + + indent-string@4.0.0: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + ini@1.3.8: {} + + injectpromise@1.0.0: {} + + ink-gradient@2.0.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2): + dependencies: + gradient-string: 1.2.0 + ink: 3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10) + prop-types: 15.8.1 + react: 17.0.2 + strip-ansi: 6.0.1 + + ink-table@3.1.0(ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10))(react@17.0.2): + dependencies: + ink: 3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10) + object-hash: 2.2.0 + react: 17.0.2 + + ink@3.2.0(bufferutil@4.1.0)(react@17.0.2)(utf-8-validate@5.0.10): + 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.23 + patch-console: 1.0.0 + react: 17.0.2 + react-devtools-core: 4.28.5(bufferutil@4.1.0)(utf-8-validate@5.0.10) + 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(bufferutil@4.1.0)(utf-8-validate@5.0.10) + yoga-layout-prebuilt: 1.10.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + internal-slot@1.1.0: + dependencies: + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.1.0 + + invert-kv@1.0.0: {} + + io-ts@1.10.4: + dependencies: + fp-ts: 1.19.3 + + ipaddr.js@1.9.1: {} + + is-arguments@1.2.0: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-array-buffer@3.0.5: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + is-arrayish@0.2.1: {} + + is-async-function@2.1.1: + 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 + + is-bigint@1.1.0: + dependencies: + has-bigints: 1.1.0 + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-boolean-object@1.2.2: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-bun-module@2.0.0: + dependencies: + semver: 7.7.3 + + is-callable@1.2.7: {} + + is-ci@2.0.0: + dependencies: + ci-info: 2.0.0 + + is-core-module@2.16.1: + dependencies: + hasown: 2.0.2 + + is-data-view@1.0.2: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + is-typed-array: 1.1.15 + + is-date-object@1.1.0: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-extglob@2.1.1: {} + + is-finalizationregistry@1.1.1: + dependencies: + call-bound: 1.0.4 + + is-fullwidth-code-point@1.0.0: + dependencies: + number-is-nan: 1.0.1 + + is-fullwidth-code-point@3.0.0: {} + + is-function@1.0.2: {} + + is-generator-fn@2.1.0: {} + + is-generator-function@1.1.2: + 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 + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-hex-prefixed@1.0.0: {} + + is-map@2.0.3: {} + + is-nan@1.3.2: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + + is-negative-zero@2.0.3: {} + + is-number-object@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-number@7.0.0: {} + + is-path-inside@3.0.3: {} + + is-plain-obj@2.1.0: {} + + is-plain-obj@4.1.0: {} + + is-promise@2.2.2: {} + + is-regex@1.2.1: + dependencies: + call-bound: 1.0.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + is-set@2.0.3: {} + + is-shared-array-buffer@1.0.4: + dependencies: + call-bound: 1.0.4 + + is-stream@2.0.1: {} + + is-string@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-symbol@1.1.1: + dependencies: + call-bound: 1.0.4 + has-symbols: 1.1.0 + safe-regex-test: 1.1.0 + + is-typed-array@1.1.15: + dependencies: + which-typed-array: 1.1.20 + + is-typedarray@1.0.0: {} + + is-unicode-supported@0.1.0: {} + + is-url@1.2.4: {} + + is-utf8@0.2.1: {} + + is-weakmap@2.0.2: {} + + is-weakref@1.1.1: + dependencies: + call-bound: 1.0.4 + + is-weakset@2.0.4: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + isarray@1.0.0: {} + + isarray@2.0.5: {} + + isexe@2.0.0: {} + + isomorphic-ws@4.0.1(ws@7.5.10(bufferutil@4.1.0)(utf-8-validate@5.0.10)): + dependencies: + ws: 7.5.10(bufferutil@4.1.0)(utf-8-validate@5.0.10) + + isows@1.0.7(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)): + dependencies: + ws: 8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10) + + isstream@0.1.2: {} + + istanbul-lib-coverage@3.2.2: {} + + istanbul-lib-instrument@5.2.1: + dependencies: + '@babel/core': 7.28.6 + '@babel/parser': 7.28.6 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.2 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + istanbul-lib-instrument@6.0.3: + dependencies: + '@babel/core': 7.28.6 + '@babel/parser': 7.28.6 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.2 + semver: 7.7.3 + transitivePeerDependencies: + - supports-color + + istanbul-lib-report@3.0.1: + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + + istanbul-lib-source-maps@4.0.1: + dependencies: + debug: 4.4.3(supports-color@8.1.1) + istanbul-lib-coverage: 3.2.2 + source-map: 0.6.1 + transitivePeerDependencies: + - supports-color + + istanbul-reports@3.2.0: + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + + jayson@4.3.0(bufferutil@4.1.0)(utf-8-validate@5.0.10): + 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(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + json-stringify-safe: 5.0.1 + stream-json: 1.9.1 + uuid: 8.3.2 + ws: 7.5.10(bufferutil@4.1.0)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + jest-changed-files@29.7.0: + dependencies: + execa: 5.1.1 + jest-util: 29.7.0 + p-limit: 3.1.0 + + jest-circus@29.7.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.1 + 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 + + jest-cli@29.7.0(@types/node@18.18.14)(ts-node@10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.18))(@types/node@18.18.14)(typescript@5.9.3)): + dependencies: + '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.18))(@types/node@18.18.14)(typescript@5.9.3)) + '@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(@swc/core@1.15.10(@swc/helpers@0.5.18))(@types/node@18.18.14)(typescript@5.9.3)) + exit: 0.1.2 + import-local: 3.2.0 + jest-config: 29.7.0(@types/node@18.18.14)(ts-node@10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.18))(@types/node@18.18.14)(typescript@5.9.3)) + jest-util: 29.7.0 + jest-validate: 29.7.0 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + + jest-config@29.7.0(@types/node@18.18.14)(ts-node@10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.18))(@types/node@18.18.14)(typescript@5.9.3)): + dependencies: + '@babel/core': 7.28.6 + '@jest/test-sequencer': 29.7.0 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.28.6) + 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 + optionalDependencies: + '@types/node': 18.18.14 + ts-node: 10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.18))(@types/node@18.18.14)(typescript@5.9.3) + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-diff@29.7.0: + dependencies: + chalk: 4.1.2 + diff-sequences: 29.6.3 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + + jest-docblock@29.7.0: + dependencies: + detect-newline: 3.1.0 + + jest-each@29.7.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 + + jest-environment-node@29.7.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 + + jest-get-type@29.6.3: {} + + jest-haste-map@29.7.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 + + jest-leak-detector@29.7.0: + dependencies: + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + + jest-matcher-utils@29.7.0: + dependencies: + chalk: 4.1.2 + jest-diff: 29.7.0 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + + jest-message-util@29.7.0: + dependencies: + '@babel/code-frame': 7.28.6 + '@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 + + jest-mock@29.7.0: + dependencies: + '@jest/types': 29.6.3 + '@types/node': 18.18.14 + jest-util: 29.7.0 + + jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): + optionalDependencies: + jest-resolve: 29.7.0 + + jest-regex-util@29.6.3: {} + + jest-regex-util@30.0.1: {} + + jest-resolve-dependencies@29.7.0: + dependencies: + jest-regex-util: 29.6.3 + jest-snapshot: 29.7.0 + transitivePeerDependencies: + - supports-color + + jest-resolve@29.7.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 + + jest-runner@29.7.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 + + jest-runtime@29.7.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 + + jest-snapshot@29.7.0: + dependencies: + '@babel/core': 7.28.6 + '@babel/generator': 7.28.6 + '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.28.6) + '@babel/types': 7.28.6 + '@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.6) + 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 + + jest-util@29.7.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 + + jest-validate@29.7.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 + + jest-watcher@29.7.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 + + jest-worker@29.7.0: + dependencies: + '@types/node': 18.18.14 + jest-util: 29.7.0 + merge-stream: 2.0.0 + supports-color: 8.1.1 + + jest@29.7.0(@types/node@18.18.14)(ts-node@10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.18))(@types/node@18.18.14)(typescript@5.9.3)): + dependencies: + '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.18))(@types/node@18.18.14)(typescript@5.9.3)) + '@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(@swc/core@1.15.10(@swc/helpers@0.5.18))(@types/node@18.18.14)(typescript@5.9.3)) + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + + js-sha256@0.9.0: {} + + js-sha3@0.5.7: {} + + js-sha3@0.8.0: {} + + js-tokens@4.0.0: {} + + js-yaml@3.14.2: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + + js-yaml@4.1.1: + dependencies: + argparse: 2.0.1 + + jsbn@0.1.1: {} + + jscrypto@1.0.3: {} + + jsesc@3.1.0: {} + + json-bigint@1.0.0: + dependencies: + bignumber.js: 9.3.1 + + json-buffer@3.0.1: {} + + json-parse-even-better-errors@2.3.1: {} + + json-schema-traverse@0.4.1: {} + + json-schema-traverse@1.0.0: {} + + json-schema@0.4.0: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json-stream-stringify@3.1.6: {} + + json-stringify-safe@5.0.1: {} + + json5@1.0.2: + dependencies: + minimist: 1.2.8 + + json5@2.2.3: {} + + jsonc-parser@3.3.1: {} + + jsonfile@2.4.0: + optionalDependencies: + graceful-fs: 4.2.11 + + jsonfile@4.0.0: + optionalDependencies: + graceful-fs: 4.2.11 + + jsonfile@6.2.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + jsprim@1.4.2: + dependencies: + assert-plus: 1.0.0 + extsprintf: 1.3.0 + json-schema: 0.4.0 + verror: 1.10.0 + + jssha@3.2.0: {} + + keccak256@1.0.6: + dependencies: + bn.js: 5.2.2 + buffer: 6.0.3 + keccak: 3.0.4 + + keccak@3.0.1: + dependencies: + node-addon-api: 2.0.2 + node-gyp-build: 4.8.4 + + keccak@3.0.4: + dependencies: + node-addon-api: 2.0.2 + node-gyp-build: 4.8.4 + readable-stream: 3.6.2 + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + klaw@1.3.1: + optionalDependencies: + graceful-fs: 4.2.11 + + kleur@3.0.3: {} + + kuler@2.0.0: {} + + latest-version@7.0.0: + dependencies: + package-json: 8.1.1 + + lcid@1.0.0: + dependencies: + invert-kv: 1.0.0 + + level-codec@9.0.2: + dependencies: + buffer: 5.7.1 + + level-concat-iterator@2.0.1: {} + + level-errors@2.0.1: + dependencies: + errno: 0.1.8 + + level-iterator-stream@4.0.2: + dependencies: + inherits: 2.0.4 + readable-stream: 3.6.2 + xtend: 4.0.2 + + level-mem@5.0.1: + dependencies: + level-packager: 5.1.1 + memdown: 5.1.0 + + level-packager@5.1.1: + dependencies: + encoding-down: 6.3.0 + levelup: 4.4.0 + + level-supports@1.0.1: + dependencies: + xtend: 4.0.2 + + level-ws@2.0.0: + dependencies: + inherits: 2.0.4 + readable-stream: 3.6.2 + xtend: 4.0.2 + + levelup@4.4.0: + 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 + + leven@3.1.0: {} + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + lines-and-columns@1.2.4: {} + + load-json-file@1.1.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 + + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash.assign@4.2.0: {} + + lodash.camelcase@4.3.0: {} + + lodash.isequal@4.5.0: {} + + lodash.memoize@4.1.2: {} + + lodash.merge@4.6.2: {} + + lodash.truncate@4.4.2: {} + + lodash@4.17.23: {} + + log-symbols@4.1.0: + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + + logform@2.7.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 + + long@5.3.2: {} + + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + + lossless-json@4.3.0: {} + + loupe@2.3.7: + dependencies: + get-func-name: 2.0.2 + + lower-case@2.0.2: + dependencies: + tslib: 2.8.1 + + lowercase-keys@2.0.0: {} + + lowercase-keys@3.0.0: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + lru-queue@0.1.0: + dependencies: + es5-ext: 0.10.64 + + lru_map@0.3.3: {} + + ltgt@2.2.1: {} + + make-dir@4.0.0: + dependencies: + semver: 7.7.3 + + make-error@1.3.6: {} + + makeerror@1.0.12: + dependencies: + tmpl: 1.0.5 + + map-age-cleaner@0.1.3: + dependencies: + p-defer: 1.0.0 + + match-all@1.2.7: {} + + math-intrinsics@1.1.0: {} + + mcl-wasm@0.7.9: {} + + md5.js@1.3.5: + dependencies: + hash-base: 3.1.2 + inherits: 2.0.4 + safe-buffer: 5.2.1 + + media-typer@0.3.0: {} + + memdown@5.1.0: + 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 + + memoizee@0.4.17: + 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 + + memorystream@0.3.1: {} + + merge-descriptors@1.0.3: {} + + merge-stream@2.0.0: {} + + merge2@1.4.1: {} + + merkle-patricia-tree@4.2.4: + 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 + + methods@1.1.2: {} + + micro-eth-signer@0.14.0: + dependencies: + '@noble/curves': 1.8.2 + '@noble/hashes': 1.7.2 + micro-packed: 0.7.3 + + micro-ftch@0.3.1: {} + + micro-memoize@4.1.3: {} + + micro-packed@0.7.3: + dependencies: + '@scure/base': 1.2.6 + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + miller-rabin@4.0.1: + dependencies: + bn.js: 4.12.2 + brorand: 1.1.0 + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mime@1.6.0: {} + + mimic-fn@2.1.0: {} + + mimic-fn@3.1.0: {} + + mimic-response@1.0.1: {} + + mimic-response@3.1.0: {} + + mimic-response@4.0.0: {} + + min-document@2.19.2: + dependencies: + dom-walk: 0.1.2 + + minimalistic-assert@1.0.1: {} + + minimalistic-crypto-utils@1.0.1: {} + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.12 + + minimatch@5.1.6: + dependencies: + brace-expansion: 2.0.2 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.2 + + minimist@1.2.8: {} + + minipass@2.9.0: + dependencies: + safe-buffer: 5.2.1 + yallist: 3.1.1 + + minizlib@1.3.3: + dependencies: + minipass: 2.9.0 + + mkdirp-promise@5.0.1: + dependencies: + mkdirp: 3.0.1 + + mkdirp@0.5.6: + dependencies: + minimist: 1.2.8 + + mkdirp@1.0.4: {} + + mkdirp@3.0.1: {} + + mnemonist@0.38.5: + dependencies: + obliterator: 2.0.5 + + mocha@10.8.2: + 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.2 + escape-string-regexp: 4.0.0 + find-up: 5.0.0 + glob: 8.1.0 + he: 1.2.0 + js-yaml: 4.1.1 + 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 + + mock-fs@4.14.0: {} + + ms@2.0.0: {} + + ms@2.1.3: {} + + multibase@0.6.1: + dependencies: + base-x: 3.0.11 + buffer: 5.7.1 + + multibase@0.7.0: + dependencies: + base-x: 3.0.11 + buffer: 5.7.1 + + multicodec@0.5.7: + dependencies: + varint: 5.0.2 + + multicodec@1.0.4: + dependencies: + buffer: 5.7.1 + varint: 5.0.2 + + multihashes@0.4.21: + dependencies: + buffer: 5.7.1 + multibase: 0.7.0 + varint: 5.0.2 + + murmur-128@0.2.1: + dependencies: + encode-utf8: 1.0.3 + fmix: 0.1.0 + imul: 1.0.1 + + nano-json-stream-parser@0.1.2: {} + + napi-postinstall@0.3.4: {} + + natural-compare@1.4.0: {} + + negotiator@0.6.3: {} + + next-tick@1.1.0: {} + + no-case@3.0.4: + dependencies: + lower-case: 2.0.2 + tslib: 2.8.1 + + node-addon-api@2.0.2: {} + + node-addon-api@5.1.0: {} + + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + + node-gyp-build@4.3.0: + optional: true + + node-gyp-build@4.8.4: {} + + node-int64@0.4.0: {} + + node-releases@2.0.27: {} + + normalize-package-data@2.5.0: + dependencies: + hosted-git-info: 2.8.9 + resolve: 1.22.11 + semver: 5.7.2 + validate-npm-package-license: 3.0.4 + + normalize-path@3.0.0: {} + + normalize-url@6.1.0: {} + + normalize-url@8.1.1: {} + + npm-run-path@4.0.1: + dependencies: + path-key: 3.1.1 + + number-is-nan@1.0.1: {} + + number-to-bn@1.7.0: + dependencies: + bn.js: 4.11.6 + strip-hex-prefix: 1.0.0 + + oauth-sign@0.9.0: {} + + object-assign@4.1.1: {} + + object-hash@2.2.0: {} + + object-inspect@1.13.4: {} + + object-is@1.1.6: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + + object-keys@1.1.1: {} + + object.assign@4.1.7: + 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 + + object.fromentries@2.0.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-object-atoms: 1.1.1 + + object.groupby@1.0.3: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.1 + + object.values@1.2.1: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + obliterator@2.0.5: {} + + oboe@2.1.5: + dependencies: + http-https: 1.0.0 + + on-exit-leak-free@2.1.2: {} + + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + one-time@1.0.0: + dependencies: + fn.name: 1.1.0 + + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + + optionator@0.9.4: + 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 + + os-locale@1.4.0: + dependencies: + lcid: 1.0.0 + + os-tmpdir@1.0.2: {} + + own-keys@1.0.1: + dependencies: + get-intrinsic: 1.3.0 + object-keys: 1.1.1 + safe-push-apply: 1.0.0 + + ox@0.11.3(typescript@5.9.3)(zod@3.25.76): + dependencies: + '@adraffy/ens-normalize': 1.11.1 + '@noble/ciphers': 1.3.0 + '@noble/curves': 1.9.1 + '@noble/hashes': 1.8.0 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 + abitype: 1.2.3(typescript@5.9.3)(zod@3.25.76) + eventemitter3: 5.0.1 + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - zod + + p-cancelable@2.1.1: {} + + p-cancelable@3.0.0: {} + + p-defer@1.0.0: {} + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + p-map@4.0.0: + dependencies: + aggregate-error: 3.1.0 + + p-memoize@4.0.4: + dependencies: + map-age-cleaner: 0.1.3 + mimic-fn: 3.1.0 + p-settle: 4.1.1 + + p-reflect@2.1.0: {} + + p-settle@4.1.1: + dependencies: + p-limit: 2.3.0 + p-reflect: 2.1.0 + + p-try@2.2.0: {} + + package-json@8.1.1: + dependencies: + got: 12.6.1 + registry-auth-token: 5.1.1 + registry-url: 6.0.1 + semver: 7.7.3 + + pako@2.1.0: {} + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-headers@2.0.6: {} + + parse-json@2.2.0: + dependencies: + error-ex: 1.3.4 + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.28.6 + error-ex: 1.3.4 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + parseurl@1.3.3: {} + + patch-console@1.0.0: {} + + path-browserify@1.0.1: {} + + path-exists@2.1.0: + dependencies: + pinkie-promise: 2.0.1 + + path-exists@4.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + path-to-regexp@0.1.12: {} + + path-type@1.1.0: + dependencies: + graceful-fs: 4.2.11 + pify: 2.3.0 + pinkie-promise: 2.0.1 + + path-type@4.0.0: {} + + pathval@1.1.1: {} + + pbkdf2@3.1.5: + 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 + + performance-now@2.1.0: {} + + picocolors@1.0.0: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + picomatch@4.0.3: {} + + pify@2.3.0: {} + + pinkie-promise@2.0.1: + dependencies: + pinkie: 2.0.4 + + pinkie@2.0.4: {} + + pino-abstract-transport@1.2.0: + dependencies: + readable-stream: 4.7.0 + split2: 4.2.0 + + pino-std-serializers@6.2.2: {} + + pino@8.21.0: + 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 + + pirates@4.0.7: {} + + pkg-dir@4.2.0: + dependencies: + find-up: 4.1.0 + + pluralize@8.0.0: {} + + poseidon-lite@0.2.1: {} + + possible-typed-array-names@1.1.0: {} + + prelude-ls@1.2.1: {} + + prettier-linter-helpers@1.0.1: + dependencies: + fast-diff: 1.3.0 + + prettier-plugin-packagejson@2.5.22(prettier@3.8.1): + dependencies: + sort-package-json: 3.6.0 + optionalDependencies: + prettier: 3.8.1 + + prettier-plugin-solidity@1.4.3(prettier@3.8.1): + dependencies: + '@solidity-parser/parser': 0.20.2 + prettier: 3.8.1 + semver: 7.7.3 + + prettier@2.8.8: {} + + prettier@3.8.1: {} + + pretty-format@29.7.0: + dependencies: + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.3.1 + + process-nextick-args@2.0.1: {} + + process-warning@3.0.0: {} + + process@0.11.10: {} + + prompts@2.4.2: + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + + prop-types@15.8.1: + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + + proto-list@1.2.4: {} + + protobufjs@7.5.4: + 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 + + proxy-addr@2.0.7: + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + + proxy-from-env@1.1.0: {} + + prr@1.0.1: {} + + psl@1.15.0: + dependencies: + punycode: 2.3.1 + + pump@3.0.3: + dependencies: + end-of-stream: 1.4.5 + once: 1.4.0 + + punycode@1.4.1: {} + + punycode@2.1.0: {} + + punycode@2.3.1: {} + + pure-rand@6.1.0: {} + + pvtsutils@1.3.6: + dependencies: + tslib: 2.8.1 + optional: true + + pvutils@1.1.5: + optional: true + + qs@6.14.1: + dependencies: + side-channel: 1.1.0 + + qs@6.5.3: {} + + query-string@5.1.1: + dependencies: + decode-uri-component: 0.2.2 + object-assign: 4.1.1 + strict-uri-encode: 1.1.0 + + querystring-es3@0.2.1: {} + + queue-microtask@1.2.3: {} + + quick-format-unescaped@4.0.4: {} + + quick-lru@5.1.1: {} + + randombytes@2.1.0: + dependencies: + safe-buffer: 5.2.1 + + range-parser@1.2.1: {} + + raw-body@2.5.3: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.1 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + + rc@1.2.8: + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + + react-devtools-core@4.28.5(bufferutil@4.1.0)(utf-8-validate@5.0.10): + dependencies: + shell-quote: 1.8.3 + ws: 7.5.10(bufferutil@4.1.0)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + react-is@16.13.1: {} + + react-is@18.3.1: {} + + react-reconciler@0.26.2(react@17.0.2): + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react: 17.0.2 + scheduler: 0.20.2 + + react@17.0.2: + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + + read-pkg-up@1.0.1: + dependencies: + find-up: 1.1.2 + read-pkg: 1.1.0 + + read-pkg@1.1.0: + dependencies: + load-json-file: 1.1.0 + normalize-package-data: 2.5.0 + path-type: 1.1.0 + + readable-stream@2.3.8: + 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 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readable-stream@4.7.0: + dependencies: + abort-controller: 3.0.0 + buffer: 6.0.3 + events: 3.3.0 + process: 0.11.10 + string_decoder: 1.3.0 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + readdirp@4.1.2: {} + + real-require@0.2.0: {} + + redeyed@2.1.1: + dependencies: + esprima: 4.0.1 + + reduce-flatten@2.0.0: {} + + reflect.getprototypeof@1.0.10: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.1 + 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 + + regexp.prototype.flags@1.5.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 + + registry-auth-token@5.1.1: + dependencies: + '@pnpm/npm-conf': 3.0.2 + + registry-url@6.0.1: + dependencies: + rc: 1.2.8 + + request@2.88.2: + 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 + + require-directory@2.1.1: {} + + require-from-string@1.2.1: {} + + require-from-string@2.0.2: {} + + require-main-filename@1.0.1: {} + + resolve-alpn@1.2.1: {} + + resolve-cwd@3.0.0: + dependencies: + resolve-from: 5.0.0 + + resolve-from@4.0.0: {} + + resolve-from@5.0.0: {} + + resolve-pkg-maps@1.0.0: {} + + resolve.exports@2.0.3: {} + + resolve@1.17.0: + dependencies: + path-parse: 1.0.7 + + resolve@1.22.11: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + responselike@2.0.1: + dependencies: + lowercase-keys: 2.0.0 + + responselike@3.0.0: + dependencies: + lowercase-keys: 3.0.0 + + restore-cursor@3.1.0: + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + + reusify@1.1.0: {} + + rimraf@2.7.1: + dependencies: + glob: 7.2.3 + + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + + ripemd160@2.0.3: + dependencies: + hash-base: 3.1.2 + inherits: 2.0.4 + + rlp@2.2.6: + dependencies: + bn.js: 4.12.2 + + rlp@2.2.7: + dependencies: + bn.js: 5.2.2 + + rpc-websockets@9.3.3: + dependencies: + '@swc/helpers': 0.5.18 + '@types/uuid': 8.3.4 + '@types/ws': 8.18.1 + buffer: 6.0.3 + eventemitter3: 5.0.4 + uuid: 8.3.2 + ws: 8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + optionalDependencies: + bufferutil: 4.1.0 + utf-8-validate: 5.0.10 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + rustbn.js@0.2.0: {} + + rxjs@7.8.2: + dependencies: + tslib: 2.8.1 + + safe-array-concat@1.1.3: + 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 + + safe-buffer@5.1.2: {} + + safe-buffer@5.2.1: {} + + safe-push-apply@1.0.0: + dependencies: + es-errors: 1.3.0 + isarray: 2.0.5 + + safe-regex-test@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-regex: 1.2.1 + + safe-stable-stringify@2.5.0: {} + + safer-buffer@2.1.2: {} + + scheduler@0.20.2: + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + + scrypt-js@3.0.1: {} + + secp256k1@4.0.4: + dependencies: + elliptic: 6.6.1 + node-addon-api: 5.1.0 + node-gyp-build: 4.8.4 + + secp256k1@5.0.1: + dependencies: + elliptic: 6.6.1 + node-addon-api: 5.1.0 + node-gyp-build: 4.8.4 + + seedrandom@3.0.5: {} + + semaphore-async-await@1.5.1: {} + + semver@5.7.2: {} + + semver@6.3.1: {} + + semver@7.7.3: {} + + send@0.19.2: + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.1 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + + serialize-javascript@6.0.2: + dependencies: + randombytes: 2.1.0 + + serve-static@1.16.3: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.19.2 + transitivePeerDependencies: + - supports-color + + servify@0.1.12: + dependencies: + body-parser: 1.20.4 + cors: 2.8.6 + express: 4.22.1 + request: 2.88.2 + xhr: 2.6.0 + transitivePeerDependencies: + - supports-color + + set-blocking@2.0.0: {} + + set-function-length@1.2.2: + 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 + + set-function-name@2.0.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + + set-proto@1.0.0: + dependencies: + dunder-proto: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + + setimmediate@1.0.5: {} + + setprototypeof@1.2.0: {} + + sha.js@2.4.12: + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + to-buffer: 1.2.2 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + shell-quote@1.8.3: {} + + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + 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 + + side-channel@1.1.0: + 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 + + signal-exit@3.0.7: {} + + simple-concat@1.0.1: {} + + simple-get@2.8.2: + dependencies: + decompress-response: 3.3.0 + once: 1.4.0 + simple-concat: 1.0.1 + + sisteransi@1.0.5: {} + + slash@3.0.0: {} + + slice-ansi@3.0.0: + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + + slice-ansi@4.0.0: + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + + snake-case@3.0.4: + dependencies: + dot-case: 3.0.4 + tslib: 2.8.1 + + solc@0.4.26: + dependencies: + fs-extra: 0.30.0 + memorystream: 0.3.1 + require-from-string: 1.2.1 + semver: 5.7.2 + yargs: 4.8.1 + + solc@0.8.15: + 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 + + solc@0.8.26(debug@4.4.3): + 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 + + solhint@4.5.4(typescript@5.9.3): + 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.1 + latest-version: 7.0.0 + lodash: 4.17.23 + 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 + + solidity-bytes-utils@0.8.4: {} + + sonic-boom@3.8.1: + dependencies: + atomic-sleep: 1.0.0 + + sort-object-keys@2.1.0: {} + + sort-package-json@3.6.0: + dependencies: + detect-indent: 7.0.2 + detect-newline: 4.0.1 + git-hooks-list: 4.2.1 + is-plain-obj: 4.1.0 + semver: 7.7.3 + sort-object-keys: 2.1.0 + tinyglobby: 0.2.15 + + source-map-support@0.5.13: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + + spdx-correct@3.2.0: + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.22 + + spdx-exceptions@2.5.0: {} + + spdx-expression-parse@3.0.1: + dependencies: + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.22 + + spdx-license-ids@3.0.22: {} + + split2@4.2.0: {} + + sprintf-js@1.0.3: {} + + sshpk@1.18.0: + 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 + + stable-hash@0.0.5: {} + + stack-trace@0.0.10: {} + + stack-utils@2.0.6: + dependencies: + escape-string-regexp: 2.0.0 + + stacktrace-parser@0.1.11: + dependencies: + type-fest: 0.7.1 + + starknet@8.9.2: + dependencies: + '@noble/curves': 1.7.0 + '@noble/hashes': 1.6.1 + '@scure/base': 1.2.6 + '@scure/starknet': 1.1.0 + '@starknet-io/starknet-types-08': '@starknet-io/types-js@0.8.4' + '@starknet-io/starknet-types-09': '@starknet-io/types-js@0.9.2' + abi-wan-kanabi: 2.2.4 + lossless-json: 4.3.0 + pako: 2.1.0 + ts-mixer: 6.0.4 + + statuses@2.0.2: {} + + stop-iteration-iterator@1.1.0: + dependencies: + es-errors: 1.3.0 + internal-slot: 1.1.0 + + stream-chain@2.2.5: {} + + stream-json@1.9.1: + dependencies: + stream-chain: 2.2.5 + + strict-uri-encode@1.1.0: {} + + string-format@2.0.0: {} + + string-length@4.0.2: + dependencies: + char-regex: 1.0.2 + strip-ansi: 6.0.1 + + string-similarity@4.0.4: {} + + string-width@1.0.2: + dependencies: + code-point-at: 1.1.0 + is-fullwidth-code-point: 1.0.0 + strip-ansi: 3.0.1 + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string.prototype.trim@1.2.10: + 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.1 + es-object-atoms: 1.1.1 + has-property-descriptors: 1.0.2 + + string.prototype.trimend@1.0.9: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + string.prototype.trimstart@1.0.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + strip-ansi@3.0.1: + dependencies: + ansi-regex: 2.1.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-bom@2.0.0: + dependencies: + is-utf8: 0.2.1 + + strip-bom@3.0.0: {} + + strip-bom@4.0.0: {} + + strip-final-newline@2.0.0: {} + + strip-hex-prefix@1.0.0: + dependencies: + is-hex-prefixed: 1.0.0 + + strip-json-comments@2.0.1: {} + + strip-json-comments@3.1.1: {} + + superstruct@0.15.5: {} + + superstruct@2.0.2: {} + + supports-color@5.5.0: + dependencies: + has-flag: 3.0.0 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + swarm-js@0.1.42(bufferutil@4.1.0)(utf-8-validate@5.0.10): + dependencies: + bluebird: 3.7.2 + buffer: 5.7.1 + eth-lib: 0.1.29(bufferutil@4.1.0)(utf-8-validate@5.0.10) + 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 + + symbol.inspect@1.0.1: {} + + synckit@0.11.12: + dependencies: + '@pkgr/core': 0.2.9 + + table-layout@1.0.2: + dependencies: + array-back: 4.0.2 + deep-extend: 0.6.0 + typical: 5.2.0 + wordwrapjs: 4.0.1 + + table@6.8.2: + 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 + + table@6.9.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 + + tar@4.4.19: + 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 + + teslabot@1.5.0: {} + + test-exclude@6.0.0: + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 7.2.3 + minimatch: 3.1.2 + + testrpc@0.0.1: {} + + text-encoding-utf-8@1.0.2: {} + + text-hex@1.0.0: {} + + text-table@0.2.0: {} + + thread-stream@2.7.0: + dependencies: + real-require: 0.2.0 + + timed-out@4.0.1: {} + + timers-ext@0.1.8: + dependencies: + es5-ext: 0.10.64 + next-tick: 1.1.0 + + tiny-invariant@1.3.3: {} + + tinycolor2@1.6.0: {} + + tinyglobby@0.2.15: + dependencies: + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + + tinygradient@0.4.3: + dependencies: + '@types/tinycolor2': 1.4.6 + tinycolor2: 1.6.0 + + tmp@0.0.33: + dependencies: + os-tmpdir: 1.0.2 + + tmpl@1.0.5: {} + + to-buffer@1.2.2: + dependencies: + isarray: 2.0.5 + safe-buffer: 5.2.1 + typed-array-buffer: 1.0.3 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + toidentifier@1.0.1: {} + + toml@3.0.0: {} + + tough-cookie@2.5.0: + dependencies: + psl: 1.15.0 + punycode: 2.3.1 + + tr46@0.0.3: {} + + tree-kill@1.2.2: {} + + triple-beam@1.4.1: {} + + tronweb@5.3.4(bufferutil@4.1.0)(utf-8-validate@5.0.10): + dependencies: + '@babel/runtime': 7.28.6 + '@ethersproject/abi': 5.8.0 + '@tronweb3/google-protobuf': 3.21.4 + axios: 1.13.3 + bignumber.js: 9.3.1 + ethereum-cryptography: 2.2.1 + ethers: 5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + eventemitter3: 3.1.2 + injectpromise: 1.0.0 + lodash: 4.17.23 + querystring-es3: 0.2.1 + semver: 5.7.2 + validator: 13.15.26 + transitivePeerDependencies: + - bufferutil + - debug + - utf-8-validate + + ts-api-utils@1.4.3(typescript@5.9.3): + dependencies: + typescript: 5.9.3 + + ts-command-line-args@2.5.1: + dependencies: + chalk: 4.1.2 + command-line-args: 5.2.1 + command-line-usage: 6.1.3 + string-format: 2.0.0 + + ts-essentials@7.0.3(typescript@5.9.3): + dependencies: + typescript: 5.9.3 + + ts-mixer@6.0.4: {} + + ts-node@10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.18))(@types/node@18.18.14)(typescript@5.9.3): + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.12 + '@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.4 + make-error: 1.3.6 + typescript: 5.9.3 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + optionalDependencies: + '@swc/core': 1.15.10(@swc/helpers@0.5.18) + + tsconfig-paths@3.15.0: + dependencies: + '@types/json5': 0.0.29 + json5: 1.0.2 + minimist: 1.2.8 + strip-bom: 3.0.0 + + tslib@1.14.1: {} + + tslib@2.8.1: {} + + tsort@0.0.1: {} + + tsutils@3.21.0(typescript@5.9.3): + dependencies: + tslib: 1.14.1 + typescript: 5.9.3 + + tunnel-agent@0.6.0: + dependencies: + safe-buffer: 5.2.1 + + tweetnacl@0.14.5: {} + + tweetnacl@1.0.3: {} + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + type-detect@4.0.8: {} + + type-detect@4.1.0: {} + + type-fest@0.12.0: {} + + type-fest@0.20.2: {} + + type-fest@0.21.3: {} + + type-fest@0.7.1: {} + + type-is@1.6.18: + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + + type@2.7.3: {} + + typechain@8.3.2(typescript@5.9.3): + 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.23 + 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 + + typed-array-buffer@1.0.3: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-typed-array: 1.1.15 + + typed-array-byte-length@1.0.3: + 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 + + typed-array-byte-offset@1.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 + + typed-array-length@1.0.7: + 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 + + typedarray-to-buffer@3.1.5: + dependencies: + is-typedarray: 1.0.0 + + typescript@5.9.3: {} + + typical@4.0.0: {} + + typical@5.2.0: {} + + uint8array-tools@0.0.8: {} + + ultron@1.1.1: {} + + unbox-primitive@1.1.0: + dependencies: + call-bound: 1.0.4 + has-bigints: 1.1.0 + has-symbols: 1.1.0 + which-boxed-primitive: 1.1.1 + + undici-types@5.26.5: {} + + undici@5.29.0: + dependencies: + '@fastify/busboy': 2.1.1 + + universalify@0.1.2: {} + + universalify@2.0.1: {} + + unpipe@1.0.0: {} + + unrs-resolver@1.11.1: + 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 + + update-browserslist-db@1.2.3(browserslist@4.28.1): + dependencies: + browserslist: 4.28.1 + escalade: 3.2.0 + picocolors: 1.1.1 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + url-set-query@1.0.0: {} + + url@0.11.4: + dependencies: + punycode: 1.4.1 + qs: 6.14.1 + + utf-8-validate@5.0.10: + dependencies: + node-gyp-build: 4.8.4 + + utf-8-validate@5.0.7: + dependencies: + node-gyp-build: 4.8.4 + optional: true + + utf8@3.0.0: {} + + util-deprecate@1.0.2: {} + + util@0.12.5: + 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.20 + + utils-merge@1.0.1: {} + + uuid@3.4.0: {} + + uuid@8.3.2: {} + + uuid@9.0.1: {} + + v8-compile-cache-lib@3.0.1: {} + + v8-to-istanbul@9.3.0: + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + '@types/istanbul-lib-coverage': 2.0.6 + convert-source-map: 2.0.0 + + valibot@0.37.0(typescript@5.9.3): + optionalDependencies: + typescript: 5.9.3 + + valibot@1.2.0(typescript@5.9.3): + optionalDependencies: + typescript: 5.9.3 + + validate-npm-package-license@3.0.4: + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + + validator@13.15.26: {} + + varint@5.0.2: {} + + vary@1.1.2: {} + + verror@1.10.0: + dependencies: + assert-plus: 1.0.0 + core-util-is: 1.0.2 + extsprintf: 1.3.0 + + viem@2.45.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76): + dependencies: + '@noble/curves': 1.9.1 + '@noble/hashes': 1.8.0 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 + abitype: 1.2.3(typescript@5.9.3)(zod@3.25.76) + isows: 1.0.7(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + ox: 0.11.3(typescript@5.9.3)(zod@3.25.76) + ws: 8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod + + walker@1.0.8: + dependencies: + makeerror: 1.0.12 + + web3-bzz@1.10.4(bufferutil@4.1.0)(utf-8-validate@5.0.10): + dependencies: + '@types/node': 12.20.55 + got: 12.1.0 + swarm-js: 0.1.42(bufferutil@4.1.0)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + web3-core-helpers@1.10.4: + dependencies: + web3-eth-iban: 1.10.4 + web3-utils: 1.10.4 + + web3-core-method@1.10.4: + 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 + + web3-core-promievent@1.10.4: + dependencies: + eventemitter3: 4.0.4 + + web3-core-requestmanager@1.10.4: + 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 + + web3-core-subscriptions@1.10.4: + dependencies: + eventemitter3: 4.0.4 + web3-core-helpers: 1.10.4 + + web3-core@1.10.4: + 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 + + web3-eth-abi@1.10.4: + dependencies: + '@ethersproject/abi': 5.8.0 + web3-utils: 1.10.4 + + web3-eth-accounts@1.10.4: + 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 + + web3-eth-contract@1.10.4: + 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 + + web3-eth-ens@1.10.4: + 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 + + web3-eth-iban@1.10.4: + dependencies: + bn.js: 5.2.2 + web3-utils: 1.10.4 + + web3-eth-personal@1.10.4: + 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 + + web3-eth@1.10.4: + 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 + + web3-net@1.10.4: + dependencies: + web3-core: 1.10.4 + web3-core-method: 1.10.4 + web3-utils: 1.10.4 + transitivePeerDependencies: + - encoding + - supports-color + + web3-providers-http@1.10.4: + dependencies: + abortcontroller-polyfill: 1.7.8 + cross-fetch: 4.1.0 + es6-promise: 4.2.8 + web3-core-helpers: 1.10.4 + transitivePeerDependencies: + - encoding + + web3-providers-ipc@1.10.4: + dependencies: + oboe: 2.1.5 + web3-core-helpers: 1.10.4 + + web3-providers-ws@1.10.4: + dependencies: + eventemitter3: 4.0.4 + web3-core-helpers: 1.10.4 + websocket: 1.0.35 + transitivePeerDependencies: + - supports-color + + web3-shh@1.10.4: + 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 + + web3-utils@1.10.4: + 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 + + web3@1.10.4(bufferutil@4.1.0)(utf-8-validate@5.0.10): + dependencies: + web3-bzz: 1.10.4(bufferutil@4.1.0)(utf-8-validate@5.0.10) + 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 + + webidl-conversions@3.0.1: {} + + websocket@1.0.35: + dependencies: + bufferutil: 4.1.0 + 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 + + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + which-boxed-primitive@1.1.1: + 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 + + which-builtin-type@1.2.1: + 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.20 + + which-collection@1.0.2: + dependencies: + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.4 + + which-module@1.0.0: {} + + which-typed-array@1.1.20: + 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 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + widest-line@3.1.0: + dependencies: + string-width: 4.2.3 + + wif@5.0.0: + dependencies: + bs58check: 4.0.0 + + window-size@0.2.0: {} + + winston-transport@4.9.0: + dependencies: + logform: 2.7.0 + readable-stream: 3.6.2 + triple-beam: 1.4.1 + + winston@3.19.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 + + word-wrap@1.2.5: {} + + wordwrapjs@4.0.1: + dependencies: + reduce-flatten: 2.0.0 + typical: 5.2.0 + + workerpool@6.5.1: {} + + wrap-ansi@2.1.0: + dependencies: + string-width: 1.0.2 + strip-ansi: 3.0.1 + + wrap-ansi@6.2.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrappy@1.0.2: {} + + write-file-atomic@4.0.2: + dependencies: + imurmurhash: 0.1.4 + signal-exit: 3.0.7 + + ws@3.3.3(bufferutil@4.1.0)(utf-8-validate@5.0.10): + dependencies: + async-limiter: 1.0.1 + safe-buffer: 5.1.2 + ultron: 1.1.1 + optionalDependencies: + bufferutil: 4.1.0 + utf-8-validate: 5.0.10 + + ws@7.5.10(bufferutil@4.1.0)(utf-8-validate@5.0.10): + optionalDependencies: + bufferutil: 4.1.0 + utf-8-validate: 5.0.10 + + ws@8.18.0(bufferutil@4.1.0)(utf-8-validate@5.0.10): + optionalDependencies: + bufferutil: 4.1.0 + utf-8-validate: 5.0.10 + + ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10): + optionalDependencies: + bufferutil: 4.1.0 + utf-8-validate: 5.0.10 + + ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10): + optionalDependencies: + bufferutil: 4.1.0 + utf-8-validate: 5.0.10 + + xhr-request-promise@0.1.3: + dependencies: + xhr-request: 1.1.0 + + xhr-request@1.1.0: + 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 + + xhr@2.6.0: + dependencies: + global: 4.4.0 + is-function: 1.0.2 + parse-headers: 2.0.6 + xtend: 4.0.2 + + xtend@4.0.2: {} + + y18n@3.2.2: {} + + y18n@5.0.8: {} + + yaeti@0.0.6: {} + + yallist@3.1.1: {} + + yargs-parser@2.4.1: + dependencies: + camelcase: 3.0.0 + lodash.assign: 4.2.0 + + yargs-parser@20.2.9: {} + + yargs-parser@21.1.1: {} + + yargs-unparser@2.0.0: + dependencies: + camelcase: 6.3.0 + decamelize: 4.0.0 + flat: 5.0.2 + is-plain-obj: 2.1.0 + + yargs@16.2.0: + 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 + + yargs@17.7.2: + 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 + + yargs@4.8.1: + 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 + + yn@3.1.1: {} + + yocto-queue@0.1.0: {} + + yoga-layout-prebuilt@1.10.0: + dependencies: + '@types/yoga-layout': 1.9.2 + + zksync-ethers@5.11.1(ethers@5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)): + dependencies: + ethers: 5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + + zksync-web3@0.14.4(ethers@5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)): + dependencies: + ethers: 5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + + zod@3.25.76: {} 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..1aac45e711 --- /dev/null +++ b/examples/oft-main/starknet/deploy-starknet-mainnet.js @@ -0,0 +1,145 @@ +#!/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 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, + }); + 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, + ], + }); + 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]); + 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]); + 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) { + // Prepare compose parameters + let (compose_from, compose_msg, msg_type) = if (send_param.compose_msg().length() > 0) { + (option::some(bytes32::from_address(sender)), option::some(*send_param.compose_msg()), SEND_AND_CALL_TYPE) + } else { + (option::none(), option::none(), SEND_TYPE) + }; + + // Encode message and combine options + let message = oft_msg_codec::encode(send_param.to(), self.to_sd(amount_ld), compose_from, compose_msg); + let options = oapp.combine_options(send_param.dst_eid(), msg_type, *send_param.extra_options()); + (message, options) +} + +/// Removes precision dust by rounding down to the nearest representable amount in shared decimals. +fun remove_dust(self: &OFT, amount_ld: u64): u64 { + (amount_ld / self.decimal_conversion_rate) * self.decimal_conversion_rate +} + +/// Converts an amount from standardized shared decimals to local chain decimal precision. +fun to_ld(self: &OFT, amount_sd: u64): u64 { + amount_sd * self.decimal_conversion_rate +} + +/// Converts an amount from local chain decimal precision to standardized shared decimals. +fun to_sd(self: &OFT, amount_ld: u64): u64 { + amount_ld / self.decimal_conversion_rate +} + +// === Assertions === + +fun assert_admin(self: &OFT, admin: &AdminCap) { + assert!(object::id_address(admin) == self.admin_cap, EInvalidAdminCap); +} + +fun assert_upgrade_version(self: &OFT) { + assert!(self.upgrade_version == UPGRADE_VERSION, EWrongUpgradeVersion); +} + +// === Test Functions === + +#[test_only] +public(package) fun debit_for_test( + self: &mut OFT, + coin: &mut Coin, + dst_eid: u32, + amount_ld: u64, + min_amount_ld: u64, + ctx: &mut TxContext, +): (u64, u64) { + self.debit(coin, dst_eid, amount_ld, min_amount_ld, ctx) +} + +#[test_only] +public(package) fun mint_for_testing(self: &mut OFT, amount_ld: u64, ctx: &mut TxContext): Coin { + self.credit(amount_ld, ctx) +} + +#[test_only] +public(package) fun cap_for_test(self: &OFT): &CallCap { + &self.oft_cap +} + +#[test_only] +public(package) fun destruct_oft_sent_event(event: OFTSentEvent): (Bytes32, u32, address, u64, u64) { + let OFTSentEvent { guid, dst_eid, from_address, amount_sent_ld, amount_received_ld } = event; + (guid, dst_eid, from_address, amount_sent_ld, amount_received_ld) +} + +#[test_only] +public(package) fun remove_dust_for_test(self: &OFT, amount_ld: u64): u64 { + self.remove_dust(amount_ld) +} + +#[test_only] +public(package) fun register_oapp_for_test( + self: &OFT, + endpoint: &mut EndpointV2, + lz_receive_info: vector, + ctx: &mut TxContext, +) { + endpoint.register_oapp(&self.oft_cap, lz_receive_info, ctx); +} + +#[test_only] +public(package) fun to_ld_for_test(self: &OFT, amount_sd: u64): u64 { + self.to_ld(amount_sd) +} + +#[test_only] +public(package) fun to_sd_for_test(self: &OFT, amount_ld: u64): u64 { + self.to_sd(amount_ld) +} + +#[test_only] +public(package) fun debit_view_for_test( + self: &OFT, + dst_eid: u32, + amount_ld: u64, + min_amount_ld: u64, +): (u64, u64) { + self.debit_view(dst_eid, amount_ld, min_amount_ld) +} + +#[test_only] +public(package) fun init_oft_for_test( + oapp: &OApp, + oft_cap: CallCap, + treasury_cap: TreasuryCap, + coin_metadata: &CoinMetadata, + shared_decimals: u8, + ctx: &mut TxContext, +): (OFT, MigrationCap) { + init_oft_internal( + oapp, + oft_cap, + coin_metadata, + shared_decimals, + OFTTreasury::OFT { treasury_cap }, + false, + ctx, + ) +} + +#[test_only] +public(package) fun share_oft_for_test(oft: OFT) { + transfer::share_object(oft); +} diff --git a/examples/oft-main/sui/oft/sources/oft_impl.move b/examples/oft-main/sui/oft/sources/oft_impl.move new file mode 100644 index 0000000000..34e0184fbd --- /dev/null +++ b/examples/oft-main/sui/oft/sources/oft_impl.move @@ -0,0 +1,104 @@ +/// # OFT Implementation Module +/// +/// This module provides the implementation for initializing OFT (Omnichain Fungible Token) objects. +/// It handles the two-phase creation process: +/// 1. Package initialization creates an OFTInitTicket with the necessary components +/// 2. Users consume the ticket to create either a standard OFT(mint/burn model) or an OFT adapter(escrow/release model) +/// +/// The module supports two types of OFTs: +/// - **Standard OFT**: Uses a TreasuryCap to mint/burn tokens for cross-chain transfers +/// - **OFT Adapter**: Wraps existing tokens using an escrow mechanism(escrow/release model) +module oft::oft_impl; + +use call::call_cap::CallCap; +use oapp::oapp::{Self, OApp, AdminCap}; +use oft::oft; +use oft_common::migration::MigrationCap; +use sui::coin::{TreasuryCap, CoinMetadata}; + +// === Errors === + +const EInvalidOApp: u64 = 1; + +/// One-time witness struct used during package initialization. +public struct OFT_IMPL has drop {} + +/// Ticket that holds the components needed to create an OFT. +public struct OFTInitTicket has key { + id: UID, + /// Call capability for the OFT + oft_cap: CallCap, + /// Address of the OApp object + oapp_object: address, + /// Admin capability for the OFT & OApp + admin_cap: AdminCap, +} + +/// Package initialization function called when the module is first published. +/// Creates the initial OApp components and transfers them to the publisher. +fun init(otw: OFT_IMPL, ctx: &mut TxContext) { + let (oft_cap, admin_cap, oapp_object) = oapp::new(&otw, ctx); + transfer::transfer(OFTInitTicket { id: object::new(ctx), oft_cap, oapp_object, admin_cap }, ctx.sender()); +} + +/// Initializes a standard OFT (Omnichain Fungible Token). +/// A standard OFT uses a TreasuryCap to mint and burn tokens for cross-chain transfers. +/// +/// **Parameters**: +/// - `ticket`: Creation ticket obtained from package initialization +/// - `oapp`: Associated OApp instance that can only be called by this OFT object with the hold of the oft_cap +/// - `treasury`: Treasury capability for the token type T +/// - `metadata`: Metadata for the coin type T +/// - `shared_decimals`: Number of decimals to use for cross-chain operations +/// +/// **Returns**: +/// - `AdminCap`: Capability for managing the OFT +/// - `MigrationCap`: Capability for future migrations of this OFT +public fun init_oft( + ticket: OFTInitTicket, + oapp: &OApp, + treasury: TreasuryCap, + metadata: &CoinMetadata, + shared_decimals: u8, + ctx: &mut TxContext, +): (AdminCap, MigrationCap) { + let (oft_cap, admin_cap) = destroy_oft_init_ticket(ticket, oapp); + let migration_cap = oft::init_oft(oapp, oft_cap, treasury, metadata, shared_decimals, ctx); + + (admin_cap, migration_cap) +} + +/// Creates and initializes an OFT Adapter for existing tokens. +/// An OFT Adapter wraps existing tokens using an escrow mechanism instead of minting/burning. +/// This allows existing tokens to gain cross-chain capabilities without modifying their supply. +/// +/// **Parameters**: +/// - `ticket`: Creation ticket obtained from package initialization +/// - `oapp`: Associated OApp instance that can only be called by this OFT object with the hold of the oft_cap +/// - `metadata`: Metadata for the existing coin type T +/// - `shared_decimals`: Number of decimals to use for cross-chain operations +/// +/// **Returns**: +/// - `AdminCap`: Capability for managing the OFT Adapter +/// - `MigrationCap`: Capability for future migrations of this OFT Adapter +public fun init_oft_adapter( + ticket: OFTInitTicket, + oapp: &OApp, + metadata: &CoinMetadata, + shared_decimals: u8, + ctx: &mut TxContext, +): (AdminCap, MigrationCap) { + let (oft_cap, admin_cap) = destroy_oft_init_ticket(ticket, oapp); + let migration_cap = oft::init_oft_adapter(oapp, oft_cap, metadata, shared_decimals, ctx); + + (admin_cap, migration_cap) +} + +// === Helper Functions === + +fun destroy_oft_init_ticket(ticket: OFTInitTicket, expected_oapp: &OApp): (CallCap, AdminCap) { + let OFTInitTicket { id, oft_cap, oapp_object, admin_cap } = ticket; + assert!(oapp_object == object::id_address(expected_oapp), EInvalidOApp); + object::delete(id); + (oft_cap, admin_cap) +} diff --git a/examples/oft-main/sui/oft/sources/oft_ptb_builder.move b/examples/oft-main/sui/oft/sources/oft_ptb_builder.move new file mode 100644 index 0000000000..b71655f8c6 --- /dev/null +++ b/examples/oft-main/sui/oft/sources/oft_ptb_builder.move @@ -0,0 +1,169 @@ +/// OFT Programmable Transaction Block (PTB) Builder +/// +/// This module provides utilities for building programmable transaction blocks (PTBs) +/// that handle OFT cross-chain message reception and compose operations. +module oft::oft_ptb_builder; + +use call::call::{Call, Void}; +use endpoint_v2::{endpoint_v2::EndpointV2, lz_receive::LzReceiveParam}; +use oapp::ptb_builder_helper; +use oft::{oft::OFT, oft_msg_codec}; +use oft_common::oft_composer_manager::OFTComposerManager; +use ptb_move_call::{argument, move_call::{Self, MoveCall}, move_calls_builder::{Self, MoveCallsBuilder}}; +use std::type_name; +use sui::{bcs, clock::Clock}; +use utils::{buffer_writer, package}; + +/// Version identifier for lz_receive_info format - version 1 includes 2-byte version header plus serialized MoveCall +/// vector +const LZ_RECEIVE_INFO_VERSION_1: u16 = 1; + +public struct OFTPtbBuilder {} + +/// Generates execution metadata for OFT registration with LayerZero endpoint. +/// +/// **Parameters**: +/// - `oft`: OFT instance that will be registered with the endpoint +/// - `endpoint`: LayerZero V2 endpoint for message processing infrastructure +/// - `composer_manager`: Manager for routing compose transfers to composers +/// +/// **Returns**: Serialized execution metadata for endpoint registration +public fun lz_receive_info( + oft: &OFT, + endpoint: &EndpointV2, + composer_manager: &OFTComposerManager, + clock: &Clock, +): vector { + let lz_receive_move_calls = vector[ + move_call::create( + oft_package(), + b"oft_ptb_builder".to_ascii_string(), + b"build_lz_receive_ptb".to_ascii_string(), + vector[ + argument::create_object(object::id_address(oft)), + argument::create_object(object::id_address(endpoint)), + argument::create_object(object::id_address(composer_manager)), + argument::create_id(ptb_builder_helper::lz_receive_call_id()), + argument::create_object(object::id_address(clock)), + ], + vector[type_name::get()], + true, + vector[], + ), + ]; + let move_calls_bytes = bcs::to_bytes(&lz_receive_move_calls); + let mut writer = buffer_writer::new(); + writer.write_u16(LZ_RECEIVE_INFO_VERSION_1).write_bytes(move_calls_bytes); + writer.to_bytes() +} + +/// Dynamically builds a PTB for processing incoming LayerZero messages based on message content. +/// +/// **Parameters**: +/// - `oft`: Target OFT instance that will process the message +/// - `endpoint`: LayerZero endpoint managing message processing +/// - `composer_manager`: Manager for routing compose transfers (used if compose detected) +/// - `call`: LayerZero receive call containing the cross-chain message +/// +/// **Returns**: Vector of Move calls forming a complete PTB for message execution +public fun build_lz_receive_ptb( + oft: &OFT, + endpoint: &EndpointV2, + composer_manager: &OFTComposerManager, + call: &Call, + clock: &Clock, +): vector { + let mut builder = move_calls_builder::new(); + let message = oft_msg_codec::decode(*call.param().message()); + if (message.is_composed()) { + add_lz_receive_compose_call( + &mut builder, + oft, + endpoint, + object::id_address(composer_manager), + message.send_to(), + clock, + ); + } else { + add_lz_receive_call(&mut builder, oft, clock); + }; + builder.build() +} + +/// Adds a standard lz_receive call to the PTB builder for simple token transfers. +/// +/// **Parameters**: +/// - `builder`: PTB builder to add the call to +/// - `oft`: Target OFT instance that will process the token transfer +fun add_lz_receive_call(builder: &mut MoveCallsBuilder, oft: &OFT, clock: &Clock) { + let oapp_object = oft.oapp_object(); + builder.add( + move_call::create( + oft_package(), + b"oft".to_ascii_string(), + b"lz_receive".to_ascii_string(), + vector[ + argument::create_object(object::id_address(oft)), + argument::create_object(oapp_object), + argument::create_id(ptb_builder_helper::lz_receive_call_id()), + argument::create_object(object::id_address(clock)), + ], + vector[type_name::get()], + false, + vector[], + ), + ); +} + +/// Adds a compose-enabled lz_receive call to the PTB builder for complex cross-chain workflows. +/// +/// **Parameters**: +/// - `builder`: PTB builder to add the compose call to +/// - `oft`: Target OFT instance that will process the compose transfer +/// - `endpoint`: LayerZero endpoint managing compose message queuing +/// - `composer_manager`: Address of the composer manager for token routing +/// - `composer`: Target composer address that will execute the compose logic +fun add_lz_receive_compose_call( + builder: &mut MoveCallsBuilder, + oft: &OFT, + endpoint: &EndpointV2, + composer_manager: address, + composer: address, + clock: &Clock, +) { + let compose_queue = endpoint.get_compose_queue(composer); + let oapp_object = oft.oapp_object(); + builder.add( + move_call::create( + oft_package(), + b"oft".to_ascii_string(), + b"lz_receive_with_compose".to_ascii_string(), + vector[ + argument::create_object(object::id_address(oft)), + argument::create_object(oapp_object), + argument::create_object(compose_queue), + argument::create_object(composer_manager), + argument::create_id(ptb_builder_helper::lz_receive_call_id()), + argument::create_object(object::id_address(clock)), + ], + vector[type_name::get()], + false, + vector[], + ), + ); +} + +/// Returns the current package address for OFT operations. +/// +/// When upgrading OFT contracts, create a new struct (e.g., OFTPtbBuilder2) +/// and update this function to use the new type to get the latest package address: +/// ``` +/// fun oft_package(): address { +/// package::package_of_type() +/// } +/// ``` +/// This approach ensures PTB builders always reference the most recent +/// package version after contract upgrades. +fun oft_package(): address { + package::package_of_type() +} diff --git a/examples/oft-main/sui/oft/sources/types/oft_fee_detail.move b/examples/oft-main/sui/oft/sources/types/oft_fee_detail.move new file mode 100644 index 0000000000..4a19526af7 --- /dev/null +++ b/examples/oft-main/sui/oft/sources/types/oft_fee_detail.move @@ -0,0 +1,34 @@ +module oft::oft_fee_detail; + +use std::ascii::String; + +// === Structs === + +/// Detailed fee information for OFT transfer operations +public struct OFTFeeDetail has copy, drop, store { + /// Fee amount in local decimals (positive value regardless of fee/reward) + fee_amount_ld: u64, + /// Whether this represents a reward (true) or cost (false) to the user + is_reward: bool, + /// Human-readable description of this fee component + description: String, +} + +// === Creation === + +/// Creates fee detail information for OFT operations +public(package) fun create(fee_amount_ld: u64, is_reward: bool, description: String): OFTFeeDetail { + OFTFeeDetail { fee_amount_ld, is_reward, description } +} + +// === Getters === + +/// Returns the fee amount and reward flag (amount should be subtracted if reward is true) +public fun fee_amount_ld(self: &OFTFeeDetail): (u64, bool) { + (self.fee_amount_ld, self.is_reward) +} + +/// Returns the human-readable description of this fee component +public fun description(self: &OFTFeeDetail): &String { + &self.description +} diff --git a/examples/oft-main/sui/oft/sources/types/oft_limit.move b/examples/oft-main/sui/oft/sources/types/oft_limit.move new file mode 100644 index 0000000000..65f06182bc --- /dev/null +++ b/examples/oft-main/sui/oft/sources/types/oft_limit.move @@ -0,0 +1,37 @@ +module oft::oft_limit; + +use std::u64; + +// === Structs === + +/// Transfer amount bounds for OFT quote operations +public struct OFTLimit has copy, drop, store { + /// Minimum amount for transfer quotes in local decimals + min_amount_ld: u64, + /// Maximum amount for transfer quotes in local decimals + max_amount_ld: u64, +} + +// === Creation === + +/// Creates transfer bounds with specified minimum and maximum quote amounts +public(package) fun create(min_amount_ld: u64, max_amount_ld: u64): OFTLimit { + OFTLimit { min_amount_ld, max_amount_ld } +} + +/// Creates unbounded transfer bounds (no minimum, maximum possible amount for quotes) +public(package) fun new_unbounded_oft_limit(): OFTLimit { + OFTLimit { min_amount_ld: 0, max_amount_ld: u64::max_value!() } +} + +// === Getters === + +/// Returns the minimum amount for transfer quotes in local decimals +public fun min_amount_ld(self: &OFTLimit): u64 { + self.min_amount_ld +} + +/// Returns the maximum amount for transfer quotes in local decimals +public fun max_amount_ld(self: &OFTLimit): u64 { + self.max_amount_ld +} diff --git a/examples/oft-main/sui/oft/sources/types/oft_receipt.move b/examples/oft-main/sui/oft/sources/types/oft_receipt.move new file mode 100644 index 0000000000..0799de2964 --- /dev/null +++ b/examples/oft-main/sui/oft/sources/types/oft_receipt.move @@ -0,0 +1,30 @@ +module oft::oft_receipt; + +// === Structs === + +/// Receipt providing transaction details for cross-chain OFT transfers +public struct OFTReceipt has copy, drop, store { + /// Amount actually debited from sender in local decimals (after fees) + amount_sent_ld: u64, + /// Amount that will be received on destination chain in local decimals + amount_received_ld: u64, +} + +// === Creation === + +/// Creates a receipt documenting the amounts involved in an OFT transfer +public(package) fun create(amount_sent_ld: u64, amount_received_ld: u64): OFTReceipt { + OFTReceipt { amount_sent_ld, amount_received_ld } +} + +// === Getters === + +/// Returns the actual amount debited from sender (includes fees and protocol costs) +public fun amount_sent_ld(self: &OFTReceipt): u64 { + self.amount_sent_ld +} + +/// Returns the amount that will be received on the destination chain +public fun amount_received_ld(self: &OFTReceipt): u64 { + self.amount_received_ld +} diff --git a/examples/oft-main/sui/oft/sources/types/oft_send_context.move b/examples/oft-main/sui/oft/sources/types/oft_send_context.move new file mode 100644 index 0000000000..6cd02e50aa --- /dev/null +++ b/examples/oft-main/sui/oft/sources/types/oft_send_context.move @@ -0,0 +1,53 @@ +/// OFT Send Context Module +/// +/// This module provides the `OFTSendContext` struct which encapsulates the context +/// information for OFT send operations. It combines transfer receipt details with +/// sender information to maintain the connection between transfer details and the +/// originating sender address throughout the two-phase OFT transfer process (send -> confirm). +/// +/// This design enables the OFT system to validate that the same entity that initiated +/// a transfer is the one confirming it, providing security against unauthorized confirmations. +module oft::oft_send_context; + +use oft::oft_receipt::OFTReceipt; + +// === Structs === + +/// Encapsulates the context information for an OFT send operation. +public struct OFTSendContext { + oft_receipt: OFTReceipt, + sender: address, + call_id: address, +} + +// === Creation === + +/// Creates a new OFTSendContext by combining transfer details with sender info. +public(package) fun create(oft_receipt: OFTReceipt, sender: address, call_id: address): OFTSendContext { + OFTSendContext { oft_receipt, sender, call_id } +} + +// === Destruction === + +/// Destroys the send context and returns its constituent parts. +public(package) fun destroy(self: OFTSendContext): (OFTReceipt, address, address) { + let OFTSendContext { oft_receipt, sender, call_id } = self; + (oft_receipt, sender, call_id) +} + +// === Getters === + +/// Returns the sender address associated with this send context. +public fun sender(self: &OFTSendContext): address { + self.sender +} + +/// Returns a reference to the underlying OFT receipt. +public fun oft_receipt(self: &OFTSendContext): &OFTReceipt { + &self.oft_receipt +} + +/// Returns the call ID associated with this send context. +public fun call_id(self: &OFTSendContext): address { + self.call_id +} diff --git a/examples/oft-main/sui/oft/sources/types/oft_sender.move b/examples/oft-main/sui/oft/sources/types/oft_sender.move new file mode 100644 index 0000000000..47f8522744 --- /dev/null +++ b/examples/oft-main/sui/oft/sources/types/oft_sender.move @@ -0,0 +1,48 @@ +/// OFT Sender Module +/// +/// This module defines the `OFTSender` enum which represents different types of senders +/// that can initiate OFT (Omnichain Fungible Token) transfers. It provides a unified +/// interface for handling both transaction-based senders and capability-based senders. +module oft::oft_sender; + +use call::call_cap::CallCap; + +// === Structs === + +/// Represents the different types of senders that can initiate OFT transfers. +public enum OFTSender has drop { + /// Transaction-based sender - represents a direct transaction sender + Tx(address), + /// Capability-based sender - represents authorization through a CallCap + CallCap(address), +} + +// === Creation === + +/// Creates an OFTSender for a transaction-based sender. +public fun tx_sender(ctx: &TxContext): OFTSender { + OFTSender::Tx(ctx.sender()) +} + +/// Creates an OFTSender for a capability-based authorization. +public fun call_cap_sender(call_cap: &CallCap): OFTSender { + OFTSender::CallCap(call_cap.id()) +} + +// === View Functions === + +/// Extracts the address from a OFTSender variant. +public fun get_address(self: &OFTSender): address { + match (self) { + OFTSender::Tx(sender) => *sender, + OFTSender::CallCap(sender) => *sender, + } +} + +/// Checks if the sender is a transaction-based sender. +public fun is_tx_sender(self: &OFTSender): bool { + match (self) { + OFTSender::Tx(_) => true, + OFTSender::CallCap(_) => false, + } +} diff --git a/examples/oft-main/sui/oft/sources/types/send_param.move b/examples/oft-main/sui/oft/sources/types/send_param.move new file mode 100644 index 0000000000..d8d2df1d87 --- /dev/null +++ b/examples/oft-main/sui/oft/sources/types/send_param.move @@ -0,0 +1,75 @@ +module oft::send_param; + +use utils::bytes32::Bytes32; + +// === Struct === + +/// Parameters for cross-chain token transfers in the OFT protocol. +public struct SendParam has drop { + /// Destination endpoint identifier - specifies which chain to send tokens to + dst_eid: u32, + /// Recipient address on the destination chain (32-byte format for cross-chain compatibility) + to: Bytes32, + /// Amount to send denominated in local decimals (source chain's token precision) + amount_ld: u64, + /// Minimum amount that must be received on destination (prevents slippage/fee issues) + min_amount_ld: u64, + /// Additional LayerZero message options (gas limits, delivery guarantees, etc.) + extra_options: vector, + /// (Optional) Compose message payload for triggering actions on the destination chain + compose_msg: vector, + /// (Optional) The OFT command to be executed, unused in default OFT implementations. + oft_cmd: vector, +} + +// === Creation === + +/// Creates a new SendParam struct for cross-chain token transfers. +public fun create( + dst_eid: u32, + to: Bytes32, + amount_ld: u64, + min_amount_ld: u64, + extra_options: vector, + compose_msg: vector, + oft_cmd: vector, +): SendParam { + SendParam { dst_eid, to, amount_ld, min_amount_ld, extra_options, compose_msg, oft_cmd } +} + +// === Getters === + +/// Returns the destination endpoint ID +public fun dst_eid(self: &SendParam): u32 { + self.dst_eid +} + +/// Returns the recipient address on the destination chain +public fun to(self: &SendParam): Bytes32 { + self.to +} + +/// Returns the amount to send in local decimals +public fun amount_ld(self: &SendParam): u64 { + self.amount_ld +} + +/// Returns the minimum amount that must be received on destination +public fun min_amount_ld(self: &SendParam): u64 { + self.min_amount_ld +} + +/// Returns additional LayerZero message options +public fun extra_options(self: &SendParam): &vector { + &self.extra_options +} + +/// Returns the compose message payload +public fun compose_msg(self: &SendParam): &vector { + &self.compose_msg +} + +/// Returns the OFT command payload +public fun oft_cmd(self: &SendParam): &vector { + &self.oft_cmd +} diff --git a/examples/oft-main/sui/token/Move.lock b/examples/oft-main/sui/token/Move.lock new file mode 100644 index 0000000000..6fa3ef5bf2 --- /dev/null +++ b/examples/oft-main/sui/token/Move.lock @@ -0,0 +1,56 @@ +# @generated by Move, please check-in and do not edit manually. + +[move] +version = 3 +manifest_digest = "1D2E9DE8E8430F66D7F3D0B98BC012D7CA1607B5BB78CC701FE94D905AE2F51C" +deps_digest = "F9B494B64F0615AED0E98FC12A85B85ECD2BC5185C22D30E7F67786BB52E507C" +dependencies = [ + { id = "Bridge", name = "Bridge" }, + { id = "MoveStdlib", name = "MoveStdlib" }, + { id = "Sui", name = "Sui" }, + { id = "SuiSystem", name = "SuiSystem" }, +] + +[[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 = "MoveStdlib" +source = { git = "https://github.com/MystenLabs/sui.git", rev = "61dcfdbe2ddc7ad05d27fc10cd09d4c6cc151acd", subdir = "crates/sui-framework/packages/move-stdlib" } + +[[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.toolchain-version] +compiler-version = "1.59.0" +edition = "2024.beta" +flavor = "sui" + +[env] + +[env.mainnet] +chain-id = "35834a8a" +original-published-id = "0x091c4cb2f58e3490c5faa394add6b4afbf2203e3849d89ef9aa3ed442d83a043" +latest-published-id = "0x091c4cb2f58e3490c5faa394add6b4afbf2203e3849d89ef9aa3ed442d83a043" +published-version = "1" diff --git a/examples/oft-main/sui/token/Move.toml b/examples/oft-main/sui/token/Move.toml new file mode 100644 index 0000000000..fda348be57 --- /dev/null +++ b/examples/oft-main/sui/token/Move.toml @@ -0,0 +1,8 @@ +[package] +name = "MyOFTToken" +version = "0.0.1" +edition = "2024.beta" +license = "MIT" + +[addresses] +myoft = "0x0" diff --git a/examples/oft-main/sui/token/sources/myoft.move b/examples/oft-main/sui/token/sources/myoft.move new file mode 100644 index 0000000000..d319f98962 --- /dev/null +++ b/examples/oft-main/sui/token/sources/myoft.move @@ -0,0 +1,25 @@ +module myoft::myoft; + +use sui::coin; +use sui::transfer; +use sui::tx_context::TxContext; +use std::option; + +/// One-time witness for coin creation. +public struct MYOFT has drop {} + +/// Initialize the coin on package publish. +fun init(otw: MYOFT, ctx: &mut TxContext) { + let (treasury_cap, coin_metadata) = coin::create_currency( + otw, + 6, + b"MYOFT", + b"My Omnichain Fungible Token", + b"A LayerZero OFT on Sui with mint/burn capabilities", + option::none(), + ctx, + ); + + transfer::public_freeze_object(coin_metadata); + transfer::public_transfer(treasury_cap, ctx.sender()); +} diff --git a/examples/oft-main/tasks/aptos/aptosEndpointV2.ts b/examples/oft-main/tasks/aptos/aptosEndpointV2.ts new file mode 100644 index 0000000000..4ff52e84d1 --- /dev/null +++ b/examples/oft-main/tasks/aptos/aptosEndpointV2.ts @@ -0,0 +1,325 @@ +import { OmniAddress, OmniPoint, OmniTransaction } from '@layerzerolabs/devtools' +import { EndpointId } from '@layerzerolabs/lz-definitions' +import { + IEndpointV2, + MessageParams, + MessagingFee, + SetConfigParam, + Timeout, + Uln302ConfigType, + Uln302ExecutorConfig, + Uln302SetExecutorConfig, + Uln302SetUlnConfig, + Uln302UlnConfig, + UlnReadSetUlnConfig, + UlnReadUlnConfig, + UlnReadUlnUserConfig, +} from '@layerzerolabs/protocol-devtools' + +/** + * Minimal "AptosEndpointV2" skeleton that implements IEndpointV2 for Aptos. + * All methods here return placeholder or dummy values for now. + */ +export class AptosEndpointV2 implements IEndpointV2 { + // The devtools often expect the "point" property from IOmniSDK + public point: OmniPoint + + constructor(point: OmniPoint) { + this.point = point + } + + // + // ---------------------------------------------------------- + // Required by IOmniSDK (the base) or the IEndpointV2 extension + // ---------------------------------------------------------- + + // The devtools might call this to fetch a "Uln302" object. + // For now, return a dummy object that implements IUln302 + async getUln302SDK(_address: OmniAddress) { + return { + point: this.point, + // placeholders to avoid compile errors: + async getUlnConfig(_eid: EndpointId, _address: OmniAddress, _type: Uln302ConfigType) { + return {} as Uln302UlnConfig + }, + async getAppUlnConfig(_eid: EndpointId, _address: OmniAddress, _type: Uln302ConfigType) { + return {} as Uln302UlnConfig + }, + async hasAppUlnConfig( + _eid: EndpointId, + _oapp: OmniAddress, + _config: Uln302UlnConfig, + _type: Uln302ConfigType + ) { + return false + }, + async setDefaultUlnConfig(_eid: EndpointId, _config: Uln302UlnConfig) { + return { + point: this.point, + data: '0x00', + } as OmniTransaction + }, + async getExecutorConfig(_eid: EndpointId, _address: OmniAddress) { + return { + maxMessageSize: 1024, + executor: '0x0', + } as Uln302ExecutorConfig + }, + async getAppExecutorConfig(_eid: EndpointId, _address: OmniAddress): Promise { + return { + maxMessageSize: 1024, + executor: '0x0', + } as Uln302ExecutorConfig + }, + async hasAppExecutorConfig(_eid: EndpointId, _oapp: OmniAddress, _config: Uln302ExecutorConfig) { + return false + }, + async setDefaultExecutorConfig(_eid: EndpointId, _config: Uln302ExecutorConfig) { + return { + point: this.point, + data: '0x00', + } as OmniTransaction + }, + } + } + + // The devtools might call this to fetch a "UlnRead" object. + // For now, return a dummy object that implements IUlnRead + async getUlnReadSDK(_address: OmniAddress) { + return { + point: this.point, + async getUlnConfig(_channelId: number, _address: OmniAddress) { + return { + executor: '0x0', + requiredDVNs: [], + optionalDVNs: [], + optionalDVNThreshold: 0, + } as UlnReadUlnConfig + }, + async getAppUlnConfig(_channelId: number, _address: OmniAddress) { + return { + executor: '0x0', + requiredDVNs: [], + optionalDVNs: [], + optionalDVNThreshold: 0, + } as UlnReadUlnConfig + }, + async hasAppUlnConfig(_channelId: number, _oapp: OmniAddress, _config: UlnReadUlnConfig) { + return false + }, + async setDefaultUlnConfig(_channelId: number, _config: UlnReadUlnConfig) { + return { + point: this.point, + data: '0x00', + } as OmniTransaction + }, + } + } + + // + // ---------------------------------------------------------- + // Required by IEndpointV2 specifically + // ---------------------------------------------------------- + + async getDelegate(_oapp: OmniAddress): Promise { + return undefined + } + + async isDelegate(_oapp: OmniAddress, _delegate: OmniAddress): Promise { + return false + } + + async getDefaultReceiveLibrary(_eid: EndpointId): Promise { + return undefined + } + + async setDefaultReceiveLibrary(_eid: EndpointId, _uln: OmniAddress, _gracePeriod?: bigint) { + return { + point: this.point, + data: '0x00', + } as OmniTransaction + } + + async getDefaultSendLibrary(_eid: EndpointId): Promise { + return undefined + } + + async setDefaultSendLibrary(_eid: EndpointId, _uln: OmniAddress) { + return { + point: this.point, + data: '0x00', + } as OmniTransaction + } + + async isRegisteredLibrary(_uln: OmniAddress): Promise { + return false + } + + async registerLibrary(_uln: OmniAddress) { + return { + point: this.point, + data: '0x00', + } as OmniTransaction + } + + async getSendLibrary(_sender: OmniAddress, _dstEid: EndpointId): Promise { + return '0x0' + } + + async getReceiveLibrary(_receiver: OmniAddress, _srcEid: EndpointId): Promise<[OmniAddress | undefined, boolean]> { + return ['0x0', false] + } + + async getDefaultReceiveLibraryTimeout(_eid: EndpointId): Promise { + return { lib: '0x0', expiry: BigInt(0) } + } + + async getReceiveLibraryTimeout(_receiver: OmniAddress, _srcEid: EndpointId): Promise { + return { lib: '0x0', expiry: BigInt(0) } + } + + async setSendLibrary(_oapp: OmniAddress, _eid: EndpointId, _uln: OmniAddress) { + return { + point: this.point, + data: '0x00', + } as OmniTransaction + } + + async isDefaultSendLibrary(_sender: OmniAddress, _dstEid: EndpointId): Promise { + return false + } + + async setReceiveLibrary(_oapp: OmniAddress, _eid: EndpointId, _uln: OmniAddress, _gracePeriod: bigint) { + return { + point: this.point, + data: '0x00', + } as OmniTransaction + } + + async setReceiveLibraryTimeout(_oapp: OmniAddress, _eid: EndpointId, _uln: OmniAddress, _expiry: bigint) { + return { + point: this.point, + data: '0x00', + } as OmniTransaction + } + + async getExecutorConfig(_oapp: OmniAddress, _uln: OmniAddress, _eid: EndpointId) { + return { + maxMessageSize: 1024, + executor: '0x0', + } as Uln302ExecutorConfig + } + + async getAppExecutorConfig(_oapp: OmniAddress, _uln: OmniAddress, _eid: EndpointId) { + return { + maxMessageSize: 1024, + executor: '0x0', + } as Uln302ExecutorConfig + } + + async hasAppExecutorConfig(_oapp: OmniAddress, _uln: OmniAddress, _eid: EndpointId, _config: Uln302ExecutorConfig) { + return false + } + + async setExecutorConfig(_oapp: OmniAddress, _uln: OmniAddress, _setExecutorConfig: Uln302SetExecutorConfig[]) { + // Possibly return multiple OmniTransactions if the devtools call expects them + return [ + { + point: this.point, + data: '0x00', + }, + ] as OmniTransaction[] + } + + async getUlnConfig(_oapp: OmniAddress, _uln: OmniAddress, _eid: EndpointId, _type: Uln302ConfigType) { + return { + confirmations: BigInt(0), + requiredDVNs: [], + optionalDVNs: [], + optionalDVNThreshold: 0, + } as Uln302UlnConfig + } + + async getAppUlnConfig(_oapp: OmniAddress, _uln: OmniAddress, _eid: EndpointId, _type: Uln302ConfigType) { + return { + confirmations: BigInt(0), + requiredDVNs: [], + optionalDVNs: [], + optionalDVNThreshold: 0, + } as Uln302UlnConfig + } + + async getAppUlnReadConfig(_oapp: OmniAddress, _uln: OmniAddress, _channelId: number) { + return { + executor: '0x0', + requiredDVNs: [], + optionalDVNs: [], + optionalDVNThreshold: 0, + } as UlnReadUlnConfig + } + + async hasAppUlnConfig( + _oapp: OmniAddress, + _uln: OmniAddress, + _eid: EndpointId, + _config: any, + _type: Uln302ConfigType + ) { + return false + } + + async hasAppUlnReadConfig( + _oapp: OmniAddress, + _uln: OmniAddress, + _channelId: number, + _config: UlnReadUlnUserConfig + ) { + return false + } + + async setUlnConfig(_oapp: OmniAddress, _uln: OmniAddress, _setUlnConfig: Uln302SetUlnConfig[]) { + return [ + { + point: this.point, + data: '0x00', + }, + ] as OmniTransaction[] + } + + async setUlnReadConfig(_oapp: OmniAddress, _uln: OmniAddress, _setUlnConfig: UlnReadSetUlnConfig[]) { + return [ + { + point: this.point, + data: '0x00', + }, + ] as OmniTransaction[] + } + + async getUlnConfigParams(_uln: OmniAddress, _setUlnConfig: Uln302SetUlnConfig[]) { + return [] as SetConfigParam[] + } + + async getUlnReadConfigParams(_uln: OmniAddress, _setUlnConfig: UlnReadSetUlnConfig[]) { + return [] as SetConfigParam[] + } + + async getExecutorConfigParams(_uln: OmniAddress, _setExecutorConfig: Uln302SetExecutorConfig[]) { + return [] as SetConfigParam[] + } + + async setConfig(_oapp: OmniAddress, _uln: OmniAddress, _setConfigParam: SetConfigParam[]) { + return [ + { + point: this.point, + data: '0x00', + }, + ] as OmniTransaction[] + } + + async quote(_params: MessageParams, _sender: OmniAddress): Promise { + return { + nativeFee: BigInt(0), + lzTokenFee: BigInt(0), + } + } +} diff --git a/examples/oft-main/tasks/aptos/aptosSdkFactory.ts b/examples/oft-main/tasks/aptos/aptosSdkFactory.ts new file mode 100644 index 0000000000..a6b6aec3a0 --- /dev/null +++ b/examples/oft-main/tasks/aptos/aptosSdkFactory.ts @@ -0,0 +1,66 @@ +import { OmniAddress, OmniPoint, OmniTransaction } from '@layerzerolabs/devtools' +import { ChainType, EndpointId, endpointIdToChainType } from '@layerzerolabs/lz-definitions' +import { IOApp, OAppEnforcedOptionParam } from '@layerzerolabs/ua-devtools' + +import { AptosEndpointV2 } from './aptosEndpointV2' + +export function createAptosOAppFactory() { + return async function (point: OmniPoint): Promise { + const supportedChaintypes = [ChainType.APTOS, ChainType.INITIA] + if (!supportedChaintypes.includes(endpointIdToChainType(point.eid))) { + throw new Error(`Aptos SDK factory can only create SDKs for Aptos networks. Received EID ${point.eid}.`) + } + + const createStubTransaction = (description: string): OmniTransaction => ({ + point, + data: `0x`, + description: `[APTOS STUB] ${description}`, + }) + + return { + point, + async getOwner(): Promise { + return undefined + }, + async hasOwner(owner: OmniAddress): Promise { + return false + }, + async setOwner(owner: OmniAddress): Promise { + return createStubTransaction(`setOwner(${owner})`) + }, + async getEndpointSDK() { + return new AptosEndpointV2(point) + }, + async getPeer(eid: EndpointId): Promise { + return undefined + }, + async hasPeer(eid: EndpointId, peer: OmniAddress): Promise { + return false + }, + async setPeer(eid: EndpointId, peer: OmniAddress | null | undefined): Promise { + return createStubTransaction(`setPeer(${eid}, ${peer})`) + }, + async getDelegate(): Promise { + return undefined + }, + async setDelegate(address: OmniAddress): Promise { + return createStubTransaction(`setDelegate(${address})`) + }, + async isDelegate(): Promise { + return false + }, + async getEnforcedOptions(): Promise { + return {} + }, + async setEnforcedOptions(enforcedOptions: OAppEnforcedOptionParam[]): Promise { + return createStubTransaction(`setEnforcedOptions(${enforcedOptions.length} options)`) + }, + async getCallerBpsCap(): Promise { + return BigInt(0) + }, + async setCallerBpsCap(callerBpsCap: bigint): Promise { + return createStubTransaction(`setCallerBpsCap(${callerBpsCap})`) + }, + } + } +} diff --git a/examples/oft-main/tasks/aptos/aptosSignerFactory.ts b/examples/oft-main/tasks/aptos/aptosSignerFactory.ts new file mode 100644 index 0000000000..11fc45bbbf --- /dev/null +++ b/examples/oft-main/tasks/aptos/aptosSignerFactory.ts @@ -0,0 +1,54 @@ +import { + OmniPoint, + OmniSigner, + OmniTransaction, + OmniTransactionReceipt, + OmniTransactionResponse, + formatEid, +} from '@layerzerolabs/devtools' +import { ChainType, EndpointId, endpointIdToChainType } from '@layerzerolabs/lz-definitions' + +export function createAptosSignerFactory(): ( + eid: EndpointId +) => Promise>> { + return async function (eid: EndpointId): Promise>> { + if (endpointIdToChainType(eid) !== ChainType.APTOS && endpointIdToChainType(eid) !== ChainType.INITIA) { + throw new Error(`createAptosSignerFactory() called with Move VM EID: ${formatEid(eid)}`) + } + + const aptosSigner: OmniSigner> = { + // The devtools signature requires these members: + eid, + getPoint: () => { + const point: OmniPoint = { + eid, + address: '0x0', + } + return point + }, + + /** + * sign(omniTx) => Promise + * Build & sign an Aptos entry function call, returning the BCS as a hex string. + */ + sign: async (omniTx: OmniTransaction): Promise => { + return '0x0' + }, + + /** + * signAndSend(omniTx) => Promise> + * Just calls sign(...) to get the BCS hex, then submit it. + */ + signAndSend: async (omniTx: OmniTransaction) => { + return { + transactionHash: '0x0', + wait: async (_confirmations?: number) => { + return { transactionHash: '0x0' } + }, + } + }, + } + + return aptosSigner + } +} diff --git a/examples/oft-main/tasks/aptos/index.ts b/examples/oft-main/tasks/aptos/index.ts new file mode 100644 index 0000000000..80f69f7420 --- /dev/null +++ b/examples/oft-main/tasks/aptos/index.ts @@ -0,0 +1,3 @@ +export { AptosEndpointV2 } from './aptosEndpointV2' +export { createAptosOAppFactory } from './aptosSdkFactory' +export { createAptosSignerFactory } from './aptosSignerFactory' diff --git a/examples/oft-main/tasks/common/config.get.ts b/examples/oft-main/tasks/common/config.get.ts new file mode 100644 index 0000000000..ceed57783e --- /dev/null +++ b/examples/oft-main/tasks/common/config.get.ts @@ -0,0 +1,306 @@ +import { PublicKey } from '@solana/web3.js' +import { task } from 'hardhat/config' +import { ActionType } from 'hardhat/types' + +import { OmniPoint, createDefaultApplicative } from '@layerzerolabs/devtools' +import { createConnectedContractFactory, getNetworkNameForEid } from '@layerzerolabs/devtools-evm-hardhat' +import { createConnectionFactory as createStarknetConnectionFactory } from '@layerzerolabs/devtools-starknet' +import { createConnectionFactory as createSuiConnectionFactory } from '@layerzerolabs/devtools-sui' +import { createLogger, printCrossTable, setDefaultLogLevel } from '@layerzerolabs/io-devtools' +import { ChainType, EndpointId, endpointIdToChainType, getNetworkForChainId } from '@layerzerolabs/lz-definitions' +import { EndpointV2 } from '@layerzerolabs/protocol-devtools-solana' +import { EndpointV2 as EndpointV2Starknet } from '@layerzerolabs/protocol-devtools-starknet' +import { EndpointV2 as EndpointV2Sui } from '@layerzerolabs/protocol-devtools-sui' +import { OAppOmniGraph } from '@layerzerolabs/ua-devtools' +import { createOAppFactory } from '@layerzerolabs/ua-devtools-evm' +import { + OAppOmniGraphHardhatSchema, + SUBTASK_LZ_OAPP_CONFIG_LOAD, + type SubtaskLoadConfigTaskArgs, + TASK_LZ_OAPP_CONFIG_GET, +} from '@layerzerolabs/ua-devtools-evm-hardhat' +import { getReceiveConfig, getSendConfig } from '@layerzerolabs/ua-devtools-evm-hardhat' + +import { getSolanaReceiveConfig, getSolanaSendConfig, getVmReceiveConfig, getVmSendConfig } from './taskHelper' +import { createSolanaConnectionFactory } from './utils' + +interface TaskArgs { + logLevel?: string + oappConfig: string +} + +/** + * Helper function to determine if the point is Solana + * @param point {OmniPoint} + */ +const isSolana = (point: OmniPoint) => endpointIdToChainType(point.eid) === ChainType.SOLANA +const isSui = (point: OmniPoint) => endpointIdToChainType(point.eid) === ChainType.SUI +const isStarknet = (point: OmniPoint) => endpointIdToChainType(point.eid) === ChainType.STARKNET +const isMoveVM = (point: OmniPoint) => + endpointIdToChainType(point.eid) === ChainType.APTOS || endpointIdToChainType(point.eid) === ChainType.INITIA + +/** + * Helper function to get the hardhat.config.ts network name for a given endpoint id, or use the convention of + * networkName-environment for Solana. + * @param eid {EndpointId} + */ +const getNetworkName = (eid: EndpointId) => { + const { chainName, env } = getNetworkForChainId(eid) + const hardhatUnsupportedEids: EndpointId[] = [ + EndpointId.SOLANA_V2_TESTNET, + EndpointId.SOLANA_V2_MAINNET, + EndpointId.APTOS_V2_MAINNET, + EndpointId.APTOS_V2_TESTNET, + EndpointId.MOVEMENT_V2_MAINNET, + EndpointId.MOVEMENT_V2_TESTNET, + EndpointId.INITIA_V2_MAINNET, + EndpointId.INITIA_V2_TESTNET, + ] + + if (hardhatUnsupportedEids.includes(eid)) { + return `${chainName}-${env}` + } + + try { + return getNetworkNameForEid(eid as any) + } catch { + return `${chainName}-${env}` + } +} + +const action: ActionType = async ({ logLevel = 'info', oappConfig }, hre) => { + setDefaultLogLevel(logLevel) + const logger = createLogger(logLevel) + + // const hardhatGraph = await getLzConfig(oappConfig) + // const transformer = createOmniGraphHardhatTransformer() + // const graph: OAppOmniGraph = await transformer(hardhatGraph) + + const graph: OAppOmniGraph = await hre.run(SUBTASK_LZ_OAPP_CONFIG_LOAD, { + configPath: oappConfig, + schema: OAppOmniGraphHardhatSchema, + task: TASK_LZ_OAPP_CONFIG_GET, + } satisfies SubtaskLoadConfigTaskArgs) + + const evmSdkFactory = createOAppFactory(createConnectedContractFactory()) + const configs: Record> = {} + + // Iterate over the graph of connections not from Solana + const tasks = graph.connections + .filter(({ vector: { from } }) => !isSolana(from) && !isMoveVM(from) && !isSui(from) && !isStarknet(from)) + .map(({ vector: { from, to } }) => async () => { + const endpointV2Sdk = await (await evmSdkFactory(from)).getEndpointSDK() + + // OApp User Set Config + const receiveCustomConfig = await getReceiveConfig(endpointV2Sdk, to.eid, from.address, true) + const sendCustomConfig = await getSendConfig(endpointV2Sdk, to.eid, from.address, true) + const [sendCustomLibrary, sendCustomUlnConfig, sendCustomExecutorConfig] = sendCustomConfig ?? [] + const [receiveCustomLibrary, receiveCustomUlnConfig] = receiveCustomConfig ?? [] + + // Default Config + const receiveDefaultConfig = await getReceiveConfig(endpointV2Sdk, to.eid) + const sendDefaultConfig = await getSendConfig(endpointV2Sdk, to.eid) + const [sendDefaultLibrary, sendDefaultUlnConfig, sendDefaultExecutorConfig] = sendDefaultConfig ?? [] + const [receiveDefaultLibrary, receiveDefaultUlnConfig] = receiveDefaultConfig ?? [] + + // OApp Config + const receiveOAppConfig = await getReceiveConfig(endpointV2Sdk, to.eid, from.address) + const sendOAppConfig = await getSendConfig(endpointV2Sdk, to.eid, from.address) + const [sendOAppLibrary, sendOAppUlnConfig, sendOAppExecutorConfig] = sendOAppConfig ?? [] + const [receiveOAppLibrary, receiveOAppUlnConfig] = receiveOAppConfig ?? [] + + const localNetworkName = getNetworkName(from.eid) + const remoteNetworkName = getNetworkName(to.eid) + + // Update the global state + configs[localNetworkName] = { + ...configs[localNetworkName], + [remoteNetworkName]: { + defaultSendLibrary: sendOAppLibrary, + defaultReceiveLibrary: receiveOAppLibrary, + sendUlnConfig: sendOAppUlnConfig, + sendExecutorConfig: sendOAppExecutorConfig, + receiveUlnConfig: receiveOAppUlnConfig, + }, + } + + console.log( + printCrossTable( + [ + { + localNetworkName, + remoteNetworkName, + sendLibrary: sendCustomLibrary, + receiveLibrary: receiveCustomLibrary, + sendUlnConfig: sendCustomUlnConfig, + sendExecutorConfig: sendCustomExecutorConfig, + receiveUlnConfig: receiveCustomUlnConfig, + }, + { + localNetworkName, + remoteNetworkName, + sendLibrary: sendDefaultLibrary, + receiveLibrary: receiveDefaultLibrary, + sendUlnConfig: sendDefaultUlnConfig, + sendExecutorConfig: sendDefaultExecutorConfig, + receiveUlnConfig: receiveDefaultUlnConfig, + }, + { + localNetworkName, + remoteNetworkName, + sendLibrary: sendOAppLibrary, + receiveLibrary: receiveOAppLibrary, + sendUlnConfig: sendOAppUlnConfig, + sendExecutorConfig: sendOAppExecutorConfig, + receiveUlnConfig: receiveOAppUlnConfig, + }, + ], + ['', 'Custom OApp Config', 'Default OApp Config', 'Active OApp Config'] + ) + ) + }) + // Iterate over the graph of connections from Solana + const solTasks = graph.connections + .filter(({ vector: { from } }) => isSolana(from)) + .map(({ vector: { from, to } }) => async () => { + const endpointV2Sdk = new EndpointV2( + await createSolanaConnectionFactory()(from.eid), + from, + new PublicKey(from.address) // doesn't matter as we are not sending transactions + ) + // OApp Config + const receiveOAppConfig = await getSolanaReceiveConfig(endpointV2Sdk, to.eid, from.address) + const sendOAppConfig = await getSolanaSendConfig(endpointV2Sdk, to.eid, from.address) + const [sendOAppLibrary, sendOAppUlnConfig, sendOAppExecutorConfig] = sendOAppConfig ?? [] + const [receiveOAppLibrary, receiveOAppUlnConfig] = receiveOAppConfig ?? [] + + const localNetworkName = getNetworkName(from.eid) + const remoteNetworkName = getNetworkName(to.eid) + + // Update the global state + configs[localNetworkName] = { + ...configs[localNetworkName], + [remoteNetworkName]: { + defaultSendLibrary: sendOAppLibrary, + defaultReceiveLibrary: receiveOAppLibrary, + sendUlnConfig: sendOAppUlnConfig, + sendExecutorConfig: sendOAppExecutorConfig, + receiveUlnConfig: receiveOAppUlnConfig, + }, + } + // Defaults are treated much differently in Solana, so we only output the active OApp config. + console.log( + printCrossTable( + [ + { + localNetworkName, + remoteNetworkName, + sendLibrary: sendOAppLibrary, + receiveLibrary: receiveOAppLibrary, + sendUlnConfig: sendOAppUlnConfig, + sendExecutorConfig: sendOAppExecutorConfig, + receiveUlnConfig: receiveOAppUlnConfig, + }, + ], + ['', 'Active OApp Config'] + ) + ) + }) + + const suiTasks = graph.connections + .filter(({ vector: { from } }) => isSui(from)) + .map(({ vector: { from, to } }) => async () => { + const endpointV2Sdk = new EndpointV2Sui(await createSuiConnectionFactory()(from.eid), from) + const receiveOAppConfig = await getVmReceiveConfig(endpointV2Sdk, to.eid, from.address) + const sendOAppConfig = await getVmSendConfig(endpointV2Sdk, to.eid, from.address) + const [sendOAppLibrary, sendOAppUlnConfig, sendOAppExecutorConfig] = sendOAppConfig ?? [] + const [receiveOAppLibrary, receiveOAppUlnConfig] = receiveOAppConfig ?? [] + + const localNetworkName = getNetworkName(from.eid) + const remoteNetworkName = getNetworkName(to.eid) + + configs[localNetworkName] = { + ...configs[localNetworkName], + [remoteNetworkName]: { + defaultSendLibrary: sendOAppLibrary, + defaultReceiveLibrary: receiveOAppLibrary, + sendUlnConfig: sendOAppUlnConfig, + sendExecutorConfig: sendOAppExecutorConfig, + receiveUlnConfig: receiveOAppUlnConfig, + }, + } + + console.log( + printCrossTable( + [ + { + localNetworkName, + remoteNetworkName, + sendLibrary: sendOAppLibrary, + receiveLibrary: receiveOAppLibrary, + sendUlnConfig: sendOAppUlnConfig, + sendExecutorConfig: sendOAppExecutorConfig, + receiveUlnConfig: receiveOAppUlnConfig, + }, + ], + ['', 'Active OApp Config'] + ) + ) + }) + + const starknetTasks = graph.connections + .filter(({ vector: { from } }) => isStarknet(from)) + .map(({ vector: { from, to } }) => async () => { + const endpointV2Sdk = new EndpointV2Starknet(await createStarknetConnectionFactory()(from.eid), from) + const receiveOAppConfig = await getVmReceiveConfig(endpointV2Sdk, to.eid, from.address) + const sendOAppConfig = await getVmSendConfig(endpointV2Sdk, to.eid, from.address) + const [sendOAppLibrary, sendOAppUlnConfig, sendOAppExecutorConfig] = sendOAppConfig ?? [] + const [receiveOAppLibrary, receiveOAppUlnConfig] = receiveOAppConfig ?? [] + + const localNetworkName = getNetworkName(from.eid) + const remoteNetworkName = getNetworkName(to.eid) + + configs[localNetworkName] = { + ...configs[localNetworkName], + [remoteNetworkName]: { + defaultSendLibrary: sendOAppLibrary, + defaultReceiveLibrary: receiveOAppLibrary, + sendUlnConfig: sendOAppUlnConfig, + sendExecutorConfig: sendOAppExecutorConfig, + receiveUlnConfig: receiveOAppUlnConfig, + }, + } + + console.log( + printCrossTable( + [ + { + localNetworkName, + remoteNetworkName, + sendLibrary: sendOAppLibrary, + receiveLibrary: receiveOAppLibrary, + sendUlnConfig: sendOAppUlnConfig, + sendExecutorConfig: sendOAppExecutorConfig, + receiveUlnConfig: receiveOAppUlnConfig, + }, + ], + ['', 'Active OApp Config'] + ) + ) + }) + + // We allow this script to be executed either in parallel or in series + const applicative = createDefaultApplicative(logger) + await applicative(tasks) + await applicative(solTasks) + await applicative(suiTasks) + await applicative(starknetTasks) + + return configs +} + +task( + TASK_LZ_OAPP_CONFIG_GET, + 'Outputs Custom OApp Config, Default OApp Config, and Active OApp Config. Each config contains Send & Receive Libraries, Send Uln & Executor Configs, and Receive Executor Configs', + action +) diff --git a/examples/oft-main/tasks/common/sendOFT.ts b/examples/oft-main/tasks/common/sendOFT.ts new file mode 100644 index 0000000000..b3f4ff83f3 --- /dev/null +++ b/examples/oft-main/tasks/common/sendOFT.ts @@ -0,0 +1,148 @@ +import { task, types } from 'hardhat/config' +import { HardhatRuntimeEnvironment } from 'hardhat/types' + +import { ChainType, endpointIdToChainType, endpointIdToNetwork } from '@layerzerolabs/lz-definitions' + +import { EvmArgs, sendEvm } from '../evm/sendEvm' +import { SolanaArgs, sendSolana } from '../solana/sendSolana' + +import { SendResult } from './types' +import { DebugLogger, KnownOutputs, KnownWarnings, getBlockExplorerLink } from './utils' + +import type { StarknetArgs } from '../starknet/sendStarknet' +import type { SuiArgs } from '../sui/sendSui' + +interface MasterArgs { + srcEid: number + dstEid: number + amount: string + to: string + /** Minimum amount to receive in case of custom slippage or fees (human readable units, e.g. "1.5") */ + minAmount?: string + /** Extra options for sending additional gas units to lzReceive, lzCompose, or receiver address */ + extraOptions?: string + /** Arbitrary bytes message to deliver alongside the OFT */ + composeMsg?: string + /** EVM/Starknet: hex address; Solana: base58 PDA of the store */ + oftAddress?: string + /** Solana only: override the OFT program ID (base58) */ + oftProgramId?: string + /** Sui only: OFT package ID */ + suiOftPackageId?: string + /** Sui only: OFT object ID */ + suiOftObjectId?: string + /** Sui only: OApp object ID */ + suiOappObjectId?: string + /** Sui only: coin type string */ + suiTokenType?: string + /** Starknet only: token decimals for amount parsing */ + starknetTokenDecimals?: number + tokenProgram?: string + computeUnitPriceScaleFactor?: number + addressLookupTables?: string +} + +task('lz:oft:send', 'Sends OFT tokens cross‐chain from any supported chain') + .addParam('srcEid', 'Source endpoint ID', undefined, types.int) + .addParam('dstEid', 'Destination endpoint ID', undefined, types.int) + .addParam('amount', 'Amount to send (human readable units, e.g. "1.5")', undefined, types.string) + .addParam('to', 'Base58 recipient (Solana) or bytes32-encoded target (EVM/Sui/Starknet)', undefined, types.string) + .addOptionalParam( + 'minAmount', + 'Minimum amount to receive in case of custom slippage or fees (human readable units, e.g. "1.5")', + undefined, + types.string + ) + .addOptionalParam( + 'extraOptions', + 'Extra options for sending additional gas units to lzReceive, lzCompose, or receiver address', + undefined, + types.string + ) + .addOptionalParam('composeMsg', 'Arbitrary bytes message to deliver alongside the OFT', undefined, types.string) + .addOptionalParam( + 'oftAddress', + 'Override the source local deployment OFT address (20-byte hex for EVM, base58 PDA for Solana)', + undefined, + types.string + ) + .addOptionalParam('oftProgramId', 'Solana only: override the OFT program ID (base58)', undefined, types.string) + .addOptionalParam('suiOftPackageId', 'Sui only: OFT package ID', undefined, types.string) + .addOptionalParam('suiOftObjectId', 'Sui only: OFT object ID', undefined, types.string) + .addOptionalParam('suiOappObjectId', 'Sui only: OApp object ID', undefined, types.string) + .addOptionalParam('suiTokenType', 'Sui only: coin type string (0x...::module::COIN)', undefined, types.string) + .addOptionalParam('starknetTokenDecimals', 'Starknet only: token decimals for amount parsing', 18, types.int) + .addOptionalParam('tokenProgram', 'Solana Token Program pubkey', undefined, types.string) + .addOptionalParam('computeUnitPriceScaleFactor', 'Solana compute unit price scale factor', 4, types.float) + .addOptionalParam( + 'addressLookupTables', + 'Solana address lookup tables (comma separated base58 list)', + undefined, + types.string + ) + .setAction(async (args: MasterArgs, hre: HardhatRuntimeEnvironment) => { + const chainType = endpointIdToChainType(args.srcEid) + let result: SendResult + + if (args.oftAddress || args.oftProgramId) { + DebugLogger.printWarning( + KnownWarnings.USING_OVERRIDE_OFT, + `For network: ${endpointIdToNetwork(args.srcEid)}, OFT: ${args.oftAddress + (args.oftProgramId ? `, OFT program: ${args.oftProgramId}` : '')}` + ) + } + + // route to the correct function based on the chain type + if (chainType === ChainType.EVM) { + result = await sendEvm(args as EvmArgs, hre) + } else if (chainType === ChainType.SOLANA) { + result = await sendSolana({ + ...args, + addressLookupTables: args.addressLookupTables ? args.addressLookupTables.split(',') : [], + } as SolanaArgs) + } else if (chainType === ChainType.SUI) { + if (!args.suiOftPackageId || !args.suiOftObjectId || !args.suiOappObjectId || !args.suiTokenType) { + throw new Error('Sui send requires suiOftPackageId, suiOftObjectId, suiOappObjectId, and suiTokenType') + } + // eslint-disable-next-line @typescript-eslint/no-var-requires + const { sendSui } = require('../sui/sendSui') + result = await sendSui({ + ...(args as SuiArgs), + oftPackageId: args.suiOftPackageId, + oftObjectId: args.suiOftObjectId, + oappObjectId: args.suiOappObjectId, + tokenType: args.suiTokenType, + }) + } else if (chainType === ChainType.STARKNET) { + if (!args.oftAddress) { + throw new Error('Starknet send requires oftAddress') + } + // eslint-disable-next-line @typescript-eslint/no-var-requires + const { sendStarknet } = require('../starknet/sendStarknet') + result = await sendStarknet({ + ...(args as StarknetArgs), + oftAddress: args.oftAddress, + tokenDecimals: args.starknetTokenDecimals, + }) + } else { + throw new Error(`The chain type ${chainType} is not implemented in sendOFT for this example`) + } + + DebugLogger.printLayerZeroOutput( + KnownOutputs.SENT_VIA_OFT, + `Successfully sent ${args.amount} tokens from ${endpointIdToNetwork(args.srcEid)} to ${endpointIdToNetwork(args.dstEid)}` + ) + // print the explorer link for the srcEid from metadata + const explorerLink = await getBlockExplorerLink(args.srcEid, result.txHash) + // if explorer link is available, print the tx hash link + if (explorerLink) { + DebugLogger.printLayerZeroOutput( + KnownOutputs.TX_HASH, + `Explorer link for source chain ${endpointIdToNetwork(args.srcEid)}: ${explorerLink}` + ) + } + // print the LayerZero Scan link from metadata + DebugLogger.printLayerZeroOutput( + KnownOutputs.EXPLORER_LINK, + `LayerZero Scan link for tracking all cross-chain transaction details: ${result.scanLink}` + ) + }) diff --git a/examples/oft-main/tasks/common/taskHelper.ts b/examples/oft-main/tasks/common/taskHelper.ts new file mode 100644 index 0000000000..247278df0b --- /dev/null +++ b/examples/oft-main/tasks/common/taskHelper.ts @@ -0,0 +1,115 @@ +import { OmniAddress } from '@layerzerolabs/devtools' +import { EndpointId } from '@layerzerolabs/lz-definitions' +import { UlnProgram } from '@layerzerolabs/lz-solana-sdk-v2' +import { + IEndpointV2, + Timeout, + Uln302ConfigType, + Uln302ExecutorConfig, + Uln302UlnConfig, +} from '@layerzerolabs/protocol-devtools' + +/** + * Get the receive config for a Solana OApp + * @param endpointV2Sdk {IEndpointV2} SDK for the endpoint + * @param remoteEid {EndpointId} remote eid + * @param address {OmniAddress} address of the OApp + */ +export async function getSolanaReceiveConfig( + endpointV2Sdk: IEndpointV2, + remoteEid: EndpointId, + address: OmniAddress +): Promise<[OmniAddress, Uln302UlnConfig, Timeout] | undefined> { + let receiveLibraryAddress = UlnProgram.PROGRAM_ADDRESS + try { + const [receiveLibrary] = await endpointV2Sdk.getReceiveLibrary(address, remoteEid) + if (receiveLibrary) { + receiveLibraryAddress = receiveLibrary + } + } catch { + // no action is necessary as upon error, we will just use the default UlnProgram.PROGRAM_ADDRESS + } + return [ + receiveLibraryAddress, + await endpointV2Sdk.getAppUlnConfig( + address, + UlnProgram.PROGRAM_ID.toBase58(), + remoteEid, + Uln302ConfigType.Receive + ), + { + lib: UlnProgram.PROGRAM_ID.toBase58(), + expiry: 0n, // unsupported for Solana + }, + ] +} + +/** + * Get the send config for a Solana OApp. + * @param endpointV2Sdk {IEndpointV2} SDK for the endpoint + * @param eid {EndpointId} remote eid + * @param address {OmniAddress} address of the OApp + */ +export async function getSolanaSendConfig( + endpointV2Sdk: IEndpointV2, + eid: EndpointId, + address: OmniAddress +): Promise<[OmniAddress, Uln302UlnConfig, Uln302ExecutorConfig] | undefined> { + let sendLibraryAddress = UlnProgram.PROGRAM_ADDRESS + try { + const sendLibrary = await endpointV2Sdk.getSendLibrary(address, eid) + if (sendLibrary) { + sendLibraryAddress = sendLibrary + } + } catch { + // no action is necessary as upon error, we will just use the default UlnProgram.PROGRAM_ADDRESS + } + return [ + sendLibraryAddress, + await endpointV2Sdk.getAppUlnConfig(address, UlnProgram.PROGRAM_ID.toBase58(), eid, Uln302ConfigType.Send), + await endpointV2Sdk.getAppExecutorConfig(address, sendLibraryAddress, eid), + ] +} + +/** + * Get the send config for Sui/Starknet OApps. + * Uses the configured send library as the ULN address for the config reads. + */ +export async function getVmSendConfig( + endpointV2Sdk: IEndpointV2, + eid: EndpointId, + address: OmniAddress +): Promise<[OmniAddress, Uln302UlnConfig, Uln302ExecutorConfig] | undefined> { + const sendLibrary = await endpointV2Sdk.getSendLibrary(address, eid) + if (!sendLibrary) { + return undefined + } + return [ + sendLibrary, + await endpointV2Sdk.getAppUlnConfig(address, sendLibrary, eid, Uln302ConfigType.Send), + await endpointV2Sdk.getAppExecutorConfig(address, sendLibrary, eid), + ] +} + +/** + * Get the receive config for Sui/Starknet OApps. + * Uses the configured receive library as the ULN address for the config reads. + */ +export async function getVmReceiveConfig( + endpointV2Sdk: IEndpointV2, + remoteEid: EndpointId, + address: OmniAddress +): Promise<[OmniAddress, Uln302UlnConfig, Timeout] | undefined> { + const [receiveLibrary] = await endpointV2Sdk.getReceiveLibrary(address, remoteEid) + if (!receiveLibrary) { + return undefined + } + return [ + receiveLibrary, + await endpointV2Sdk.getAppUlnConfig(address, receiveLibrary, remoteEid, Uln302ConfigType.Receive), + { + lib: receiveLibrary, + expiry: 0n, + }, + ] +} diff --git a/examples/oft-main/tasks/common/types.ts b/examples/oft-main/tasks/common/types.ts new file mode 100644 index 0000000000..2c4bf0d940 --- /dev/null +++ b/examples/oft-main/tasks/common/types.ts @@ -0,0 +1,24 @@ +import { decode } from '@coral-xyz/anchor/dist/cjs/utils/bytes/bs58' +import { Keypair, PublicKey } from '@solana/web3.js' +import { CLIArgumentType } from 'hardhat/types' + +export const keyPair: CLIArgumentType = { + name: 'keyPair', + parse(name: string, value: string) { + return Keypair.fromSecretKey(decode(value)) + }, + validate() {}, +} + +export const publicKey: CLIArgumentType = { + name: 'keyPair', + parse(name: string, value: string) { + return new PublicKey(value) + }, + validate() {}, +} + +export interface SendResult { + txHash: string // EVM: receipt.transactionHash, Solana: base58 sig + scanLink: string // LayerZeroScan link for cross-chain tracking +} diff --git a/examples/oft-main/tasks/common/utils.ts b/examples/oft-main/tasks/common/utils.ts new file mode 100644 index 0000000000..971e7489e7 --- /dev/null +++ b/examples/oft-main/tasks/common/utils.ts @@ -0,0 +1,224 @@ +import { safeFetchMetadataFromSeeds } from '@metaplex-foundation/mpl-token-metadata' +import { fromWeb3JsPublicKey, toWeb3JsPublicKey } from '@metaplex-foundation/umi-web3js-adapters' +import { TOKEN_2022_PROGRAM_ID, getTokenMetadata } from '@solana/spl-token' +import { Connection, PublicKey } from '@solana/web3.js' + +import { OmniPoint } from '@layerzerolabs/devtools' +import { createConnectedContractFactory } from '@layerzerolabs/devtools-evm-hardhat' +import { createSolanaConnectionFactory, createSolanaSignerFactory } from '@layerzerolabs/devtools-solana' +import { + createConnectionFactory as createStarknetConnectionFactory, + createRpcUrlFactory as createStarknetRpcUrlFactory, +} from '@layerzerolabs/devtools-starknet' +import { + createConnectionFactory as createSuiConnectionFactory, + createRpcUrlFactory as createSuiRpcUrlFactory, +} from '@layerzerolabs/devtools-sui' +import { createLogger } from '@layerzerolabs/io-devtools' +import { ChainType, EndpointId, endpointIdToChainType, endpointIdToNetwork } from '@layerzerolabs/lz-definitions' +import { UlnProgram } from '@layerzerolabs/lz-solana-sdk-v2' +import { toWeb3Connection } from '@layerzerolabs/lz-solana-sdk-v2/umi' +import { Options } from '@layerzerolabs/lz-v2-utilities' +import { IOApp } from '@layerzerolabs/ua-devtools' +import { createOAppFactory } from '@layerzerolabs/ua-devtools-evm' +import { createOFTFactory } from '@layerzerolabs/ua-devtools-solana' +import { createOFTFactory as createStarknetOFTFactory } from '@layerzerolabs/ua-devtools-starknet' +import { createOFTFactory as createSuiOFTFactory } from '@layerzerolabs/ua-devtools-sui' + +import { createAptosOAppFactory } from '../aptos' + +import type { Umi, PublicKey as UmiPublicKey } from '@metaplex-foundation/umi' + +export { createSolanaConnectionFactory } + +const logger = createLogger() + +type DeploymentMetadata = { + blockExplorers?: Array<{ url?: string }> + [key: string]: unknown +} + +export const deploymentMetadataUrl = 'https://metadata.layerzero-api.com/v1/metadata/deployments' + +export enum MSG_TYPE { + SEND = 1, + SEND_AND_CALL = 2, +} + +/** + * Given a srcEid and on-chain tx hash, return + * `https://…blockExplorers[0].url/tx/`, or undefined. + */ + +export async function getBlockExplorerLink(srcEid: number, txHash: string): Promise { + const network = endpointIdToNetwork(srcEid) // e.g. "animechain-mainnet" + const res = await fetch(deploymentMetadataUrl) + if (!res.ok) return + const all = (await res.json()) as Record + const meta = all[network] + const explorer = meta?.blockExplorers?.[0]?.url + if (explorer) { + // many explorers use `/tx/` + return `${explorer.replace(/\/+$/, '')}/tx/${txHash}` + } + return +} + +export const createSdkFactory = ( + userAccount?: PublicKey, + programId?: PublicKey, + connectionFactory = createSolanaConnectionFactory() +) => { + // To create a EVM/Solana SDK factory we need to merge the EVM and the Solana factories into one + const evmSdkFactory = createOAppFactory(createConnectedContractFactory()) + const aptosSdkFactory = createAptosOAppFactory() + const suiSdkFactory = createSuiOFTFactory(createSuiConnectionFactory(createSuiRpcUrlFactory())) + const starknetSdkFactory = createStarknetOFTFactory(createStarknetConnectionFactory(createStarknetRpcUrlFactory())) + const solanaSdkFactory = + userAccount && programId + ? createOFTFactory( + // The first parameter to createOFTFactory is a user account factory + // + // This is a function that receives an OmniPoint ({ eid, address } object) + // and returns a user account to be used with that SDK. + // + // For our purposes this will always be the user account coming from the secret key passed in + () => userAccount, + // The second parameter is a program ID factory + // + // This is a function that receives an OmniPoint ({ eid, address } object) + // and returns a program ID to be used with that SDK. + // + // Since we only have one OFT deployed, this will always be the program ID passed as a CLI parameter. + // + // In situations where we might have multiple configs with OFTs using multiple program IDs, + // this function needs to decide which one to use. + () => programId, + // Last but not least the SDK will require a connection + connectionFactory + ) + : undefined + + // the return value is an SDK factory that receives an OmniPoint and returns an SDK + return async (point: OmniPoint): Promise => { + if (endpointIdToChainType(point.eid) === ChainType.SOLANA) { + if (!solanaSdkFactory) { + throw new Error('Solana SDK factory is not configured.') + } + return solanaSdkFactory(point) + } else if (endpointIdToChainType(point.eid) === ChainType.EVM) { + return evmSdkFactory(point) + } else if (endpointIdToChainType(point.eid) === ChainType.SUI) { + return suiSdkFactory(point) + } else if (endpointIdToChainType(point.eid) === ChainType.STARKNET) { + return starknetSdkFactory(point) + } else if ( + endpointIdToChainType(point.eid) === ChainType.APTOS || + endpointIdToChainType(point.eid) === ChainType.INITIA + ) { + return aptosSdkFactory(point) + } else { + logger.error(`Unsupported chain type for EID ${point.eid}`) + throw new Error(`Unsupported chain type for EID ${point.eid}`) + } + } +} + +export { createSolanaSignerFactory } + +export function uint8ArrayToHex(uint8Array: Uint8Array, prefix = false): string { + const hexString = Buffer.from(uint8Array).toString('hex') + return prefix ? `0x${hexString}` : hexString +} + +function formatBigIntForDisplay(n: bigint) { + return n.toLocaleString().replace(/,/g, '_') +} + +export function isEmptyOptionsEvm(optionsHex?: string): boolean { + return !optionsHex || optionsHex === '0x' || optionsHex === '0x0003' // 0x0003 is an empty options type 3 +} + +export function isEmptyOptionsSolana(optionsBytes?: Uint8Array): boolean { + if (!optionsBytes) { + return true // Treat undefined or null as empty options + } + return Buffer.from(optionsBytes).toString('hex') === '0003' // empty options type 3 without 0x prefix +} + +export function decodeLzReceiveOptions(hex: string): string { + try { + // Handle empty/undefined values first + if (!hex || hex === '0x') return 'No options set' + const options = Options.fromOptions(hex) + const lzReceiveOpt = options.decodeExecutorLzReceiveOption() + return lzReceiveOpt + ? `gas: ${formatBigIntForDisplay(lzReceiveOpt.gas)} , value: ${formatBigIntForDisplay(lzReceiveOpt.value)} wei` + : 'No executor options' + } catch (e) { + return `Invalid options (${hex.slice(0, 12)}...)` + } +} + +export async function getSolanaUlnConfigPDAs( + remote: EndpointId, + connection: Connection, + ulnAddress: PublicKey, + oftStore: PublicKey +) { + const uln = new UlnProgram.Uln(new PublicKey(ulnAddress)) + const sendConfig = uln.getSendConfigState(connection, new PublicKey(oftStore), remote) + + const receiveConfig = uln.getReceiveConfigState(connection, new PublicKey(oftStore), remote) + + return await Promise.all([sendConfig, receiveConfig]) +} + +export enum SolanaTokenProgramType { + SPL = 'SPL', + Token2022 = 'Token2022', +} + +type TokenMetadata = { + updateAuthority?: UmiPublicKey + isMutable?: boolean + name?: string + symbol?: string +} + +export async function getSolanaTokenMetadata( + umi: Umi, + mint: UmiPublicKey, + tokenProgramType: SolanaTokenProgramType +): Promise { + let response + switch (tokenProgramType) { + case SolanaTokenProgramType.SPL: + response = await safeFetchMetadataFromSeeds(umi, { mint }) + return { + updateAuthority: response?.updateAuthority, + isMutable: response?.isMutable, + name: response?.name, + symbol: response?.symbol, + } + case SolanaTokenProgramType.Token2022: + response = await getTokenMetadata( + toWeb3Connection(umi.rpc), + toWeb3JsPublicKey(mint), + 'confirmed', + TOKEN_2022_PROGRAM_ID + ) + return { + updateAuthority: response?.updateAuthority ? fromWeb3JsPublicKey(response?.updateAuthority) : undefined, + // If the update authority is renounced via setting the update authority to the System Program address + // note: https://docs.rs/spl-token-metadata-interface/0.8.0/spl_token_metadata_interface/state/struct.TokenMetadata.html + isMutable: response?.updateAuthority != PublicKey.default, + name: response?.name, + symbol: response?.symbol, + } + default: + throw new Error(`Unsupported token program type: ${tokenProgramType}`) + } +} + +export { createLogger, DebugLogger, KnownErrors, KnownOutputs, KnownWarnings } from '@layerzerolabs/io-devtools' diff --git a/examples/oft-main/tasks/common/wire.ts b/examples/oft-main/tasks/common/wire.ts new file mode 100644 index 0000000000..108e96d546 --- /dev/null +++ b/examples/oft-main/tasks/common/wire.ts @@ -0,0 +1,269 @@ +import { PublicKey } from '@solana/web3.js' +import { subtask, task } from 'hardhat/config' + +import { firstFactory } from '@layerzerolabs/devtools' +import { SUBTASK_LZ_SIGN_AND_SEND, types as devtoolsTypes } from '@layerzerolabs/devtools-evm-hardhat' +import { setTransactionSizeBuffer } from '@layerzerolabs/devtools-solana' +import { + createConnectionFactory as createStarknetConnectionFactory, + createRpcUrlFactory as createStarknetRpcUrlFactory, + createStarknetSignerFactory, +} from '@layerzerolabs/devtools-starknet' +import { + createConnectionFactory as createSuiConnectionFactory, + createRpcUrlFactory as createSuiRpcUrlFactory, + createSuiSignerFactory, +} from '@layerzerolabs/devtools-sui' +import { type LogLevel, createLogger } from '@layerzerolabs/io-devtools' +import { DebugLogger, KnownErrors } from '@layerzerolabs/io-devtools' +import { ChainType, endpointIdToChainType } from '@layerzerolabs/lz-definitions' +import { type IOApp, type OAppConfigurator, type OAppOmniGraph, configureOwnable } from '@layerzerolabs/ua-devtools' +import { + SUBTASK_LZ_OAPP_WIRE_CONFIGURE, + type SubtaskConfigureTaskArgs, + TASK_LZ_OAPP_WIRE, + TASK_LZ_OWNABLE_TRANSFER_OWNERSHIP, +} from '@layerzerolabs/ua-devtools-evm-hardhat' + +import { createAptosSignerFactory } from '../aptos' +import { getSolanaDeployment, useWeb3Js } from '../solana' +import { findSolanaEndpointIdInGraph } from '../solana/utils' +import { getStarknetAccountFromEnv } from '../starknet/utils' +import { getSuiKeypairFromEnv } from '../sui/utils' + +import { publicKey as publicKeyType } from './types' +import { + createSdkFactory, + createSolanaConnectionFactory, + createSolanaSignerFactory, + getSolanaUlnConfigPDAs, +} from './utils' + +import type { SignAndSendTaskArgs } from '@layerzerolabs/devtools-evm-hardhat/tasks' + +/** + * Additional CLI arguments for our custom wire task + */ +interface Args { + logLevel: LogLevel + multisigKey?: PublicKey + isSolanaInitConfig: boolean // For internal use only. This helps us to control which code runs depdending on whether the task ran is wire or init-config + oappConfig: string + internalConfigurator?: OAppConfigurator + dryRun?: boolean +} + +/** + * We extend the default wiring task to add functionality required by Solana + */ +task(TASK_LZ_OAPP_WIRE) + .addParam('multisigKey', 'The MultiSig key', undefined, publicKeyType, true) + // We use this argument to get around the fact that we want to both override the task action for the wiring task + // and wrap this task with custom configurators + // + // By default, this argument will be left empty and the default OApp configurator will be used. + // The tasks that are using custom configurators will override this argument with the configurator of their choice + .addParam('internalConfigurator', 'FOR INTERNAL USE ONLY', undefined, devtoolsTypes.fn, true) + .addParam('isSolanaInitConfig', 'FOR INTERNAL USE ONLY', undefined, devtoolsTypes.boolean, true) + .setAction(async (args: Args, hre, runSuper) => { + const logger = createLogger(args.logLevel) + + // + // + // ENVIRONMENT SETUP + // + // + + // The Solana transaction size estimation algorithm is not very accurate, so we increase its tolerance by 192 bytes + setTransactionSizeBuffer(192) + + // + // + // USER INPUT + // + // + + const solanaEid = await findSolanaEndpointIdInGraph(hre, args.oappConfig) + const solanaEnabled = solanaEid != null + const keypair = solanaEnabled ? (await useWeb3Js()).web3JsKeypair : undefined + const userAccount = solanaEnabled ? keypair?.publicKey : undefined + const solanaDeployment = solanaEnabled ? getSolanaDeployment(solanaEid) : undefined + const programId = solanaEnabled ? new PublicKey(solanaDeployment?.programId ?? '') : undefined + + if (solanaEnabled && !programId) { + logger.error('Missing programId in solana deployment') + return + } + const configurator = args.internalConfigurator + + // + // + // TOOLING SETUP + // + // + + // We'll need a connection factory to be able to query the Solana network + // + // If you haven't set RPC_URL_SOLANA and/or RPC_URL_SOLANA_TESTNET environment variables, + // the factory will use the default public RPC URLs + const connectionFactory = createSolanaConnectionFactory() + + // We'll need SDKs to be able to use devtools + const sdkFactory = createSdkFactory(userAccount, programId, connectionFactory) + + // We'll also need a signer factory + const solanaSignerFactory = + solanaEnabled && keypair ? createSolanaSignerFactory(keypair, connectionFactory, args.multisigKey) : null + const aptosSignerFactory = createAptosSignerFactory() + const suiConnectionFactory = createSuiConnectionFactory(createSuiRpcUrlFactory()) + const starknetProviderFactory = createStarknetConnectionFactory(createStarknetRpcUrlFactory()) + const starknetSignerFactory = createStarknetSignerFactory( + async (eid) => getStarknetAccountFromEnv(eid), + starknetProviderFactory + ) + + // + // + // SUBTASK OVERRIDES + // + // + + // We'll need to override the default implementation of the configure subtask + // (responsible for collecting the on-chain configuration of the contracts + // and coming up with the transactions that need to be sent to the network) + // + // The only thing we are overriding is the sdkFactory parameter - we supply the SDK factory we created above + subtask( + SUBTASK_LZ_OAPP_WIRE_CONFIGURE, + 'Configure OFT', + async (subtaskArgs: SubtaskConfigureTaskArgs, _hre, runSuper) => { + // start of pre-wiring checks. we only do this when the current task is wire. if the current task is init-config, we shouldn't run this. + if (!args.isSolanaInitConfig && !args.dryRun) { + logger.verbose('Running pre-wiring checks...') + const { graph } = subtaskArgs + for (const connection of graph.connections) { + // check if from Solana Endpoint + if (endpointIdToChainType(connection.vector.from.eid) === ChainType.SOLANA) { + if (connection.config?.sendLibrary) { + // Check if this is BlockedMessageLib - if so, skip the config checks + const BLOCKED_MESSAGE_LIB_SOLANA_MAINNET = + '2XrYqmhBMPJgDsb4SVbjV1PnJBprurd5bzRCkHwiFCJB' + const BLOCKED_MESSAGE_LIB_SOLANA_TESTNET = + '2XrYqmhBMPJgDsb4SVbjV1PnJBprurd5bzRCkHwiFCJB' + const sendLibraryAddress = connection.config.sendLibrary + + // Check if this is a BlockedMessageLib address for either mainnet or testnet + if ( + sendLibraryAddress === BLOCKED_MESSAGE_LIB_SOLANA_MAINNET || + sendLibraryAddress === BLOCKED_MESSAGE_LIB_SOLANA_TESTNET + ) { + logger.verbose( + `Skipping ULN config checks for BlockedMessageLib on ${connection.vector.from.eid}` + ) + continue + } + + logger.verbose(`Send library found. Checking if ULN configs have been initialized...`) + + try { + // Use the SDK to check if configs exist + const [sendConfig, receiveConfig] = await getSolanaUlnConfigPDAs( + connection.vector.to.eid, + await connectionFactory(connection.vector.from.eid), + new PublicKey(connection.config.sendLibrary), + new PublicKey(connection.vector.from.address) + ) + + logger.verbose( + `ULN configs checked successfully for ${connection.vector.from.eid} -> ${connection.vector.to.eid}` + ) + } catch (error) { + logger.verbose(`Error checking ULN configs: ${error}`) + DebugLogger.printErrorAndFixSuggestion( + KnownErrors.ULN_INIT_CONFIG_SKIPPED, + `ULN configs on ${connection.vector.from.eid} not initialized for remote ${connection.vector.to.eid}.` + ) + throw new Error('ULN configs not initialized. Please run init-config task first.') + } + } else { + logger.debug( + `No sendLibrary found in connection config for ${connection.vector.from.eid} -> ${connection.vector.to.eid}` + ) + } + } + } + // end of pre-wiring checks + } + + return runSuper({ + ...subtaskArgs, + configurator: configurator ?? subtaskArgs.configurator, + sdkFactory, + graph: { + ...subtaskArgs.graph, + contracts: subtaskArgs.graph.contracts.filter((contract) => { + const chainType = endpointIdToChainType(contract.point.eid) + return chainType !== ChainType.APTOS && chainType !== ChainType.INITIA + }), + connections: subtaskArgs.graph.connections.filter((connection) => { + const fromChainType = endpointIdToChainType(connection.vector.from.eid) + return fromChainType !== ChainType.APTOS && fromChainType !== ChainType.INITIA + }), + }, + }) + } + ) + + // We'll also need to override the default implementation of the signAndSend subtask + // (responsible for sending transactions to the network and waiting for confirmations) + // + // In this subtask we need to override the createSigner function so that it uses the Solana + // signer for all Solana transactions + subtask(SUBTASK_LZ_SIGN_AND_SEND, 'Sign OFT transactions', (args: SignAndSendTaskArgs, _hre, runSuper) => + runSuper({ + ...args, + createSigner: firstFactory( + async (eid) => { + if (endpointIdToChainType(eid) !== ChainType.SUI) { + throw new Error('Not a Sui EID') + } + const keypair = getSuiKeypairFromEnv() + const factory = createSuiSignerFactory(keypair, suiConnectionFactory) + return factory(eid) + }, + async (eid) => { + if (endpointIdToChainType(eid) !== ChainType.STARKNET) { + throw new Error('Not a Starknet EID') + } + try { + logger.debug(`Creating Starknet signer for eid ${eid}`) + const signer = await starknetSignerFactory(eid) + logger.debug(`Successfully created Starknet signer for eid ${eid}`) + return signer + } catch (error) { + logger.error(`Failed to create Starknet signer for eid ${eid}: ${error}`) + throw error + } + }, + aptosSignerFactory, + ...(solanaSignerFactory ? [solanaSignerFactory] : []), + args.createSigner + ), + }) + ) + + return runSuper(args) + }) + +// We'll change the default ownership transfer task to use our wire implementation +// +// The reason for this is the fact that the ownership transfer task has a deficiency +// and that is the fact that it does not support a custom SDK factory as of yet +// +// The two tasks are identical and the only drawback of this approach is the fact +// that the logs will say "Wiring OApp" instead of "Transferring ownership" +task(TASK_LZ_OWNABLE_TRANSFER_OWNERSHIP) + .addParam('multisigKey', 'The MultiSig key', undefined, publicKeyType, true) + .setAction(async (args: Args, hre) => { + return hre.run(TASK_LZ_OAPP_WIRE, { ...args, internalConfigurator: configureOwnable }) + }) diff --git a/examples/oft-main/tasks/evm/sendEvm.ts b/examples/oft-main/tasks/evm/sendEvm.ts new file mode 100644 index 0000000000..b5bddd5055 --- /dev/null +++ b/examples/oft-main/tasks/evm/sendEvm.ts @@ -0,0 +1,138 @@ +import bs58 from 'bs58' +import { BigNumber, ContractTransaction } from 'ethers' +import { parseUnits } from 'ethers/lib/utils' +import { HardhatRuntimeEnvironment } from 'hardhat/types' + +import { makeBytes32 } from '@layerzerolabs/devtools' +import { createGetHreByEid } from '@layerzerolabs/devtools-evm-hardhat' +import { createLogger, promptToContinue } from '@layerzerolabs/io-devtools' +import { ChainType, endpointIdToChainType, endpointIdToNetwork } from '@layerzerolabs/lz-definitions' + +import layerzeroConfig from '../../layerzero.config' +import { SendResult } from '../common/types' +import { DebugLogger, KnownErrors, MSG_TYPE, isEmptyOptionsEvm } from '../common/utils' +import { getLayerZeroScanLink } from '../solana' +const logger = createLogger() +export interface EvmArgs { + srcEid: number + dstEid: number + amount: string + to: string + minAmount?: string + extraOptions?: string + composeMsg?: string + oftAddress?: string +} +export async function sendEvm( + { srcEid, dstEid, amount, to, minAmount, extraOptions, composeMsg, oftAddress }: EvmArgs, + hre: HardhatRuntimeEnvironment +): Promise { + if (endpointIdToChainType(srcEid) !== ChainType.EVM) { + throw new Error(`non-EVM srcEid (${srcEid}) not supported here`) + } + const getHreByEid = createGetHreByEid(hre) + let srcEidHre: HardhatRuntimeEnvironment + try { + srcEidHre = await getHreByEid(srcEid) + } catch (error) { + DebugLogger.printErrorAndFixSuggestion( + KnownErrors.ERROR_GETTING_HRE, + `For network: ${endpointIdToNetwork(srcEid)}, OFT: ${oftAddress}` + ) + throw error + } + const signer = await srcEidHre.ethers.getNamedSigner('deployer') + // 1️⃣ resolve the OFT wrapper address + let wrapperAddress: string + if (oftAddress) { + wrapperAddress = oftAddress + } else { + const { contracts } = typeof layerzeroConfig === 'function' ? await layerzeroConfig() : layerzeroConfig + const wrapper = contracts.find((c) => c.contract.eid === srcEid) + if (!wrapper) throw new Error(`No config for EID ${srcEid}`) + wrapperAddress = wrapper.contract.contractName + ? (await srcEidHre.deployments.get(wrapper.contract.contractName)).address + : wrapper.contract.address! + } + // 2️⃣ load OFT ABI + const oftArtifact = await srcEidHre.artifacts.readArtifact('OFT') + const oft = await srcEidHre.ethers.getContractAt(oftArtifact.abi, wrapperAddress, signer) + // 3️⃣ fetch the underlying ERC-20 + const underlying = await oft.token() + // 4️⃣ fetch decimals from the underlying token + const erc20 = await srcEidHre.ethers.getContractAt('ERC20', underlying, signer) + const decimals: number = await erc20.decimals() + // 5️⃣ normalize the user-supplied amount + const amountUnits: BigNumber = parseUnits(amount, decimals) + // Decide how to encode `to` based on target chain: + const dstChain = endpointIdToChainType(dstEid) + let toBytes: string + if (dstChain === ChainType.SOLANA) { + // Base58→32-byte buffer + toBytes = makeBytes32(bs58.decode(to)) + } else { + // hex string → Uint8Array → zero-pad to 32 bytes + toBytes = makeBytes32(to) + } + // 6️⃣ build sendParam and dispatch + const sendParam = { + dstEid, + to: toBytes, + amountLD: amountUnits.toString(), + minAmountLD: minAmount ? parseUnits(minAmount, decimals).toString() : amountUnits.toString(), + extraOptions: extraOptions ? extraOptions.toString() : '0x', + composeMsg: composeMsg ? composeMsg.toString() : '0x', + oftCmd: '0x', + } + + // Check whether there are extra options or enforced options. If not, warn the user. + // Read on Message Options: https://docs.layerzero.network/v2/concepts/message-options + if (!extraOptions) { + try { + const enforcedOptions = composeMsg + ? await oft.enforcedOptions(dstEid, MSG_TYPE.SEND_AND_CALL) + : await oft.enforcedOptions(dstEid, MSG_TYPE.SEND) + + if (isEmptyOptionsEvm(enforcedOptions)) { + const proceed = await promptToContinue( + 'No extra options were included and OFT has no set enforced options. Your quote / send will most likely fail. Continue?' + ) + if (!proceed) { + throw new Error('Aborted due to missing options') + } + } + } catch (error) { + logger.debug(`Failed to check enforced options: ${error}`) + } + } + + // 6️⃣ Quote (MessagingFee = { nativeFee, lzTokenFee }) + logger.info('Quoting the native gas cost for the send transaction...') + let msgFee: { nativeFee: BigNumber; lzTokenFee: BigNumber } + try { + msgFee = await oft.quoteSend(sendParam, false) + } catch (error) { + DebugLogger.printErrorAndFixSuggestion( + KnownErrors.ERROR_QUOTING_NATIVE_GAS_COST, + `For network: ${endpointIdToNetwork(srcEid)}, OFT: ${oftAddress}` + ) + throw error + } + logger.info('Sending the transaction...') + let tx: ContractTransaction + try { + tx = await oft.send(sendParam, msgFee, signer.address, { + value: msgFee.nativeFee, + }) + } catch (error) { + DebugLogger.printErrorAndFixSuggestion( + KnownErrors.ERROR_SENDING_TRANSACTION, + `For network: ${endpointIdToNetwork(srcEid)}, OFT: ${oftAddress}` + ) + throw error + } + const receipt = await tx.wait() + const txHash = receipt.transactionHash + const scanLink = getLayerZeroScanLink(txHash, srcEid >= 40_000 && srcEid < 50_000) + return { txHash, scanLink } +} diff --git a/examples/oft-main/tasks/index.ts b/examples/oft-main/tasks/index.ts new file mode 100644 index 0000000000..a3fa08a300 --- /dev/null +++ b/examples/oft-main/tasks/index.ts @@ -0,0 +1,20 @@ +import './common/config.get' +import './common/wire' +import './common/sendOFT' +import './solana/initConfig' +import './solana/createOFT' +import './solana/createOFTAdapter' +import './solana/debug' +import './solana/getRateLimits' +import './solana/retryMessage' +import './solana/setAuthority' +import './solana/updateMetadata' +import './solana/setUpdateAuthority' +import './solana/getPrioFees' +import './solana/base58' +import './solana/setInboundRateLimit' +import './solana/setOutboundRateLimit' +import './solana/endpoint/skip' +import './solana/endpoint/burn' +import './solana/endpoint/clear' +import './solana/endpoint/nilify' diff --git a/examples/oft-main/tasks/solana/base58.ts b/examples/oft-main/tasks/solana/base58.ts new file mode 100644 index 0000000000..ea7ed20a4f --- /dev/null +++ b/examples/oft-main/tasks/solana/base58.ts @@ -0,0 +1,36 @@ +import assert from 'assert' +import fs from 'fs' +import path from 'path' + +import { Keypair } from '@solana/web3.js' +import bs58 from 'bs58' +import { task } from 'hardhat/config' + +import { types as devtoolsTypes } from '@layerzerolabs/devtools-evm-hardhat' + +interface Base58FeesTaskArgs { + /** + * The path to the keypair file to be used. + */ + keypairFile: string +} + +assert(process.env.HOME != undefined, 'process.env.HOME needs to be defined') + +const defaultKeypairFile = path.resolve(process.env.HOME, '.config/solana/id.json') + +task('lz:solana:base-58', 'Outputs the base58 string for a keypair') + .addParam( + 'keypairFile', + 'The path to the keypair file to be used. Defaults to ~/.config/solana/id.json', + defaultKeypairFile, + devtoolsTypes.string + ) + .setAction(async ({ keypairFile }: Base58FeesTaskArgs) => { + assert(fs.existsSync(keypairFile), `Keypair file not found: ${keypairFile}`) + const data = fs.readFileSync(keypairFile, 'utf8') + const keypairJson = JSON.parse(data) + const keypair = Keypair.fromSecretKey(Uint8Array.from(keypairJson)) + const base58EncodedPrivateKey = bs58.encode(keypair.secretKey) + console.log(`Base58 encoded private key: ${base58EncodedPrivateKey}`) + }) diff --git a/examples/oft-main/tasks/solana/createOFT.ts b/examples/oft-main/tasks/solana/createOFT.ts new file mode 100644 index 0000000000..604beef4b1 --- /dev/null +++ b/examples/oft-main/tasks/solana/createOFT.ts @@ -0,0 +1,400 @@ +import { + CreateV1InstructionAccounts, + CreateV1InstructionArgs, + TokenStandard, + createV1, + mintV1, +} from '@metaplex-foundation/mpl-token-metadata' +import { AuthorityType, setAuthority } from '@metaplex-foundation/mpl-toolbox' +import { + createNoopSigner, + createSignerFromKeypair, + percentAmount, + publicKey, + transactionBuilder, +} from '@metaplex-foundation/umi' +import { fromWeb3JsPublicKey, toWeb3JsPublicKey } from '@metaplex-foundation/umi-web3js-adapters' +import { TOKEN_PROGRAM_ID } from '@solana/spl-token' +import { PublicKey } from '@solana/web3.js' +import bs58 from 'bs58' +import { task } from 'hardhat/config' + +import { formatTokenAmount } from '@layerzerolabs/devtools' +import { types as devtoolsTypes } from '@layerzerolabs/devtools-evm-hardhat' +import { assertAccountInitialized, localDecimalsToMaxWholeTokens } from '@layerzerolabs/devtools-solana' +import { promptToContinue } from '@layerzerolabs/io-devtools' +import { EndpointId } from '@layerzerolabs/lz-definitions' +import { OFT_DECIMALS as DEFAULT_SHARED_DECIMALS, oft } from '@layerzerolabs/oft-v2-solana-sdk' + +import { checkMultisigSigners, createMintAuthorityMultisig } from './multisig' + +import { + TransactionType, + addComputeUnitInstructions, + deriveConnection, + deriveKeys, + getExplorerTxLink, + saveSolanaDeployment, +} from './index' + +const DEFAULT_LOCAL_DECIMALS = 9 + +interface CreateOFTTaskArgs { + /** + * The initial supply to mint on solana. + */ + amount: number + + /** + * The endpoint ID for the Solana network. + */ + eid: EndpointId + + /** + * The number of decimal places to use for the token. + */ + localDecimals: number + + /** + * OFT shared decimals. + */ + sharedDecimals: number + + /** + * The optional token mint ID, for Mint-And-Burn-Adapter only. + */ + mint?: string + + /** + * The name of the token. + */ + name: string + + /** + * The program ID for the OFT program. + */ + programId: string + + /** + * The seller fee basis points for Metaplex's Token Metadata standard (not enforced on-chain). This is not related to OFT fees. + */ + sellerFeeBasisPoints: number + + /** + * The symbol of the token. + */ + symbol: string + + /** + * Whether the token metadata is mutable. + */ + tokenMetadataIsMutable: boolean + + /** + * The CSV list of additional minters. + */ + additionalMinters?: string[] + + /** + * The token program ID, for Mint-And-Burn-Adapter only. + */ + tokenProgram: string + + /** + * 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 for everything but the OFTStore. You should really be intentional about + * using this flag, as it is not reversible. + */ + onlyOftStore: boolean + + /** + * The URI for the token metadata. + */ + uri: string + + computeUnitPriceScaleFactor: number + + /** + * The freeze authority address (only supported in onlyOftStore mode). + */ + freezeAuthority?: string + + /** + * Whether to continue without confirmation. + */ + ci: boolean +} + +// Define a Hardhat task for creating OFT on Solana +// * Create the SPL Multisig account for mint authority +// * Mint the new SPL Token +// * Initialize the OFT Store account +// * Set the mint authority to the multisig account. If not in only OFT Store mode, also set the freeze authority to the multisig account. +// Note: Only supports SPL Token Standard. +task('lz:oft:solana:create', 'Mints new SPL Token and creates new OFT Store account') + .addOptionalParam('amount', 'The initial supply to mint on solana', undefined, devtoolsTypes.int) + .addParam('eid', 'Solana mainnet (30168) or testnet (40168)', undefined, devtoolsTypes.eid) + .addOptionalParam('localDecimals', 'Token local decimals (default=9)', DEFAULT_LOCAL_DECIMALS, devtoolsTypes.int) + .addOptionalParam('sharedDecimals', 'OFT shared decimals (default=6)', DEFAULT_SHARED_DECIMALS, devtoolsTypes.int) + .addParam('name', 'Token Name', 'MockOFT', devtoolsTypes.string) + .addOptionalParam('mint', 'The Token mint public key (used for MABA only)', undefined, devtoolsTypes.string) + .addParam('programId', 'The OFT Program id') + .addParam('sellerFeeBasisPoints', 'Seller fee basis points', 0, devtoolsTypes.int) // Note: This is for Metaplex's Token Metadata standard (not enforced on-chain). This is not related to OFT fees. + .addParam('symbol', 'Token Symbol', 'MOFT', devtoolsTypes.string) + .addParam('tokenMetadataIsMutable', 'Token metadata is mutable', true, devtoolsTypes.boolean) + .addParam('additionalMinters', 'Comma-separated list of additional minters', undefined, devtoolsTypes.csv, true) + .addOptionalParam( + 'onlyOftStore', + '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.', + false, + devtoolsTypes.boolean + ) + .addParam( + 'tokenProgram', + 'The Token Program public key (used for MABA only)', + TOKEN_PROGRAM_ID.toBase58(), + devtoolsTypes.string + ) + .addParam('uri', 'URI for token metadata', '', devtoolsTypes.string) + .addParam( + 'freezeAuthority', + 'The Freeze Authority address (only in onlyOftStore mode)', + '', + devtoolsTypes.string, + true + ) + .addParam('computeUnitPriceScaleFactor', 'The compute unit price scale factor', 4, devtoolsTypes.float, true) + .addFlag('ci', 'Continue without confirmation') + .setAction( + async ({ + amount, + eid, + localDecimals: decimals, + sharedDecimals, + mint: mintStr, + name, + programId: programIdStr, + sellerFeeBasisPoints, + symbol, + tokenMetadataIsMutable: isMutable, + additionalMinters: additionalMintersAsStrings, + onlyOftStore, + tokenProgram: tokenProgramStr, + uri, + freezeAuthority: freezeAuthorityStr, + computeUnitPriceScaleFactor, + ci, + }: CreateOFTTaskArgs) => { + const isMABA = !!mintStr // the difference between MABA and OFT Adapter is that MABA uses mint/burn mechanism whereas OFT Adapter uses lock/unlock mechanism + if (tokenProgramStr !== TOKEN_PROGRAM_ID.toBase58() && !isMABA) { + throw new Error('Non-Mint-And-Burn-Adapter does not support custom token programs') + } + if (isMABA && amount) { + throw new Error('Mint-And-Burn-Adapter does not support minting tokens') + } + if (decimals < sharedDecimals) { + throw new Error('Solana token local decimals must be greater than or equal to OFT shared decimals') + } + const tokenProgramId = publicKey(tokenProgramStr) + const { connection, umi, umiWalletKeyPair, umiWalletSigner } = await deriveConnection(eid) + const { programId, lockBox, escrowPK, oftStorePda, eddsa } = deriveKeys(programIdStr) + + const additionalMinters = additionalMintersAsStrings?.map((minter) => new PublicKey(minter)) ?? [] + + // BOF: Validate combination of parameters + if (!additionalMintersAsStrings) { + if (!onlyOftStore) { + throw new Error( + 'If you want to proceed with only the OFT Store having the ability to mint, please specify --only-oft-store true. Note that this also means the Freeze Authority will be immediately renounced, unless --freeze-authority is specified.' + ) + } + } + + if (freezeAuthorityStr && !onlyOftStore) { + throw new Error('`--freeze-authority` is only supported in `--only-oft-store true` mode') + } + + if (onlyOftStore && additionalMintersAsStrings && additionalMintersAsStrings?.length > 0) { + throw new Error( + 'Cannot set both --only-oft-store and --additional-minters; these options are mutually exclusive.' + ) + } + + if (onlyOftStore && !ci) { + const continueWithOnlyOftStore = await promptToContinue( + `You have chosen \`--only-oft-store true\`. This means that only the OFT Store will be able to mint new tokens${freezeAuthorityStr ? '' : ' and that the Freeze Authority will be immediately renounced'}. Continue?` + ) + if (!continueWithOnlyOftStore) { + return + } + } + + // EOF: Validate combination of parameters + + const maxSupplyRaw = localDecimalsToMaxWholeTokens(decimals) + const { full, compact } = formatTokenAmount(maxSupplyRaw) + const maxSupplyStatement = `You have chosen ${decimals} local decimals. The maximum supply of your Solana OFT token will be ${full} (~${compact}).\n` + const confirmMaxSupply = await promptToContinue(maxSupplyStatement) + if (!confirmMaxSupply) { + return + } + + let mintAuthorityPublicKey: PublicKey = toWeb3JsPublicKey(oftStorePda) // we default to the OFT Store as the Mint Authority when there are no additional minters + + if (additionalMintersAsStrings) { + // we only need a multisig when we have additional minters + mintAuthorityPublicKey = await createMintAuthorityMultisig( + connection, + umi, + eid, + umiWalletSigner, + toWeb3JsPublicKey(oftStorePda), + toWeb3JsPublicKey(tokenProgramId), // Only configurable for MABA + additionalMinters, + computeUnitPriceScaleFactor + ) + console.log(`created SPL multisig @ ${mintAuthorityPublicKey.toBase58()}`) + await checkMultisigSigners(connection, mintAuthorityPublicKey, [ + toWeb3JsPublicKey(oftStorePda), + ...additionalMinters, + ]) + } + + // BOF: determine freeze authority + // important: this must be placed after multisig creation + let freezeAuthority: PublicKey | null = null + if (freezeAuthorityStr && onlyOftStore) { + freezeAuthority = new PublicKey(freezeAuthorityStr) // will error if invalid + const continueFreezeAuthority = await promptToContinue( + `Freeze Authority will be set to ${freezeAuthority.toBase58()}. Continue?` + ) + if (!continueFreezeAuthority) { + return + } + } else { + // onlyOftStore mode: if freezeAuthority is not provided, we set it to null + // additional minters mode: set freezeAuthority to mintAuthorityPublicKey (SPL Multisig) + freezeAuthority = onlyOftStore ? null : mintAuthorityPublicKey + } + // EOF: determine freeze authority + + const mint = isMABA + ? createNoopSigner(publicKey(mintStr)) + : createSignerFromKeypair(umi, eddsa.generateKeypair()) + const isTestnet = eid == EndpointId.SOLANA_V2_TESTNET + if (!isMABA) { + const createV1Args: CreateV1InstructionAccounts & CreateV1InstructionArgs = { + mint, + name, + symbol, + decimals, + uri, + isMutable, + sellerFeeBasisPoints: percentAmount(sellerFeeBasisPoints), + authority: umiWalletSigner, // authority is transferred later + tokenStandard: TokenStandard.Fungible, + } + let txBuilder = transactionBuilder().add(createV1(umi, createV1Args)) + if (amount) { + // recreate txBuilder since it is immutable + txBuilder = transactionBuilder() + .add(txBuilder) + .add( + mintV1(umi, { + ...createV1Args, + mint: publicKey(createV1Args.mint), + authority: umiWalletSigner, + amount, + tokenOwner: umiWalletSigner.publicKey, + tokenStandard: TokenStandard.Fungible, + }) + ) + } + txBuilder = await addComputeUnitInstructions( + connection, + umi, + eid, + txBuilder, + umiWalletSigner, + computeUnitPriceScaleFactor, + TransactionType.CreateToken + ) + const createTokenTx = await txBuilder.sendAndConfirm(umi) + await assertAccountInitialized(connection, toWeb3JsPublicKey(mint.publicKey)) + console.log(`createTokenTx: ${getExplorerTxLink(bs58.encode(createTokenTx.signature), isTestnet)}`) + } + + const lockboxSigner = createSignerFromKeypair({ eddsa: eddsa }, lockBox) + let txBuilder = transactionBuilder().add( + oft.initOft( + { + payer: umiWalletSigner, + admin: umiWalletKeyPair.publicKey, + mint: mint.publicKey, + escrow: lockboxSigner, + }, + oft.types.OFTType.Native, + sharedDecimals, + { + oft: programId, + token: tokenProgramId, + } + ) + ) + txBuilder = await addComputeUnitInstructions( + connection, + umi, + eid, + txBuilder, + umiWalletSigner, + computeUnitPriceScaleFactor, + TransactionType.InitOft + ) + const { signature } = await txBuilder.sendAndConfirm(umi) + console.log(`initOftTx: ${getExplorerTxLink(bs58.encode(signature), isTestnet)}`) + + if (!isMABA) { + let txBuilder = transactionBuilder() + .add( + setAuthority(umi, { + owned: mint.publicKey, + owner: umiWalletSigner, + newAuthority: fromWeb3JsPublicKey(mintAuthorityPublicKey), + authorityType: AuthorityType.MintTokens, + }) + ) + .add( + setAuthority(umi, { + owned: mint.publicKey, + owner: umiWalletSigner, + newAuthority: freezeAuthority ? fromWeb3JsPublicKey(freezeAuthority) : null, + authorityType: AuthorityType.FreezeAccount, + }) + ) + txBuilder = await addComputeUnitInstructions( + connection, + umi, + eid, + txBuilder, + umiWalletSigner, + computeUnitPriceScaleFactor, + TransactionType.SetAuthority + ) + const { signature } = await txBuilder.sendAndConfirm(umi) + console.log(`setAuthorityTx: ${getExplorerTxLink(bs58.encode(signature), isTestnet)}`) + } + if (isMABA) { + console.log( + `Please note that for MABA mode, you must carry out the change of Mint Authority before making any cross-chain transfers. For more details: https://github.com/LayerZero-Labs/devtools/tree/main/examples/oft-main#for-oft-mint-and-burn-adapter-maba` + ) + } + saveSolanaDeployment( + eid, + programIdStr, + mint.publicKey, + mintAuthorityPublicKey.toBase58(), + escrowPK, + oftStorePda + ) + } + ) diff --git a/examples/oft-main/tasks/solana/createOFTAdapter.ts b/examples/oft-main/tasks/solana/createOFTAdapter.ts new file mode 100644 index 0000000000..c6ec44ebe0 --- /dev/null +++ b/examples/oft-main/tasks/solana/createOFTAdapter.ts @@ -0,0 +1,118 @@ +import { createSignerFromKeypair, publicKey, transactionBuilder } from '@metaplex-foundation/umi' +import { TOKEN_PROGRAM_ID, getMint } from '@solana/spl-token' +import { PublicKey } from '@solana/web3.js' +import bs58 from 'bs58' +import { task } from 'hardhat/config' + +import { formatTokenAmount } from '@layerzerolabs/devtools' +import { types as devtoolsTypes } from '@layerzerolabs/devtools-evm-hardhat' +import { localDecimalsToMaxWholeTokens } from '@layerzerolabs/devtools-solana' +import { promptToContinue } from '@layerzerolabs/io-devtools' +import { EndpointId } from '@layerzerolabs/lz-definitions' +import { OFT_DECIMALS, oft } from '@layerzerolabs/oft-v2-solana-sdk' + +import { + TransactionType, + addComputeUnitInstructions, + deriveConnection, + deriveKeys, + getExplorerTxLink, + saveSolanaDeployment, +} from './index' + +interface CreateOFTAdapterTaskArgs { + /** + * The endpoint ID for the Solana network. + */ + eid: EndpointId + + /** + * The token mint public key. + */ + mint: string + + /** + * The OFT Program id. + */ + programId: string + + /** + * The Token Program public key. + */ + tokenProgram: string + + computeUnitPriceScaleFactor: number +} + +// Define a Hardhat task for creating OFTAdapter on Solana +task('lz:oft-adapter:solana:create', 'Creates new OFT Adapter (OFT Store PDA)') + .addParam('mint', 'The Token Mint public key') + .addParam('programId', 'The OFT program ID') + .addParam('eid', 'Solana mainnet (30168) or testnet (40168)', undefined, devtoolsTypes.eid) + .addParam('tokenProgram', 'The Token Program public key', TOKEN_PROGRAM_ID.toBase58(), devtoolsTypes.string, true) + .addParam('computeUnitPriceScaleFactor', 'The compute unit price scale factor', 4, devtoolsTypes.float, true) + .setAction( + async ({ + eid, + mint: mintStr, + programId: programIdStr, + tokenProgram: tokenProgramStr, + computeUnitPriceScaleFactor, + }: CreateOFTAdapterTaskArgs) => { + const { connection, umi, umiWalletKeyPair, umiWalletSigner } = await deriveConnection(eid) + const { programId, lockBox, escrowPK, oftStorePda, eddsa } = deriveKeys(programIdStr) + + const tokenProgram = publicKey(tokenProgramStr) + const mint = publicKey(mintStr) + + const mintPDA = await getMint(connection, new PublicKey(mintStr), undefined, new PublicKey(tokenProgramStr)) + const mintDecimals = mintPDA.decimals + + const maxSupplyRaw = localDecimalsToMaxWholeTokens(mintDecimals) + const { full, compact } = formatTokenAmount(maxSupplyRaw) + const maxSupplyStatement = `The underlying token has ${mintDecimals} local decimals. Its maximum supply is ${full} (~${compact}).\n` + const confirmMaxSupply = await promptToContinue(maxSupplyStatement) + if (!confirmMaxSupply) { + return + } + + const mintAuthority = mintPDA.mintAuthority + + let txBuilder = transactionBuilder().add( + oft.initOft( + { + payer: createSignerFromKeypair({ eddsa: eddsa }, umiWalletKeyPair), + admin: umiWalletKeyPair.publicKey, + mint: mint, + escrow: createSignerFromKeypair({ eddsa: eddsa }, lockBox), + }, + oft.types.OFTType.Adapter, + OFT_DECIMALS, + { + oft: programId, + token: tokenProgram ? publicKey(tokenProgram) : undefined, + } + ) + ) + txBuilder = await addComputeUnitInstructions( + connection, + umi, + eid, + txBuilder, + umiWalletSigner, + computeUnitPriceScaleFactor, + TransactionType.InitOft + ) + const { signature } = await txBuilder.sendAndConfirm(umi) + console.log(`initOftTx: ${getExplorerTxLink(bs58.encode(signature), eid == EndpointId.SOLANA_V2_TESTNET)}`) + + saveSolanaDeployment( + eid, + programIdStr, + mint, + mintAuthority ? mintAuthority.toBase58() : '', + escrowPK, + oftStorePda + ) + } + ) diff --git a/examples/oft-main/tasks/solana/debug.ts b/examples/oft-main/tasks/solana/debug.ts new file mode 100644 index 0000000000..ba8e29ec21 --- /dev/null +++ b/examples/oft-main/tasks/solana/debug.ts @@ -0,0 +1,483 @@ +import { fetchMint } from '@metaplex-foundation/mpl-toolbox' +import { PublicKey as UmiPublicKey, publicKey, unwrapOption } from '@metaplex-foundation/umi' +import { fromWeb3JsPublicKey, toWeb3JsPublicKey } from '@metaplex-foundation/umi-web3js-adapters' +import { TOKEN_2022_PROGRAM_ID, TOKEN_PROGRAM_ID } from '@solana/spl-token' +import { Keypair, PublicKey } from '@solana/web3.js' +import { task } from 'hardhat/config' + +import { OmniPoint, denormalizePeer } from '@layerzerolabs/devtools' +import { types } from '@layerzerolabs/devtools-evm-hardhat' +import { isSquadsV4Vault } from '@layerzerolabs/devtools-solana' +import { EndpointId, getNetworkForChainId } from '@layerzerolabs/lz-definitions' +import { EndpointPDADeriver, EndpointProgram } from '@layerzerolabs/lz-solana-sdk-v2' +import { EndpointProgram as EndpointProgramUmi } from '@layerzerolabs/lz-solana-sdk-v2/umi' +import { IMetadata, defaultFetchMetadata } from '@layerzerolabs/metadata-tools' +import { OftPDA, oft } from '@layerzerolabs/oft-v2-solana-sdk' +import { EndpointV2 } from '@layerzerolabs/protocol-devtools-solana' + +import { getSolanaReceiveConfig, getSolanaSendConfig } from '../common/taskHelper' +import { + DebugLogger, + SolanaTokenProgramType, + createSolanaConnectionFactory, + decodeLzReceiveOptions, + getSolanaTokenMetadata, + uint8ArrayToHex, +} from '../common/utils' + +import { deriveConnection, getSolanaDeployment } from './index' + +const DEBUG_ACTIONS = { + OFT_STORE: 'oft-store', + GET_ADMIN: 'admin', + GET_DELEGATE: 'delegate', + CHECKS: 'checks', + GET_TOKEN: 'token', + GET_PEERS: 'peers', + RATE_LIMITS: 'rate-limits', +} + +/** + * Get the OFTStore account from the task arguments, the deployment file, or throw an error. + * @param {EndpointId} eid + * @param {string} oftStore + */ +const getOftStore = (eid: EndpointId, oftStore?: string) => publicKey(oftStore ?? getSolanaDeployment(eid).oftStore) + +function getChainKeyForEid(metadata: IMetadata, eid: number): string { + const eidStr = String(eid) + for (const objectKey in metadata) { + const entry = metadata[objectKey] + if (typeof entry?.deployments !== 'undefined') { + for (const deployment of entry.deployments) { + if (deployment.eid === eidStr) { + return deployment.chainKey + } + } + } + } + throw new Error(`Can't find chainKey for eid: "${eid}".`) +} + +function formatDvnAddresses(addresses: string[], metadata?: IMetadata, chainKey?: string): string { + const dvnMap = (chainKey && metadata ? metadata[chainKey]?.dvns : undefined) as + | Record + | undefined + return addresses.map((addr) => dvnMap?.[addr]?.canonicalName ?? addr).join(', ') +} + +function tokenProgramAddressToType(tokenProgramAddress: string | PublicKey): SolanaTokenProgramType { + const address = typeof tokenProgramAddress === 'string' ? new PublicKey(tokenProgramAddress) : tokenProgramAddress + const tokenProgramMap: Record = { + [TOKEN_PROGRAM_ID.toBase58()]: SolanaTokenProgramType.SPL, + [TOKEN_2022_PROGRAM_ID.toBase58()]: SolanaTokenProgramType.Token2022, + } + const addressStr = address.toBase58() + const name = tokenProgramMap[addressStr] + if (!name) { + throw new Error(`Invalid token program address: ${addressStr}. Expected either SPL Token or Token2022.`) + } + return name +} + +type DebugTaskArgs = { + eid: EndpointId + oftStore?: string + endpoint: string + dstEids: EndpointId[] + action?: string +} + +task('lz:oft:solana:debug', 'Manages OFTStore and OAppRegistry information') + .addParam( + 'eid', + 'Solana mainnet (30168) or testnet (40168). Defaults to mainnet.', + EndpointId.SOLANA_V2_MAINNET, + types.eid + ) + .addParam( + 'oftStore', + 'The OFTStore public key. Derived from deployments if not provided.', + undefined, + types.string, + true + ) + .addParam('endpoint', 'The Endpoint public key', EndpointProgram.PROGRAM_ID.toBase58(), types.string) + .addOptionalParam('dstEids', 'Destination eids to check (comma-separated list)', [], types.csv) + .addOptionalParam( + 'action', + `The action to perform: ${Object.keys(DEBUG_ACTIONS).join(', ')} (defaults to all)`, + undefined, + types.string + ) + .setAction(async (taskArgs: DebugTaskArgs) => { + const { eid, oftStore: oftStoreArg, endpoint, dstEids, action } = taskArgs + const { umi, connection } = await deriveConnection(eid, true) + const oftStore = getOftStore(eid, oftStoreArg) + const metadata = await defaultFetchMetadata() + const sourceChainKey = getChainKeyForEid(metadata, eid) + + let oftStoreInfo + try { + oftStoreInfo = await oft.accounts.fetchOFTStore(umi, oftStore) + } catch (e) { + console.error(`Failed to fetch OFTStore at ${oftStore.toString()}:`, e) + return + } + const nonceAccountChecksInfo: Partial< + Record + > = {} + + const mintAccount = await fetchMint(umi, publicKey(oftStoreInfo.tokenMint)) + const tokenProgramType = tokenProgramAddressToType(mintAccount.header.owner) + + const epDeriver = new EndpointPDADeriver(new PublicKey(endpoint)) + const [oAppRegistry] = epDeriver.oappRegistry(toWeb3JsPublicKey(oftStore)) + const oAppRegistryInfo = await EndpointProgram.accounts.OAppRegistry.fromAccountAddress( + connection, + oAppRegistry + ) + + if (!oAppRegistryInfo) { + console.warn('OAppRegistry info not found.') + return + } + + const oftDeriver = new OftPDA(oftStoreInfo.header.owner) + + const tokenMetadata = await getSolanaTokenMetadata(umi, publicKey(oftStoreInfo.tokenMint), tokenProgramType) + + // Note: isSquadsV4Vault only works on mainnet + const adminIsSquadsV4Vault = await isSquadsV4Vault(eid as number, oftStoreInfo.admin) + const delegateIsSquadsV4Vault = await isSquadsV4Vault(eid as number, oAppRegistryInfo?.delegate?.toBase58()) + + const printOftStore = async () => { + DebugLogger.header('OFT Store Information') + DebugLogger.keyValue('OFT Program', oftStoreInfo.header.owner) + DebugLogger.keyValue('OFT Type', oft.types.OFTType[oftStoreInfo.oftType]) + DebugLogger.keyValue('Admin', oftStoreInfo.admin) + DebugLogger.keyValue('Token Mint', oftStoreInfo.tokenMint) + DebugLogger.keyValue('Token Escrow', oftStoreInfo.tokenEscrow) + DebugLogger.keyValue('Endpoint Program', oftStoreInfo.endpointProgram) + DebugLogger.separator() + } + + const printAdmin = async () => { + const admin = oftStoreInfo.admin + DebugLogger.keyValue('Admin', admin) + } + + const printDelegate = async () => { + const delegate = oAppRegistryInfo?.delegate?.toBase58() + DebugLogger.header('OApp Registry Information') + DebugLogger.keyValue('Delegate', delegate) + DebugLogger.separator() + } + + const printToken = async () => { + DebugLogger.header('Token Information') + DebugLogger.keyValue('Mint Address', oftStoreInfo.tokenMint) + DebugLogger.keyValue('Token Name', tokenMetadata?.name ?? 'N/A') + DebugLogger.keyValue('Token Symbol', tokenMetadata?.symbol ?? 'N/A') + DebugLogger.keyValue('Token Program', tokenProgramType) + DebugLogger.keyValue('Mint Authority', unwrapOption(mintAccount.mintAuthority)) + DebugLogger.keyValue( + 'Freeze Authority', + unwrapOption(mintAccount.freezeAuthority, () => 'None') + ) + DebugLogger.keyValue('Update Authority', tokenMetadata?.updateAuthority ?? 'N/A (no Metaplex Metadata)') + DebugLogger.keyValue('Metadata is mutable', tokenMetadata?.isMutable ?? 'N/A') + DebugLogger.separator() + } + + const printChecks = async () => { + const delegate = oAppRegistryInfo?.delegate?.toBase58() + + DebugLogger.header('Checks') + DebugLogger.keyValue('Admin (Owner) same as Delegate', oftStoreInfo.admin === delegate) + DebugLogger.keyValue( + 'Token Mint Authority is OFT Store', + unwrapOption(mintAccount.mintAuthority) === oftStore + ) + DebugLogger.keyValue('Admin is Squads V4 Vault', adminIsSquadsV4Vault) + DebugLogger.keyValue('Delegate is Squads V4 Vault', delegateIsSquadsV4Vault) + dstEids.map((dstEid) => { + DebugLogger.keyHeader(`Nonce Account Checks`) + const nonceAccountCheckInfo = nonceAccountChecksInfo[dstEid] + if (nonceAccountCheckInfo) { + const definedForDstEid = !!nonceAccountCheckInfo.data + DebugLogger.keyValue( + `Defined for ${dstEid} (${getNetworkForChainId(dstEid).chainName})`, + definedForDstEid, + 2 + ) + if (!definedForDstEid) { + console.warn( + `Expected Nonce Account to exist at ${nonceAccountCheckInfo.address.toString()} for destination ${dstEid} (${getNetworkForChainId(dstEid).chainName}).` + ) + } + } + }) + DebugLogger.separator() + } + + let peerConfigsCache: { + peerConfigs: UmiPublicKey[] + peerConfigInfos: Awaited> + endpointV2Sdk: EndpointV2 + } | null = null + const fetchPeerConfigsAndSdk = async () => { + if (peerConfigsCache) { + return peerConfigsCache + } + + const peerConfigs = dstEids.map((dstEid) => { + const peerConfig = oftDeriver.peer(oftStore, dstEid) + return publicKey(peerConfig) + }) + const mockKeypair = new Keypair() + const point: OmniPoint = { + eid, + address: oftStore.toString(), + } + const endpointV2Sdk = new EndpointV2( + await createSolanaConnectionFactory()(eid), + point, + mockKeypair.publicKey // doesn't matter as we are not sending transactions + ) + + const peerConfigInfos = await oft.accounts.safeFetchAllPeerConfig(umi, peerConfigs) + + peerConfigsCache = { peerConfigs, peerConfigInfos, endpointV2Sdk } + return peerConfigsCache + } + + const printPeerConfigs = async () => { + const { peerConfigs, peerConfigInfos, endpointV2Sdk } = await fetchPeerConfigsAndSdk() + + DebugLogger.header('Peer Configurations') + for (let index = 0; index < dstEids.length; index++) { + const dstEid = dstEids[index] + const info = peerConfigInfos[index] + const network = getNetworkForChainId(dstEid) + const oAppReceiveConfig = await getSolanaReceiveConfig(endpointV2Sdk, dstEid, oftStore) + const oAppSendConfig = await getSolanaSendConfig(endpointV2Sdk, dstEid, oftStore) + // Show the chain info + DebugLogger.header(`${dstEid} (${network.chainName})`) + + if (info) { + // nonce account + const nonceAccount = epDeriver.nonce(toWeb3JsPublicKey(oftStore), dstEid, info.peerAddress)[0] + const nonceAccountInfo = await EndpointProgramUmi.accounts.fetchNonce( + umi, + fromWeb3JsPublicKey(nonceAccount) + ) + nonceAccountChecksInfo[dstEid] = { + data: nonceAccountInfo, + address: fromWeb3JsPublicKey(nonceAccount), + } + // Existing PeerConfig info + DebugLogger.keyValue('PeerConfig Account', peerConfigs[index].toString()) + DebugLogger.keyValue('Peer Address', denormalizePeer(info.peerAddress, dstEid)) + DebugLogger.keyValue('Nonce Account', nonceAccount.toString()) + DebugLogger.keyHeader('Enforced Options') + DebugLogger.keyValue( + 'Send', + decodeLzReceiveOptions(uint8ArrayToHex(info.enforcedOptions.send, true)), + 2 + ) + DebugLogger.keyValue( + 'SendAndCall', + decodeLzReceiveOptions(uint8ArrayToHex(info.enforcedOptions.sendAndCall, true)), + 2 + ) + + printOAppReceiveConfigs(oAppReceiveConfig, network.chainName, metadata, sourceChainKey) + printOAppSendConfigs(oAppSendConfig, network.chainName, metadata, sourceChainKey) + } else { + // No PeerConfig account + console.log(`No PeerConfig account found for ${dstEid} (${network.chainName}).`) + } + + DebugLogger.separator() + } + } + + const printRateLimits = async () => { + const { peerConfigInfos } = await fetchPeerConfigsAndSdk() + + DebugLogger.header('Rate Limits') + + const sourceNetwork = getNetworkForChainId(eid) + + for (let index = 0; index < dstEids.length; index++) { + const dstEid = dstEids[index] + const info = peerConfigInfos[index] + const network = getNetworkForChainId(dstEid) + + DebugLogger.header(`${dstEid} (${network.chainName})`) + + if (info) { + const { outboundRateLimiter, inboundRateLimiter } = info + printRateLimitsForPeer( + outboundRateLimiter, + inboundRateLimiter, + sourceNetwork.chainName, + network.chainName + ) + } else { + DebugLogger.keyValue('PeerConfig', 'Not found', 1) + } + + DebugLogger.separator() + } + } + if (action) { + switch (action) { + case DEBUG_ACTIONS.OFT_STORE: + await printOftStore() + break + case DEBUG_ACTIONS.GET_ADMIN: + await printAdmin() + break + case DEBUG_ACTIONS.GET_DELEGATE: + await printDelegate() + break + case DEBUG_ACTIONS.CHECKS: + await printChecks() + break + case DEBUG_ACTIONS.GET_TOKEN: + await printToken() + break + case DEBUG_ACTIONS.GET_PEERS: + await printPeerConfigs() + break + case DEBUG_ACTIONS.RATE_LIMITS: + await printRateLimits() + break + default: + console.error(`Invalid action specified. Use any of ${Object.keys(DEBUG_ACTIONS)}.`) + } + } else { + const tasks = [printOftStore(), printDelegate(), printToken()] + if (dstEids.length > 0) tasks.push(printPeerConfigs()) + await Promise.all(tasks) + // printChecks might depend on other tasks, so we don't add it to the tasks array + await printChecks() + } + }) + +function printOAppReceiveConfigs( + oAppReceiveConfig: Awaited>, + peerChainName: string, + metadata?: IMetadata, + chainKey?: string +) { + const oAppReceiveConfigIndexesToKeys: Record = { + 0: 'receiveLibrary', + 1: 'receiveUlnConfig', + 2: 'receiveLibraryTimeoutConfig', + } + + if (!oAppReceiveConfig) { + console.log('No receive configs found.') + return + } + + DebugLogger.keyValue(`Receive Configs (${peerChainName} to solana)`, '') + for (let i = 0; i < oAppReceiveConfig.length; i++) { + const item = oAppReceiveConfig[i] + if (typeof item === 'object' && item !== null) { + // Print each property in the object + DebugLogger.keyValue(`${oAppReceiveConfigIndexesToKeys[i]}`, '', 2) + for (const [propKey, propVal] of Object.entries(item)) { + const valueDisplay = + (propKey === 'requiredDVNs' || propKey === 'optionalDVNs') && Array.isArray(propVal) + ? formatDvnAddresses(propVal as string[], metadata, chainKey) + : String(propVal) + DebugLogger.keyValue(`${propKey}`, valueDisplay, 3) + } + } else { + // Print a primitive (string, number, etc.) + DebugLogger.keyValue(`${oAppReceiveConfigIndexesToKeys[i]}`, String(item), 2) + } + } +} + +function printOAppSendConfigs( + oAppSendConfig: Awaited>, + peerChainName: string, + metadata?: IMetadata, + chainKey?: string +) { + const sendOappConfigIndexesToKeys: Record = { + 0: 'sendLibrary', + 1: 'sendUlnConfig', + 2: 'sendExecutorConfig', + } + + if (!oAppSendConfig) { + console.log('No send configs found.') + return + } + + DebugLogger.keyValue(`Send Configs (solana to ${peerChainName})`, '') + for (let i = 0; i < oAppSendConfig.length; i++) { + const item = oAppSendConfig[i] + if (typeof item === 'object' && item !== null) { + DebugLogger.keyValue(`${sendOappConfigIndexesToKeys[i]}`, '', 2) + for (const [propKey, propVal] of Object.entries(item)) { + const valueDisplay = + (propKey === 'requiredDVNs' || propKey === 'optionalDVNs') && Array.isArray(propVal) + ? formatDvnAddresses(propVal as string[], metadata, chainKey) + : String(propVal) + DebugLogger.keyValue(`${propKey}`, valueDisplay, 3) + } + } else { + DebugLogger.keyValue(`${sendOappConfigIndexesToKeys[i]}`, String(item), 2) + } + } +} + +type RateLimiter = { + __option: 'Some' | 'None' + value?: { + capacity: bigint + tokens: bigint + refillPerSecond: bigint + lastRefillTime: bigint + } +} + +function formatUnixSecondsToUtc(secs: bigint): string { + const millis = Number(secs) * 1000 + const iso = new Date(millis).toISOString() + return iso.replace('T', ' ').replace('.000Z', ' UTC') +} + +function printSingleRateLimiter(label: string, limiter: RateLimiter | null | undefined) { + DebugLogger.keyValue(label, '', 1) + + if (!limiter || limiter.__option !== 'Some' || !limiter.value) { + DebugLogger.keyValue('status', 'None', 2) + return + } + + const { capacity, tokens, refillPerSecond, lastRefillTime } = limiter.value + + DebugLogger.keyValue('capacity', String(capacity), 2) + DebugLogger.keyValue('tokens (available allowance)', String(tokens), 2) + DebugLogger.keyValue('refillPerSecond', String(refillPerSecond), 2) + DebugLogger.keyValue('lastRefillTime', formatUnixSecondsToUtc(lastRefillTime), 2) +} + +function printRateLimitsForPeer( + outboundRateLimiter: RateLimiter | null | undefined, + inboundRateLimiter: RateLimiter | null | undefined, + sourceChainName: string, + destinationChainName: string +) { + DebugLogger.keyValue('Rate Limits', '') + printSingleRateLimiter(`Outbound (${sourceChainName} to ${destinationChainName})`, outboundRateLimiter) + printSingleRateLimiter(`Inbound (${destinationChainName} to ${sourceChainName})`, inboundRateLimiter) +} diff --git a/examples/oft-main/tasks/solana/endpoint/burn.ts b/examples/oft-main/tasks/solana/endpoint/burn.ts new file mode 100644 index 0000000000..7d29faf843 --- /dev/null +++ b/examples/oft-main/tasks/solana/endpoint/burn.ts @@ -0,0 +1,74 @@ +import { TransactionBuilder, publicKey as umiPublicKey } from '@metaplex-foundation/umi' +import bs58 from 'bs58' +import { task } from 'hardhat/config' + +import { types as devtoolsTypes } from '@layerzerolabs/devtools-evm-hardhat' +import { EndpointId } from '@layerzerolabs/lz-definitions' +import { EndpointProgram } from '@layerzerolabs/lz-solana-sdk-v2/umi' +import { addressToBytes32 } from '@layerzerolabs/lz-v2-utilities' + +import { deriveConnection, getExplorerTxLink } from '../index' + +import { resolvePayloadHashBytes } from './endpointUtils' + +interface BurnTaskArgs { + eid: EndpointId // The endpoint ID for the Solana network. + sender: string // The sender address (hex format). + receiver: string // The receiver address (base58 format). + srcEid: number // The source endpoint ID. + nonce: string // The nonce. + payloadHash?: string // The payload hash (hex format). + guid?: string // The GUID (hex string, 32 bytes) + message?: string // The message payload (hex string) +} + +// Example: pnpm hardhat lz:oft:solana:burn --eid 40168 --sender --receiver --src-eid 40161 --nonce --payload-hash +// or: pnpm hardhat lz:oft:solana:burn --eid 40168 --sender --receiver --src-eid 40161 --nonce --guid --message +// Note: either provide payloadHash OR (guid + message). No overlap or partials. +// Note: for GUID and message, you can refer to layerzeroscan.com and search via the source transaction hash to get the values +// Note: to retrieve the payload hash, view/curl https://scan-testnet.layerzero-api.com/v1/messages/tx/ and search for 'payloadHash' + +task('lz:oft:solana:burn', 'Burn a nonce on Solana') + .addParam('eid', 'Solana mainnet (30168) or testnet (40168) eid', undefined, devtoolsTypes.eid) + .addParam('sender', 'The sender address (hex format)', undefined, devtoolsTypes.string) + .addParam('receiver', 'The receiver address (base58 format)', undefined, devtoolsTypes.string) + .addParam('srcEid', 'The source endpoint ID', undefined, devtoolsTypes.int) + .addParam('nonce', 'The nonce', undefined, devtoolsTypes.string) + .addOptionalParam('payloadHash', 'The payload hash (hex format)', undefined, devtoolsTypes.string) + .addOptionalParam('guid', 'The GUID (hex string, 32 bytes)', undefined, devtoolsTypes.string) + .addOptionalParam('message', 'The message payload (hex string)', undefined, devtoolsTypes.string) + .setAction(async ({ eid, sender, receiver, srcEid, nonce, payloadHash, guid, message }: BurnTaskArgs) => { + const { umi, umiWalletSigner } = await deriveConnection(eid) + const endpoint = new EndpointProgram.Endpoint(EndpointProgram.ENDPOINT_PROGRAM_ID) + + // Validate inputs and resolve payload hash bytes + const payloadHashBytes = resolvePayloadHashBytes(payloadHash, guid, message) + // Convert sender from hex to bytes32 + const senderBytes = addressToBytes32(sender) + if (senderBytes.length !== 32) { + throw new Error('Sender must be 32 bytes (64 hex characters)') + } + + // Convert receiver to Umi PublicKey + const receiverUmiPublicKey = umiPublicKey(receiver) + + // payloadHashBytes already validated and resolved + + const instruction = endpoint.oAppBurnNonce(umiWalletSigner, { + nonce: BigInt(nonce), + receiver: receiverUmiPublicKey, + sender: new Uint8Array(senderBytes), + srcEid, + payloadHash: new Uint8Array(payloadHashBytes), + }) + + const builder = new TransactionBuilder([instruction]) + const { signature } = await builder.sendAndConfirm(umi) + + console.log( + `Burn transaction successful! View here: ${getExplorerTxLink( + bs58.encode(signature), + eid === EndpointId.SOLANA_V2_TESTNET + )}` + ) + }) diff --git a/examples/oft-main/tasks/solana/endpoint/clear.ts b/examples/oft-main/tasks/solana/endpoint/clear.ts new file mode 100644 index 0000000000..cbe64dd9f0 --- /dev/null +++ b/examples/oft-main/tasks/solana/endpoint/clear.ts @@ -0,0 +1,124 @@ +import { TransactionBuilder, publicKey as umiPublicKey } from '@metaplex-foundation/umi' +import { toWeb3JsPublicKey } from '@metaplex-foundation/umi-web3js-adapters' +import bs58 from 'bs58' +import { task } from 'hardhat/config' + +import { normalizePeer } from '@layerzerolabs/devtools' +import { types as devtoolsTypes } from '@layerzerolabs/devtools-evm-hardhat' +import { EndpointId } from '@layerzerolabs/lz-definitions' +import { EndpointProgram } from '@layerzerolabs/lz-solana-sdk-v2/umi' + +import { deriveConnection, getExplorerTxLink } from '../index' + +import { getInboundNonce } from './endpointUtils' + +interface ClearTaskArgs { + eid: EndpointId // The endpoint ID for the Solana network. + sender: string // The sender address (hex format). + receiver: string // The receiver address (base58 format). + srcEid: number // The source endpoint ID. + nonce: string // The nonce. + guid: string // The GUID (hex string, 32 bytes) + message: string // The message payload (hex string) +} + +// Example: pnpm hardhat lz:oft:solana:clear --eid 40168 --sender --receiver --src-eid 40161 --nonce --guid --message +// Note: for GUID and message, you can refer to layerzeroscan.com and search via the source transaction hash to get the values +task('lz:oft:solana:clear', 'Clear a payload on Solana') + .addParam('eid', 'Solana mainnet (30168) or testnet (40168) eid', undefined, devtoolsTypes.eid) + .addParam('sender', 'The sender address (hex format)', undefined, devtoolsTypes.string) + .addParam('receiver', 'The receiver address (base58 format)', undefined, devtoolsTypes.string) + .addParam('srcEid', 'The source endpoint ID', undefined, devtoolsTypes.int) + .addParam('nonce', 'The nonce', undefined, devtoolsTypes.string) + .addParam('guid', 'The GUID (hex string, 32 bytes)', undefined, devtoolsTypes.string) + .addParam('message', 'The message payload (hex string)', undefined, devtoolsTypes.string) + .setAction(async ({ eid, sender, receiver, srcEid, nonce, guid, message }: ClearTaskArgs) => { + const { umi, connection, umiWalletSigner } = await deriveConnection(eid) + const endpoint = new EndpointProgram.Endpoint(EndpointProgram.ENDPOINT_PROGRAM_ID) + + // Convert sender from hex to bytes32 + const senderNormalized = normalizePeer(sender, srcEid) + + // Convert receiver to Umi PublicKey + const receiverUmiPublicKey = umiPublicKey(receiver) + + const inboundNonce = await getInboundNonce( + umi, + connection, + toWeb3JsPublicKey(receiverUmiPublicKey), + srcEid, + new Uint8Array(senderNormalized) + ) + console.log('inboundNonce: ', inboundNonce.toString()) + + // BOF nonce value validation + // For clear, nonce must be equal to or less than inboundNonce + if (BigInt(nonce) > inboundNonce) { + throw new Error('Nonce must be equal to or less than inboundNonce') + } + // EOF nonce value validation + + // Convert GUID from hex to bytes + const guidBytes = Buffer.from(guid.replace('0x', ''), 'hex') + if (guidBytes.length !== 32) { + throw new Error('GUID must be 32 bytes (64 hex characters)') + } + // Convert message from hex to bytes + const messageBytes = Buffer.from(message.replace('0x', ''), 'hex') + + // Derive PDAs + const [endpointPda] = endpoint.pda.setting() + const [noncePda] = endpoint.pda.nonce(receiverUmiPublicKey, srcEid, new Uint8Array(senderNormalized)) + const [oappRegistryPda] = endpoint.pda.oappRegistry(receiverUmiPublicKey) + const [payloadHashPda] = endpoint.pda.payloadHash( + receiverUmiPublicKey, + srcEid, + new Uint8Array(senderNormalized), + Number(nonce) + ) + + // Check payload hash account existence; only init if missing + const payloadAccountInfo = await umi.rpc.getAccount(payloadHashPda) + const ixns = [] as ReturnType['items'] + + if (!payloadAccountInfo.exists) { + const initVerifyIxn = endpoint.initVerify(umiWalletSigner, { + srcEid, + sender: senderNormalized, + receiver: receiverUmiPublicKey, + nonce: BigInt(nonce), + }) + ixns.push(initVerifyIxn) + } + + const clearIxn = EndpointProgram.instructions.clear( + { programs: endpoint.programRepo }, + { + signer: umiWalletSigner, + oappRegistry: oappRegistryPda, + nonce: noncePda, + payloadHash: payloadHashPda, + endpoint: endpointPda, + eventAuthority: endpoint.eventAuthority, + program: endpoint.programId, + }, + { + receiver: receiverUmiPublicKey, + srcEid, + sender: new Uint8Array(senderNormalized), + nonce: BigInt(nonce), + guid: new Uint8Array(guidBytes), + message: new Uint8Array(messageBytes), + } + ).items[0] + + const builder = new TransactionBuilder([...ixns, clearIxn]) + const { signature } = await builder.sendAndConfirm(umi) + + console.log( + `Clear transaction successful! View here: ${getExplorerTxLink( + bs58.encode(signature), + eid === EndpointId.SOLANA_V2_TESTNET + )}` + ) + }) diff --git a/examples/oft-main/tasks/solana/endpoint/endpointUtils.ts b/examples/oft-main/tasks/solana/endpoint/endpointUtils.ts new file mode 100644 index 0000000000..9177bfb8b6 --- /dev/null +++ b/examples/oft-main/tasks/solana/endpoint/endpointUtils.ts @@ -0,0 +1,71 @@ +import { arrayify, hexlify } from '@ethersproject/bytes' +import { Umi } from '@metaplex-foundation/umi' +import { fromWeb3JsPublicKey } from '@metaplex-foundation/umi-web3js-adapters' +import { Connection, PublicKey } from '@solana/web3.js' + +import { EndpointPDADeriver } from '@layerzerolabs/lz-solana-sdk-v2' +import { EndpointProgram } from '@layerzerolabs/lz-solana-sdk-v2/umi' +import { keccak256 } from '@layerzerolabs/lz-v2-utilities' + +export async function getInboundNonce( + umi: Umi, + connection: Connection, + receiver: PublicKey, + srcEid: number, + senderNormalized: Uint8Array +): Promise { + // we use EndpointPDADeriver + getAccountInfo so that we can print the expected Nonce PDA if it's not found + const epDeriver = new EndpointPDADeriver(new PublicKey(EndpointProgram.ENDPOINT_PROGRAM_ID)) + const [nonceAccount] = epDeriver.nonce(receiver, srcEid, senderNormalized) + const accountInfo = await connection.getAccountInfo(nonceAccount) + if (!accountInfo) { + throw new Error(`Nonce account not found at address ${nonceAccount.toBase58()}`) + } + const nonceAccountInfo = await EndpointProgram.accounts.fetchNonce(umi, fromWeb3JsPublicKey(nonceAccount)) + const inboundNonce = nonceAccountInfo.inboundNonce + return inboundNonce +} + +export function generatePayloadHash(guid: string, message: string): string { + // Convert to bytes + const guidBytes = arrayify(guid) + const messageBytes = arrayify(message) + + // Concatenate guid and message bytes (equivalent to Solana's hashv(&[&guid[..], &message[..]])) + const payloadBytes = new Uint8Array(guidBytes.length + messageBytes.length) + payloadBytes.set(guidBytes, 0) + payloadBytes.set(messageBytes, guidBytes.length) + + // Hash using keccak256 (equivalent to Solana's hashv) + return keccak256(hexlify(payloadBytes)) +} + +/** + * Validate inputs and resolve payload hash bytes from either: + * - payloadHash (hex string), or + * - guid + message (both hex strings) + */ +export function resolvePayloadHashBytes(payloadHash?: string, guid?: string, message?: string): Uint8Array { + const hasPayloadHash = typeof payloadHash === 'string' && payloadHash.length > 0 + const hasGuid = typeof guid === 'string' && guid.length > 0 + const hasMessage = typeof message === 'string' && message.length > 0 + + if ((hasGuid || hasMessage) && hasPayloadHash) { + throw new Error('Provide either payloadHash OR guid+message, not both') + } + if (hasGuid !== hasMessage) { + throw new Error('Both guid and message are required together') + } + if (!hasPayloadHash && !(hasGuid && hasMessage)) { + throw new Error('Provide either payloadHash or guid+message') + } + + const payloadHashHex = hasPayloadHash + ? (payloadHash as string) + : generatePayloadHash(guid as string, message as string) + const bytes = arrayify(payloadHashHex) + if (bytes.length !== 32) { + throw new Error('Payload hash must be 32 bytes (64 hex characters)') + } + return bytes +} diff --git a/examples/oft-main/tasks/solana/endpoint/nilify.ts b/examples/oft-main/tasks/solana/endpoint/nilify.ts new file mode 100644 index 0000000000..6a7feee322 --- /dev/null +++ b/examples/oft-main/tasks/solana/endpoint/nilify.ts @@ -0,0 +1,75 @@ +import { TransactionBuilder, publicKey as umiPublicKey } from '@metaplex-foundation/umi' +import bs58 from 'bs58' +import { task } from 'hardhat/config' + +import { types as devtoolsTypes } from '@layerzerolabs/devtools-evm-hardhat' +import { EndpointId } from '@layerzerolabs/lz-definitions' +import { EndpointProgram } from '@layerzerolabs/lz-solana-sdk-v2/umi' +import { addressToBytes32 } from '@layerzerolabs/lz-v2-utilities' + +import { deriveConnection, getExplorerTxLink } from '../index' + +import { resolvePayloadHashBytes } from './endpointUtils' + +interface NilifyTaskArgs { + eid: EndpointId // The endpoint ID for the Solana network. + sender: string // The sender address (hex format). + receiver: string // The receiver address (base58 format). + srcEid: number // The source endpoint ID. + nonce: string // The nonce. + payloadHash?: string // The payload hash (hex format). + guid?: string // The GUID (hex string, 32 bytes) + message?: string // The message payload (hex string) +} + +// Example: pnpm hardhat lz:oft:solana:nilify --eid 40168 --sender --receiver --src-eid 40161 --nonce --payload-hash +// or: pnpm hardhat lz:oft:solana:nilify --eid 40168 --sender --receiver --src-eid 40161 --nonce --guid --message +// Note: either provide payloadHash OR (guid + message). No overlap or partials. +// Note: for GUID and message, you can refer to layerzeroscan.com and search via the source transaction hash to get the values +// Note: to retrieve the payload hash, view/curl https://scan-testnet.layerzero-api.com/v1/messages/tx/ and search for 'payloadHash' + +task('lz:oft:solana:nilify', 'Nilify a nonce on Solana') + .addParam('eid', 'Solana mainnet (30168) or testnet (40168) eid', undefined, devtoolsTypes.eid) + .addParam('sender', 'The sender address (hex format)', undefined, devtoolsTypes.string) + .addParam('receiver', 'The receiver address (base58 format)', undefined, devtoolsTypes.string) + .addParam('srcEid', 'The source endpoint ID', undefined, devtoolsTypes.int) + .addParam('nonce', 'The nonce', undefined, devtoolsTypes.string) + .addOptionalParam('payloadHash', 'The payload hash (hex format)', undefined, devtoolsTypes.string) + .addOptionalParam('guid', 'The GUID (hex string, 32 bytes)', undefined, devtoolsTypes.string) + .addOptionalParam('message', 'The message payload (hex string)', undefined, devtoolsTypes.string) + .setAction(async ({ eid, sender, receiver, srcEid, nonce, payloadHash, guid, message }: NilifyTaskArgs) => { + const { umi, umiWalletSigner } = await deriveConnection(eid) + const endpoint = new EndpointProgram.Endpoint(EndpointProgram.ENDPOINT_PROGRAM_ID) + + // Validate inputs and resolve payload hash bytes + const payloadHashBytes = resolvePayloadHashBytes(payloadHash, guid, message) + + // Convert sender from hex to bytes32 + const senderBytes = addressToBytes32(sender) + if (senderBytes.length !== 32) { + throw new Error('Sender must be 32 bytes (64 hex characters)') + } + + // Convert receiver to Umi PublicKey + const receiverUmiPublicKey = umiPublicKey(receiver) + + // payloadHashBytes already validated and resolved + + const instruction = endpoint.oAppNilify(umiWalletSigner, { + nonce: BigInt(nonce), + receiver: receiverUmiPublicKey, + sender: new Uint8Array(senderBytes), + srcEid, + payloadHash: new Uint8Array(payloadHashBytes), + }) + + const builder = new TransactionBuilder([instruction]) + const { signature } = await builder.sendAndConfirm(umi) + + console.log( + `Nilify transaction successful! View here: ${getExplorerTxLink( + bs58.encode(signature), + eid === EndpointId.SOLANA_V2_TESTNET + )}` + ) + }) diff --git a/examples/oft-main/tasks/solana/endpoint/skip.ts b/examples/oft-main/tasks/solana/endpoint/skip.ts new file mode 100644 index 0000000000..31045992c1 --- /dev/null +++ b/examples/oft-main/tasks/solana/endpoint/skip.ts @@ -0,0 +1,82 @@ +import { TransactionBuilder, publicKey as umiPublicKey } from '@metaplex-foundation/umi' +import { toWeb3JsPublicKey } from '@metaplex-foundation/umi-web3js-adapters' +import bs58 from 'bs58' +import { task } from 'hardhat/config' + +import { normalizePeer } from '@layerzerolabs/devtools' +import { types as devtoolsTypes } from '@layerzerolabs/devtools-evm-hardhat' +import { EndpointId } from '@layerzerolabs/lz-definitions' +import { EndpointProgram } from '@layerzerolabs/lz-solana-sdk-v2/umi' + +import { deriveConnection, getExplorerTxLink } from '../index' + +import { getInboundNonce } from './endpointUtils' + +interface SkipTaskArgs { + eid: EndpointId // The endpoint ID for the Solana network. + sender: string // The sender address (hex format). + receiver: string // The receiver address (base58 format). + srcEid: number // The source endpoint ID. + nonce: string // The nonce. +} + +// Example: pnpm hardhat lz:oft:solana:skip --eid 40168 --sender --receiver --src-eid 40161 --nonce +task('lz:oft:solana:skip', 'Skip a message on Solana') + .addParam('eid', 'Solana mainnet (30168) or testnet (40168) eid', undefined, devtoolsTypes.eid) + .addParam('sender', 'The sender address (hex format)', undefined, devtoolsTypes.string) + .addParam('receiver', 'The receiver address (base58 format)', undefined, devtoolsTypes.string) + .addParam('srcEid', 'The source endpoint ID', undefined, devtoolsTypes.int) + .addParam('nonce', 'The nonce', undefined, devtoolsTypes.string) + .setAction(async ({ eid, sender, receiver, srcEid, nonce }: SkipTaskArgs) => { + const { umi, connection, umiWalletSigner } = await deriveConnection(eid) + const endpoint = new EndpointProgram.Endpoint(EndpointProgram.ENDPOINT_PROGRAM_ID) + + const senderNormalized = normalizePeer(sender, srcEid) + const receiverUmiPublicKey = umiPublicKey(receiver) // Convert receiver from string to Umi PublicKey + + const inboundNonce = await getInboundNonce( + umi, + connection, + toWeb3JsPublicKey(receiverUmiPublicKey), + srcEid, + senderNormalized + ) + // print inboundNonce + console.log('inboundNonce: ', inboundNonce.toString()) + + // BOF nonce value validation + // throw if nonce is not greater than inboundNonce + if (BigInt(nonce) <= inboundNonce) { + throw new Error('Nonce must be greater than inboundNonce') + } + // throw if nonce is greather than sliding window + const PENDING_INBOUND_NONCE_MAX_LEN = BigInt(256) + if (BigInt(nonce) > inboundNonce + PENDING_INBOUND_NONCE_MAX_LEN) { + throw new Error('Nonce must not be greater than inboundNonce + sliding window range (256)') + } + // EOF nonce value validation + + const initVerifyIxn = endpoint.initVerify(umiWalletSigner, { + srcEid, + sender: senderNormalized, + receiver: receiverUmiPublicKey, + nonce: BigInt(nonce), + }) + + const skipIxn = endpoint.skip(umiWalletSigner, { + sender: senderNormalized, + receiver: receiverUmiPublicKey, + srcEid, + nonce: BigInt(nonce), + }) + + const builder = new TransactionBuilder([initVerifyIxn, skipIxn]) + const { signature } = await builder.sendAndConfirm(umi) + + console.log( + `Skip transaction successful! View here: ${getExplorerTxLink( + bs58.encode(signature), + eid === EndpointId.SOLANA_V2_TESTNET + )}` + ) + }) diff --git a/examples/oft-main/tasks/solana/getPrioFees.ts b/examples/oft-main/tasks/solana/getPrioFees.ts new file mode 100644 index 0000000000..6a71680684 --- /dev/null +++ b/examples/oft-main/tasks/solana/getPrioFees.ts @@ -0,0 +1,32 @@ +import { task } from 'hardhat/config' + +import { types as devtoolsTypes } from '@layerzerolabs/devtools-evm-hardhat' +import { getPrioritizationFees } from '@layerzerolabs/devtools-solana' +import { EndpointId } from '@layerzerolabs/lz-definitions' + +import { deriveConnection } from './index' + +interface GetPrioFeesTaskArgs { + /** + * The endpoint ID for the Solana network. + */ + eid: EndpointId + /** + * The program ID or account address that will be written to. + */ + address: string +} + +task('lz:solana:get-priority-fees', 'Fetches prioritization fees from the Solana network') + .addParam('eid', 'The endpoint ID for the Solana network', undefined, devtoolsTypes.eid) + .addOptionalParam( + 'address', + 'The address (program ID or account address) that will be written to', + undefined, + devtoolsTypes.string + ) + .setAction(async ({ eid, address }: GetPrioFeesTaskArgs) => { + const { connection } = await deriveConnection(eid, true) + const fees = await getPrioritizationFees(connection, address) + console.log('Prioritization Fees:', fees) + }) diff --git a/examples/oft-main/tasks/solana/getRateLimits.ts b/examples/oft-main/tasks/solana/getRateLimits.ts new file mode 100644 index 0000000000..4448ad671a --- /dev/null +++ b/examples/oft-main/tasks/solana/getRateLimits.ts @@ -0,0 +1,35 @@ +import { mplToolbox } from '@metaplex-foundation/mpl-toolbox' +import { publicKey } from '@metaplex-foundation/umi' +import { createUmi } from '@metaplex-foundation/umi-bundle-defaults' +import { task } from 'hardhat/config' + +import { types } from '@layerzerolabs/devtools-evm-hardhat' +import { EndpointId } from '@layerzerolabs/lz-definitions' +import { OftPDA, accounts } from '@layerzerolabs/oft-v2-solana-sdk' + +import { createSolanaConnectionFactory } from '../common/utils' + +interface Args { + mint: string + eid: EndpointId + dstEid: EndpointId + programId: string + oftStore: string +} + +task('lz:oft:solana:get-rate-limits', 'Gets the Solana inbound / outbound rate limits') + .addParam('mint', 'The OFT token mint public key') + .addParam('programId', 'The OFT Program id') + .addParam('eid', 'Solana mainnet (30168) or testnet (40168)', undefined, types.eid) + .addParam('dstEid', 'The destination endpoint ID', undefined, types.eid) + .addParam('oftStore', 'The OFTStore account') + .setAction(async (taskArgs: Args, _) => { + const connectionFactory = createSolanaConnectionFactory() + const connection = await connectionFactory(taskArgs.eid) + const umi = createUmi(connection.rpcEndpoint).use(mplToolbox()) + + const [peer] = new OftPDA(publicKey(taskArgs.programId)).peer(publicKey(taskArgs.oftStore), taskArgs.dstEid) + const peerInfo = await accounts.fetchPeerConfig({ rpc: umi.rpc }, peer) + console.log(`Peer info between ${taskArgs.eid} and ${taskArgs.dstEid}`) + console.dir({ peerInfo }, { depth: null }) + }) diff --git a/examples/oft-main/tasks/solana/index.ts b/examples/oft-main/tasks/solana/index.ts new file mode 100644 index 0000000000..996087bad0 --- /dev/null +++ b/examples/oft-main/tasks/solana/index.ts @@ -0,0 +1,340 @@ +import assert from 'assert' +import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs' +import path from 'node:path' + +import { + fetchAddressLookupTable, + mplToolbox, + setComputeUnitLimit, + setComputeUnitPrice, +} from '@metaplex-foundation/mpl-toolbox' +import { + AddressLookupTableInput, + EddsaInterface, + Instruction, + KeypairSigner, + PublicKey, + TransactionBuilder, + Umi, + createNoopSigner, + createSignerFromKeypair, + publicKey, + signerIdentity, + transactionBuilder, +} from '@metaplex-foundation/umi' +import { createUmi } from '@metaplex-foundation/umi-bundle-defaults' +import { createWeb3JsEddsa } from '@metaplex-foundation/umi-eddsa-web3js' +import { toWeb3JsInstruction, toWeb3JsPublicKey } from '@metaplex-foundation/umi-web3js-adapters' +import { AddressLookupTableAccount, Connection } from '@solana/web3.js' +import { getSimulationComputeUnits } from '@solana-developers/helpers' +import { backOff } from 'exponential-backoff' + +import { formatEid } from '@layerzerolabs/devtools' +import { getPrioritizationFees, getSolanaKeypair } from '@layerzerolabs/devtools-solana' +import { promptToContinue } from '@layerzerolabs/io-devtools' +import { EndpointId, endpointIdToNetwork } from '@layerzerolabs/lz-definitions' +import { OftPDA } from '@layerzerolabs/oft-v2-solana-sdk' + +import { DebugLogger, KnownWarnings, createSolanaConnectionFactory } from '../common/utils' + +export const DEFAULT_LOOKUP_TABLE_ADDRESS: Partial> = { + [EndpointId.SOLANA_V2_MAINNET]: publicKey('AokBxha6VMLLgf97B5VYHEtqztamWmYERBmmFvjuTzJB'), + [EndpointId.SOLANA_V2_TESTNET]: publicKey('9thqPdbR27A1yLWw2spwJLySemiGMXxPnEvfmXVk4KuK'), +} + +type DeriveConnectionParams = + | boolean + | { + readOnly?: boolean + noopSigner?: PublicKey + } +/** + * Derive common connection and UMI objects for a given endpoint ID. + * @param eid {EndpointId} + */ +export const deriveConnection = async (eid: EndpointId, params: DeriveConnectionParams = false) => { + // line below is for backwards compatibility (second param was initially only readOnly, updated to an object) + const { readOnly = false, noopSigner } = typeof params === 'object' ? params : { readOnly: params } + const keypair = await getSolanaKeypair(readOnly) + const connectionFactory = createSolanaConnectionFactory() + const connection = await connectionFactory(eid) + const umi = createUmi(connection.rpcEndpoint).use(mplToolbox()) + const umiWalletKeyPair = umi.eddsa.createKeypairFromSecretKey(keypair.secretKey) + const umiWalletSigner = noopSigner ? createNoopSigner(noopSigner) : createSignerFromKeypair(umi, umiWalletKeyPair) + umi.use(signerIdentity(umiWalletSigner)) + return { + connection, + umi, + umiWalletKeyPair, + umiWalletSigner, + } +} + +export const useWeb3Js = async () => { + // note: if we are okay with exporting getSolanaKeypair, then useWeb3js can be removed + const keypair = await getSolanaKeypair() + return { + web3JsKeypair: keypair, + } +} + +/** + * Derive the keys needed for the OFT program. + * @param programIdStr {string} + */ +export const deriveKeys = (programIdStr: string) => { + const programId = publicKey(programIdStr) + const eddsa: EddsaInterface = createWeb3JsEddsa() + const oftDeriver = new OftPDA(programId) + const lockBox = eddsa.generateKeypair() + const escrowPK = lockBox.publicKey + const [oftStorePda] = oftDeriver.oftStore(escrowPK) + return { + programId, + lockBox, + escrowPK, + oftStorePda, + eddsa, + } +} + +/** + * Outputs the OFT accounts to a JSON file. + * @param eid {EndpointId} + * @param programId {string} + * @param mint {string} + * @param mintAuthority {string} + * @param escrow {string} + * @param oftStore {string} + */ +export const saveSolanaDeployment = ( + eid: EndpointId, + programId: string, + mint: string, + mintAuthority: string, + escrow: string, + oftStore: string +) => { + const outputDir = `./deployments/${endpointIdToNetwork(eid)}` + if (!existsSync(outputDir)) { + mkdirSync(outputDir, { recursive: true }) + } + writeFileSync( + `${outputDir}/OFT.json`, + JSON.stringify( + { + programId, + mint, + mintAuthority, + escrow, + oftStore, + }, + null, + 4 + ) + ) + console.log(`Accounts have been saved to ${outputDir}/OFT.json`) +} + +/** + * Reads the OFT deployment info from disk for the given endpoint ID. + * @param eid {EndpointId} + * @returns The contents of the OFT.json file as a JSON object. + */ +export const getSolanaDeployment = ( + eid: EndpointId +): { + programId: string + mint: string + mintAuthority: string + escrow: string + oftStore: string +} => { + if (!eid) { + throw new Error('eid is required') + } + const outputDir = path.join('deployments', endpointIdToNetwork(eid)) + const filePath = path.join(outputDir, 'OFT.json') // Note: if you have multiple deployments, change this filename to refer to the desired deployment file + + if (!existsSync(filePath)) { + DebugLogger.printWarning(KnownWarnings.SOLANA_DEPLOYMENT_NOT_FOUND) + throw new Error(`Could not find Solana deployment file for eid ${eid} at: ${filePath}`) + } + + const fileContents = readFileSync(filePath, 'utf-8') + return JSON.parse(fileContents) +} + +/** + * Safely load the OFT store PDA for a given Solana endpoint. + * Logs a warning if the deployment file is missing or malformed, + * and returns null so consumers can decide how to proceed. + */ +export const getOftStoreAddress = (eid: EndpointId): string | null => { + try { + const { oftStore } = getSolanaDeployment(eid) + if (!oftStore) { + DebugLogger.printWarning( + KnownWarnings.SOLANA_DEPLOYMENT_MISSING_OFT_STORE, + `deployment file for ${endpointIdToNetwork(eid)} (eid ${eid}) missing 'oftStore' field.` + ) + return null + } + return oftStore + } catch (err: any) { + DebugLogger.printWarning( + KnownWarnings.ERROR_LOADING_SOLANA_DEPLOYMENT, + `Could not load Solana deployment for ${endpointIdToNetwork(eid)} (eid ${eid}): ${err.message}` + ) + return null + } +} + +// TODO: move below outside of solana folder since it's generic +export const getLayerZeroScanLink = (hash: string, isTestnet = false) => + isTestnet ? `https://testnet.layerzeroscan.com/tx/${hash}` : `https://layerzeroscan.com/tx/${hash}` + +export const getExplorerTxLink = (hash: string, isTestnet = false) => + `https://solscan.io/tx/${hash}?cluster=${isTestnet ? 'devnet' : 'mainnet-beta'}` + +const getAddressLookupTable = async (_lookupTableAddress: string | PublicKey, connection: Connection, umi: Umi) => { + const lookupTableAddress = publicKey(_lookupTableAddress) + const addressLookupTableInput: AddressLookupTableInput = await fetchAddressLookupTable(umi, lookupTableAddress) + if (!addressLookupTableInput) { + throw new Error(`No address lookup table found for ${lookupTableAddress}`) + } + const { value: lookupTableAccount } = await connection.getAddressLookupTable(toWeb3JsPublicKey(lookupTableAddress)) + if (!lookupTableAccount) { + throw new Error(`No address lookup table account found for ${lookupTableAddress}`) + } + return { lookupTableAddress, addressLookupTableInput, lookupTableAccount } +} + +export const getDefaultAddressLookupTable = async (connection: Connection, umi: Umi, fromEid: EndpointId) => { + // Lookup Table Address and Priority Fee Calculation + const lookupTableAddress = DEFAULT_LOOKUP_TABLE_ADDRESS[fromEid] + assert(lookupTableAddress != null, `No lookup table found for ${formatEid(fromEid)}`) + return getAddressLookupTable(lookupTableAddress, connection, umi) +} + +export enum TransactionType { + CreateToken = 'CreateToken', + CreateMultisig = 'CreateMultisig', + InitOft = 'InitOft', + SetAuthority = 'SetAuthority', + InitConfig = 'InitConfig', + SendOFT = 'SendOFT', +} + +const TransactionCuEstimates: Record = { + // for the sample values, they are: devnet, mainnet + [TransactionType.CreateToken]: 125_000, // actual sample: (59073, 123539), 55785 (more volatile as it has CPI to Metaplex) + [TransactionType.CreateMultisig]: 5_000, // actual sample: 3,230 + [TransactionType.InitOft]: 70_000, // actual sample: 59207, 65198 (note: this is the only transaction that createOFTAdapter does) + [TransactionType.SetAuthority]: 8_000, // actual sample: 6424, 6472 + [TransactionType.InitConfig]: 42_000, // actual sample: 33157, 40657 + [TransactionType.SendOFT]: 230_000, // actual sample: 217,784 +} + +export const getComputeUnitPriceAndLimit = async ( + connection: Connection, + ixs: Instruction[], + wallet: KeypairSigner, + lookupTableAccounts: AddressLookupTableAccount | AddressLookupTableAccount[], + transactionType: TransactionType +) => { + const { averageFeeExcludingZeros } = await getPrioritizationFees(connection) + const priorityFee = Math.round(averageFeeExcludingZeros) + const computeUnitPrice = BigInt(priorityFee) + + let computeUnits + + try { + computeUnits = await backOff( + () => + getSimulationComputeUnits( + connection, + ixs.map((ix) => toWeb3JsInstruction(ix)), + toWeb3JsPublicKey(wallet.publicKey), + Array.isArray(lookupTableAccounts) ? lookupTableAccounts : [lookupTableAccounts] + ), + { + maxDelay: 10000, + numOfAttempts: 3, + } + ) + } catch (e) { + console.error(`Error retrieving simulations compute units from RPC:`, e) + const continueByUsingHardcodedEstimate = await promptToContinue( + 'Failed to call simulateTransaction on the RPC. This can happen when the network is congested. Would you like to use hardcoded estimates (TransactionCuEstimates) ? This may result in slightly overpaying for the transaction.' + ) + if (!continueByUsingHardcodedEstimate) { + throw new Error( + 'Failed to call simulateTransaction on the RPC and user chose to not continue with hardcoded estimate.' + ) + } + console.log( + `Falling back to hardcoded estimate for ${transactionType}: ${TransactionCuEstimates[transactionType]} CUs` + ) + computeUnits = TransactionCuEstimates[transactionType] + } + + if (!computeUnits) { + throw new Error('Unable to compute units') + } + + return { + computeUnitPrice, + computeUnits, + } +} + +export const addComputeUnitInstructions = async ( + connection: Connection, + umi: Umi, + eid: EndpointId, + txBuilder: TransactionBuilder, + umiWalletSigner: KeypairSigner, + computeUnitPriceScaleFactor: number, + transactionType: TransactionType, + addressLookupTables?: (string | PublicKey)[] +) => { + const computeUnitLimitScaleFactor = 1.1 // hardcoded to 1.1 as the estimations are not perfect and can fall slightly short of the actual CU usage on-chain + + const addressLookupTableInputs: AddressLookupTableInput[] = [] + const lookupTableAccounts: AddressLookupTableAccount[] = [] + + if (addressLookupTables) { + const lookupTableResults = await Promise.all( + addressLookupTables.map((lookupTable) => getAddressLookupTable(lookupTable, connection, umi)) + ) + for (const { addressLookupTableInput, lookupTableAccount } of lookupTableResults) { + addressLookupTableInputs.push(addressLookupTableInput) + lookupTableAccounts.push(lookupTableAccount) + } + } else { + const { addressLookupTableInput, lookupTableAccount } = await getDefaultAddressLookupTable(connection, umi, eid) + addressLookupTableInputs.push(addressLookupTableInput) + lookupTableAccounts.push(lookupTableAccount) + } + + const { computeUnitPrice, computeUnits } = await getComputeUnitPriceAndLimit( + connection, + txBuilder.getInstructions(), + umiWalletSigner, + lookupTableAccounts, + transactionType + ) + // Since transaction builders are immutable, we must be careful to always assign the result of the add and prepend + // methods to a new variable. + const newTxBuilder = transactionBuilder() + .add( + setComputeUnitPrice(umi, { + microLamports: computeUnitPrice * BigInt(Math.floor(computeUnitPriceScaleFactor)), + }) + ) + .add(setComputeUnitLimit(umi, { units: computeUnits * computeUnitLimitScaleFactor })) + .setAddressLookupTables(addressLookupTableInputs) + .add(txBuilder) + return newTxBuilder +} diff --git a/examples/oft-main/tasks/solana/initConfig.ts b/examples/oft-main/tasks/solana/initConfig.ts new file mode 100644 index 0000000000..202d18a367 --- /dev/null +++ b/examples/oft-main/tasks/solana/initConfig.ts @@ -0,0 +1,31 @@ +import { PublicKey } from '@solana/web3.js' +import { ConfigurableTaskDefinition } from 'hardhat/types' + +import { inheritTask } from '@layerzerolabs/devtools-evm-hardhat' +import { type LogLevel } from '@layerzerolabs/io-devtools' +import { type OAppConfigurator } from '@layerzerolabs/ua-devtools' +import { TASK_LZ_OAPP_WIRE } from '@layerzerolabs/ua-devtools-evm-hardhat' +import { initOFTAccounts } from '@layerzerolabs/ua-devtools-solana' + +// We'll create clones of the wire task and only override the configurator argument +const wireLikeTask = inheritTask(TASK_LZ_OAPP_WIRE) + +// TODO: export from wire.ts instead of re-declaring +/** + * Additional CLI arguments for our custom wire task + */ +interface Args { + logLevel: LogLevel + multisigKey?: PublicKey + internalConfigurator?: OAppConfigurator +} + +// This task will use the `initOFTAccounts` configurator that initializes the Solana accounts +const initConfigTask = wireLikeTask('lz:oft:solana:init-config') as ConfigurableTaskDefinition + +// TODO: currently the message for 'already done' state is "OApp is already wired." which is misleading -> should be changed to "Pathway Config already initialized" +initConfigTask + .setDescription('Initialize OFT accounts for Solana') + .setAction(async (args: Args, hre) => + hre.run(TASK_LZ_OAPP_WIRE, { ...args, internalConfigurator: initOFTAccounts, isSolanaInitConfig: true }) + ) diff --git a/examples/oft-main/tasks/solana/multisig.ts b/examples/oft-main/tasks/solana/multisig.ts new file mode 100644 index 0000000000..24533ab3d7 --- /dev/null +++ b/examples/oft-main/tasks/solana/multisig.ts @@ -0,0 +1,161 @@ +import { createAccount } from '@metaplex-foundation/mpl-toolbox' +import { + KeypairSigner, + Umi, + createSignerFromKeypair, + transactionBuilder, + publicKey as umiPublicKey, +} from '@metaplex-foundation/umi' +import { fromWeb3JsInstruction, toWeb3JsPublicKey } from '@metaplex-foundation/umi-web3js-adapters' +import { + MULTISIG_SIZE, + TOKEN_2022_PROGRAM_ID, + TOKEN_PROGRAM_ID, + createInitializeMultisigInstruction, +} from '@solana/spl-token' +import { Connection, PublicKey } from '@solana/web3.js' +import bs58 from 'bs58' + +import { assertAccountInitialized } from '@layerzerolabs/devtools-solana' +import { EndpointId } from '@layerzerolabs/lz-definitions' + +import { TransactionType, addComputeUnitInstructions, getExplorerTxLink } from '.' + +export async function createMultisig( + connection: Connection, + umi: Umi, + eid: EndpointId, + umiWalletSigner: KeypairSigner, + signers: PublicKey[], + m: number, + keypair = umi.eddsa.generateKeypair(), + programId = TOKEN_PROGRAM_ID, + computeUnitPriceScaleFactor?: number +): Promise { + const initMultisigIx = createInitializeMultisigInstruction( + toWeb3JsPublicKey(keypair.publicKey), + signers, + m, + programId + ) + + let txBuilder = transactionBuilder() + .add( + createAccount(umi, { + newAccount: createSignerFromKeypair(umi, keypair), + lamports: await umi.rpc.getRent(MULTISIG_SIZE), + space: MULTISIG_SIZE, + programId: umiPublicKey(programId.toBase58()), + }) + ) + .add({ + instruction: fromWeb3JsInstruction(initMultisigIx), + signers: [], + bytesCreatedOnChain: 0, + }) + + if (computeUnitPriceScaleFactor) { + txBuilder = await addComputeUnitInstructions( + connection, + umi, + eid, + txBuilder, + umiWalletSigner, + computeUnitPriceScaleFactor, + TransactionType.CreateMultisig + ) + } + + const multisigPublicKey = toWeb3JsPublicKey(keypair.publicKey) + + const tx = await txBuilder.sendAndConfirm(umi) + await assertAccountInitialized(connection, multisigPublicKey) + const isTestnet = eid == EndpointId.SOLANA_V2_TESTNET + console.log(`createMultisigTx: ${getExplorerTxLink(bs58.encode(tx.signature), isTestnet)}`) + + return multisigPublicKey +} + +/** + * Creates a (1/N) multisig account for use as the mint authority. + * @param connection {Connection} + * @param payer {Signer} + * @param oftStorePda {PublicKey} will be included as a signer + * @param tokenProgramId {PublicKey} defaults to SPL token program ID + * @param additionalSigners {PublicKey[]} the additionalSigners for the multisig account + */ +export const createMintAuthorityMultisig = async ( + connection: Connection, + umi: Umi, + eid: EndpointId, + umiWalletSigner: KeypairSigner, + oftStorePda: PublicKey, + tokenProgramId: PublicKey = TOKEN_PROGRAM_ID, + additionalSigners: PublicKey[], + computeUnitPriceScaleFactor: number +) => { + return createMultisig( + connection, + umi, + eid, + umiWalletSigner, + [oftStorePda, ...additionalSigners], + 1, // quorum 1/N + undefined, + tokenProgramId, + computeUnitPriceScaleFactor + ) +} + +/** + * Decode the signers of a multisig account and check if the expected signers + * are present and the quorum is 1/N. + * @param connection {Connection} + * @param multisigAddress {PublicKey} + * @param expectedSigners {PublicKey[]} the expected signers + */ +export const checkMultisigSigners = async ( + connection: Connection, + multisigAddress: PublicKey, + expectedSigners: PublicKey[] +) => { + const accountInfo = await assertAccountInitialized(connection, multisigAddress) + + if (!accountInfo.owner.equals(TOKEN_PROGRAM_ID) && !accountInfo.owner.equals(TOKEN_2022_PROGRAM_ID)) { + throw new Error('Provided address is not an SPL Token multisig account') + } + + // Multisig accounts have a specific layout based on the Multisig interface: + const data = accountInfo.data + + // Extract the number of required signers (m) and total possible signers (n) + const numRequiredSigners = data[0] + const numTotalSigners = data[1] + + if (numRequiredSigners !== 1) { + throw new Error('Multisig account must have 1 required signer') + } + + // Initialize an array to hold the signers + const signers: PublicKey[] = [] + + // Extract each signer public key based on the Multisig interface + const signerOffset = 3 // Offset to the first signer in the data + const signerSize = 32 // Each signer address is 32 bytes + + for (let i = 0; i < numTotalSigners; i++) { + const start = signerOffset + i * signerSize + const end = start + signerSize + const signerPublicKey = new PublicKey(data.slice(start, end)) + if (!signerPublicKey.equals(PublicKey.default)) { + signers.push(signerPublicKey) + } + } + + for (const signer of expectedSigners) { + if (!signers.find((s) => s.toBase58() == signer.toBase58())) { + throw new Error(`Signer ${signer.toBase58()} not found in multisig account`) + } + } + return signers +} diff --git a/examples/oft-main/tasks/solana/retryMessage.ts b/examples/oft-main/tasks/solana/retryMessage.ts new file mode 100644 index 0000000000..f18a96e3ea --- /dev/null +++ b/examples/oft-main/tasks/solana/retryMessage.ts @@ -0,0 +1,92 @@ +import { web3 } from '@coral-xyz/anchor' +import { toWeb3JsKeypair } from '@metaplex-foundation/umi-web3js-adapters' +import { ComputeBudgetProgram, sendAndConfirmTransaction } from '@solana/web3.js' +import { task } from 'hardhat/config' + +import { makeBytes32 } from '@layerzerolabs/devtools' +import { types } from '@layerzerolabs/devtools-evm-hardhat' +import { EndpointId } from '@layerzerolabs/lz-definitions' +import { lzReceive } from '@layerzerolabs/lz-solana-sdk-v2' + +import { deriveConnection, getExplorerTxLink } from './index' + +interface Args { + srcEid: EndpointId + nonce: bigint + sender: string + dstEid: EndpointId + receiver: string + guid: string + message: string + withComputeUnitLimit: number + lamports: number + withComputeUnitPrice: number +} + +// Run: npx hardhat lz:oft:solana:retry-message --src-eid --nonce --sender --dst-eid --receiver --guid --message --with-compute-unit-limit --lamports --with-compute-unit-price +task('lz:oft:solana:retry-message', 'Retry a stored message on Solana') + .addParam('srcEid', 'The source EndpointId', undefined, types.eid) + .addParam('nonce', 'The nonce of the message', undefined, types.bigint) + .addParam('sender', 'The source OApp address (hex)', undefined, types.string) + .addParam('dstEid', 'The destination EndpointId (Solana chain)', undefined, types.eid) + .addParam('receiver', 'The receiver address on the destination Solana chain (bytes58)', undefined, types.string) + .addParam('guid', 'The GUID of the message (hex)', undefined, types.string) + .addParam('message', 'The message data in hex format', undefined, types.string) + .addParam('lamports', 'The lamports for the lzReceive instruction', undefined, types.int) + .addParam('withComputeUnitLimit', 'The CU for the lzReceive instruction', undefined, types.int) + .addParam('withComputeUnitPrice', 'The priority fee in microLamports', undefined, types.int) + .setAction( + async ({ + srcEid, + nonce, + sender, + dstEid, + receiver, + guid, + message, + lamports, + withComputeUnitLimit, + withComputeUnitPrice, + }: Args) => { + const { connection, umiWalletKeyPair } = await deriveConnection(dstEid) + const signer = toWeb3JsKeypair(umiWalletKeyPair) + const { blockhash, lastValidBlockHeight } = await connection.getLatestBlockhash() + const tx = new web3.Transaction({ + feePayer: signer.publicKey, + blockhash, + lastValidBlockHeight, + }) + + const instruction = await lzReceive( + connection, + signer.publicKey, + { + nonce: nonce.toString(), + srcEid, + sender: makeBytes32(sender), + receiver, + guid, + message, + }, + Uint8Array.from([withComputeUnitLimit, lamports]), + 'confirmed' + ) + + if (withComputeUnitPrice) { + tx.add( + ComputeBudgetProgram.setComputeUnitPrice({ + microLamports: withComputeUnitPrice, + }) + ) + } + tx.add(instruction) + tx.recentBlockhash = blockhash + + tx.sign(signer) + + const signature = await sendAndConfirmTransaction(connection, tx, [signer]) + console.log( + `View Solana transaction here: ${getExplorerTxLink(signature.toString(), dstEid == EndpointId.SOLANA_V2_TESTNET)}` + ) + } + ) diff --git a/examples/oft-main/tasks/solana/sendSolana.ts b/examples/oft-main/tasks/solana/sendSolana.ts new file mode 100644 index 0000000000..4f763330b3 --- /dev/null +++ b/examples/oft-main/tasks/solana/sendSolana.ts @@ -0,0 +1,196 @@ +import { fetchMint, fetchToken, findAssociatedTokenPda } from '@metaplex-foundation/mpl-toolbox' +import { publicKey, transactionBuilder } from '@metaplex-foundation/umi' +import { fromWeb3JsPublicKey } from '@metaplex-foundation/umi-web3js-adapters' +import { TOKEN_PROGRAM_ID } from '@solana/spl-token' +import { PublicKey } from '@solana/web3.js' +import bs58 from 'bs58' + +import { createLogger, promptToContinue } from '@layerzerolabs/io-devtools' +import { EndpointId, endpointIdToNetwork } from '@layerzerolabs/lz-definitions' +import { addressToBytes32 } from '@layerzerolabs/lz-v2-utilities' +import { oft } from '@layerzerolabs/oft-v2-solana-sdk' + +import { SendResult } from '../common/types' +import { DebugLogger, KnownErrors, isEmptyOptionsSolana } from '../common/utils' + +import { parseDecimalToUnits, silenceSolana429 } from './utils' + +import { + TransactionType, + addComputeUnitInstructions, + deriveConnection, + getDefaultAddressLookupTable, + getLayerZeroScanLink, + getSolanaDeployment, +} from './index' + +const logger = createLogger() + +export interface SolanaArgs { + amount: string + to: string + srcEid: EndpointId + dstEid: EndpointId + minAmount?: string + extraOptions?: string + composeMsg?: string + oftAddress?: string + oftProgramId?: string + tokenProgram?: string + computeUnitPriceScaleFactor?: number + addressLookupTables?: string[] +} + +export async function sendSolana({ + amount, + to, + srcEid, + dstEid, + oftAddress, + oftProgramId, + tokenProgram: tokenProgramStr, + computeUnitPriceScaleFactor = 4, + minAmount, + extraOptions, + composeMsg, + addressLookupTables, +}: SolanaArgs): Promise { + // 1️⃣ RPC + UMI + const { connection, umi, umiWalletSigner } = await deriveConnection(srcEid) + silenceSolana429(connection) + // 2️⃣ Pick your OFT program ID (override or from deployment) + const programId = oftProgramId + ? publicKey(oftProgramId) + : publicKey( + (() => { + try { + return getSolanaDeployment(srcEid).programId + } catch (error) { + logger.error(`No Program ID found for ${srcEid}: ${error}`) + throw error + } + })() + ) + + // 3️⃣ Decide your store PDA (override or from your on‐disk deployment) + const storePda = oftAddress ? publicKey(oftAddress) : publicKey(getSolanaDeployment(srcEid).oftStore) + const oftStoreInfo = await oft.accounts.fetchOFTStore(umi, storePda) + const mintPk = new PublicKey(oftStoreInfo.tokenMint) + const escrowPk = new PublicKey(oftStoreInfo.tokenEscrow) + + // 4️⃣ Attach token account & check balance + const tokenProgramId = tokenProgramStr ? publicKey(tokenProgramStr) : fromWeb3JsPublicKey(TOKEN_PROGRAM_ID) + const tokenAccount = findAssociatedTokenPda(umi, { + mint: fromWeb3JsPublicKey(mintPk), + owner: umiWalletSigner.publicKey, + tokenProgramId, + }) + if (!tokenAccount) throw new Error(`No token account for mint ${mintPk}`) + const balance = (await fetchToken(umi, tokenAccount)).amount + + // 5️⃣ Normalize human→base units + const decimals = (await fetchMint(umi, fromWeb3JsPublicKey(mintPk))).decimals + const amountUnits = parseDecimalToUnits(amount, decimals) + if (amountUnits === 0n || amountUnits > balance) { + throw new Error(`Insufficient balance (need ${amountUnits}, have ${balance})`) + } + + // Check whether there are extra options or enforced options. If not, warn the user. + // Read on Message Options: https://docs.layerzero.network/v2/concepts/message-options + if (!extraOptions) { + try { + const enforcedOptionsMap = await oft.getEnforcedOptions(umi.rpc, storePda, dstEid, programId) + const enforcedOptionsBuffer = composeMsg ? enforcedOptionsMap.sendAndCall : enforcedOptionsMap.send + + if (isEmptyOptionsSolana(enforcedOptionsBuffer)) { + const proceed = await promptToContinue( + 'No extra options were included and OFT has no set enforced options. Your quote / send will most likely fail. Continue?' + ) + if (!proceed) { + throw new Error('Aborted due to missing options') + } + } + } catch (error) { + logger.debug(`Failed to check enforced options: ${error}`) + } + } + + // 6️⃣ Lookup table addresses + const lookupTableAddresses = + addressLookupTables && addressLookupTables.length > 0 + ? addressLookupTables.map((addr) => publicKey(addr)) + : [(await getDefaultAddressLookupTable(connection, umi, srcEid)).lookupTableAddress] + + // 7️⃣ Quote (use our overridden `programId`) + logger.info('Quoting the native gas cost for the send transaction...') + const sendParam = { + dstEid, + to: Buffer.from(addressToBytes32(to)), + amountLd: amountUnits, + minAmountLd: minAmount ? parseDecimalToUnits(minAmount, decimals) : amountUnits, + options: extraOptions ? Buffer.from(extraOptions.replace(/^0x/, ''), 'hex') : undefined, + composeMsg: composeMsg ? Buffer.from(composeMsg.replace(/^0x/, ''), 'hex') : undefined, + } + const { nativeFee } = await oft.quote( + umi.rpc, + { + payer: umiWalletSigner.publicKey, + tokenMint: fromWeb3JsPublicKey(mintPk), + tokenEscrow: fromWeb3JsPublicKey(escrowPk), + }, + { + payInLzToken: false, + ...sendParam, + }, + { oft: programId }, // ← use override + [], + lookupTableAddresses + ) + + // 8️⃣ Send (again passing `programId`) + logger.info('Sending the transaction...') + const ix = await oft.send( + umi.rpc, + { + payer: umiWalletSigner, + tokenMint: fromWeb3JsPublicKey(mintPk), + tokenEscrow: fromWeb3JsPublicKey(escrowPk), + tokenSource: tokenAccount[0], + }, + { + nativeFee, + ...sendParam, + }, + { oft: programId, token: tokenProgramId } // ← use override + ) + + // 9️⃣ Compute units & submit + let txB = transactionBuilder().add([ix]) + txB = await addComputeUnitInstructions( + connection, + umi, + srcEid, + txB, + umiWalletSigner, + computeUnitPriceScaleFactor, + TransactionType.SendOFT, + lookupTableAddresses + ) + let txHash: string + try { + const { signature } = await txB.sendAndConfirm(umi) + txHash = bs58.encode(signature) + } catch (error) { + DebugLogger.printErrorAndFixSuggestion( + KnownErrors.ERROR_QUOTING_NATIVE_GAS_COST, + `For network: ${endpointIdToNetwork(srcEid)}, OFT: ${oftAddress}` + ) + throw error + } + + const isTestnet = srcEid === EndpointId.SOLANA_V2_TESTNET + + const scanLink = getLayerZeroScanLink(txHash, isTestnet) + + return { txHash, scanLink } +} diff --git a/examples/oft-main/tasks/solana/setAuthority.ts b/examples/oft-main/tasks/solana/setAuthority.ts new file mode 100644 index 0000000000..56d8b84070 --- /dev/null +++ b/examples/oft-main/tasks/solana/setAuthority.ts @@ -0,0 +1,206 @@ +import { AccountMeta, publicKey, transactionBuilder } from '@metaplex-foundation/umi' +import { fromWeb3JsPublicKey, toWeb3JsKeypair, toWeb3JsPublicKey } from '@metaplex-foundation/umi-web3js-adapters' +import { AuthorityType, TOKEN_PROGRAM_ID, createSetAuthorityInstruction, getMint } from '@solana/spl-token' +import { PublicKey } from '@solana/web3.js' +import bs58 from 'bs58' +import { task } from 'hardhat/config' + +import { types as devtoolsTypes } from '@layerzerolabs/devtools-evm-hardhat' +import { EndpointId } from '@layerzerolabs/lz-definitions' +import { OftPDA } from '@layerzerolabs/oft-v2-solana-sdk' + +import { checkMultisigSigners, createMintAuthorityMultisig } from './multisig' + +import { TransactionType, addComputeUnitInstructions, deriveConnection, getExplorerTxLink } from './index' + +interface SetAuthorityTaskArgs { + /** + * The endpoint ID for the Solana network. + */ + eid: EndpointId + + /** + * The escrow public key. + */ + escrow: string + + /** + * The token mint ID, for Mint-And-Burn-Adapter only. + */ + mint: string + + /** + * The program ID for the OFT program. + */ + programId: string + + /** + * The CSV list of additional minters. + */ + additionalMinters?: string[] + + /** + * The token program ID, for Mint-And-Burn-Adapter only. + */ + tokenProgram: string + + /** + * 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 for everything but the OFTStore. You should really be intentional about + * using this flag, as it is not reversible. + */ + onlyOftStore: boolean + + computeUnitPriceScaleFactor: number +} + +/** + * Derive the OFT Store account for a given program and escrow. + * @param programId {string} + * @param escrow {string} + */ +const getOftStore = (programId: string, escrow: string) => { + const oftDeriver = new OftPDA(publicKey(programId)) + const escrowPK = publicKey(escrow) + const [oftStorePda] = oftDeriver.oftStore(escrowPK) + return oftStorePda +} + +/** + * Get the string representation of the authority type. + * @param authorityType {AuthorityType} + */ +const getAuthorityTypeString = (authorityType: AuthorityType) => { + switch (authorityType) { + case AuthorityType.MintTokens: + return 'MintTokens' + case AuthorityType.FreezeAccount: + return 'FreezeAccount' + default: + throw Error(`Unknown authority type: ${authorityType}`) + } +} + +// Define a Hardhat task for creating and setting a new Mint/Freeze Authority +// for OFT on Solana +// * Create SPL Multisig account for mint authority +// * Sanity check the new Multisig account +// * Set Mint Authority +// * Set Freeze Authority +// Note: Only supports SPL Token Standard. +task('lz:oft:solana:setauthority', 'Create a new Mint Authority SPL multisig and set the mint/freeze authority') + .addParam('eid', 'Solana mainnet (30168) or testnet (40168) eid', undefined, devtoolsTypes.eid) + .addParam('mint', 'The Token Mint public key') + .addParam('programId', 'The OFT Program id') + .addParam('escrow', 'The OFT Escrow public key') + .addParam('additionalMinters', 'Comma-separated list of additional minters', undefined, devtoolsTypes.csv, true) + .addOptionalParam( + 'onlyOftStore', + '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.', + false, + devtoolsTypes.boolean + ) + .addParam( + 'tokenProgram', + 'The Token Program public key (used for MABA only)', + TOKEN_PROGRAM_ID.toBase58(), + devtoolsTypes.string + ) + .addParam('computeUnitPriceScaleFactor', 'The compute unit price scale factor', 4, devtoolsTypes.float, true) + .setAction( + async ({ + eid, + escrow: escrowStr, + mint: mintStr, + programId: programIdStr, + tokenProgram: tokenProgramStr, + additionalMinters: additionalMintersAsStrings, + onlyOftStore, + computeUnitPriceScaleFactor, + }: SetAuthorityTaskArgs) => { + const { connection, umi, umiWalletKeyPair, umiWalletSigner } = await deriveConnection(eid) + const oftStorePda = getOftStore(programIdStr, escrowStr) + const tokenProgram = publicKey(tokenProgramStr) + if (!additionalMintersAsStrings) { + if (!onlyOftStore) { + throw new Error( + 'If you want to proceed with only the OFTStore, please specify --only-oft-store true' + ) + } + console.log( + 'No additional minters specified. This will result in only the OFTStore being able to mint new tokens.' + ) + } + const additionalMinters = additionalMintersAsStrings?.map((minter) => new PublicKey(minter)) ?? [] + const mint = new PublicKey(mintStr) + const newMintAuthority = await createMintAuthorityMultisig( + connection, + umi, + eid, + umiWalletSigner, + new PublicKey(oftStorePda.toString()), + new PublicKey(tokenProgram.toString()), + additionalMinters, + computeUnitPriceScaleFactor + ) + console.log(`New Mint Authority: ${newMintAuthority.toBase58()}`) + const signers = await checkMultisigSigners(connection, newMintAuthority, [ + toWeb3JsPublicKey(oftStorePda), + ...additionalMinters, + ]) + console.log(`New Mint Authority Signers: ${signers.map((s) => s.toBase58()).join(', ')}`) + for (const authorityType of [AuthorityType.MintTokens, AuthorityType.FreezeAccount]) { + const mintAuthRet = await getMint(connection, mint, undefined, toWeb3JsPublicKey(tokenProgram)) + let currentAuthority + if (authorityType == AuthorityType.MintTokens) { + if (!mintAuthRet.mintAuthority) { + throw new Error(`Mint ${mintStr} has no mint authority`) + } + currentAuthority = fromWeb3JsPublicKey(mintAuthRet.mintAuthority) + } else { + if (!mintAuthRet.freezeAuthority) { + throw new Error(`Mint ${mintStr} has no freeze authority`) + } + currentAuthority = fromWeb3JsPublicKey(mintAuthRet.freezeAuthority) + } + if (authorityType == AuthorityType.FreezeAccount && !mintAuthRet.freezeAuthority) { + throw new Error(`Mint ${mintStr} has no freeze authority`) + } + console.log(`Current ${getAuthorityTypeString(authorityType)} Authority: ${currentAuthority}`) + const ix = createSetAuthorityInstruction( + new PublicKey(mintStr), + toWeb3JsPublicKey(currentAuthority), + authorityType, + newMintAuthority, + [toWeb3JsKeypair(umiWalletKeyPair)] + ) + const umiInstruction = { + programId: publicKey(ix.programId.toBase58()), + keys: ix.keys.map((key) => ({ + pubkey: key.pubkey, + isSigner: key.isSigner, + isWritable: key.isWritable, + })) as unknown as AccountMeta[], + data: ix.data, + } + let txBuilder = transactionBuilder().add({ + instruction: umiInstruction, + signers: [umiWalletSigner], // Include all required signers here + bytesCreatedOnChain: 0, + }) + txBuilder = await addComputeUnitInstructions( + connection, + umi, + eid, + txBuilder, + umiWalletSigner, + computeUnitPriceScaleFactor, + TransactionType.SetAuthority + ) + const { signature } = await txBuilder.sendAndConfirm(umi) + console.log( + `SetAuthorityTx(${getAuthorityTypeString(authorityType)}): ${getExplorerTxLink(bs58.encode(signature), eid == EndpointId.SOLANA_V2_TESTNET)}` + ) + } + } + ) diff --git a/examples/oft-main/tasks/solana/setInboundRateLimit.ts b/examples/oft-main/tasks/solana/setInboundRateLimit.ts new file mode 100644 index 0000000000..a4f668aedf --- /dev/null +++ b/examples/oft-main/tasks/solana/setInboundRateLimit.ts @@ -0,0 +1,80 @@ +import assert from 'assert' + +import { mplToolbox } from '@metaplex-foundation/mpl-toolbox' +import { createSignerFromKeypair, publicKey, signerIdentity } from '@metaplex-foundation/umi' +import { createUmi } from '@metaplex-foundation/umi-bundle-defaults' +import { fromWeb3JsKeypair, toWeb3JsPublicKey } from '@metaplex-foundation/umi-web3js-adapters' +import { Keypair, PublicKey, sendAndConfirmTransaction } from '@solana/web3.js' +import bs58 from 'bs58' +import { task } from 'hardhat/config' + +import { types } from '@layerzerolabs/devtools-evm-hardhat' +import { deserializeTransactionMessage } from '@layerzerolabs/devtools-solana' +import { EndpointId } from '@layerzerolabs/lz-definitions' +import { OftPDA, oft } from '@layerzerolabs/oft-v2-solana-sdk' +import { createOFTFactory } from '@layerzerolabs/ua-devtools-solana' + +import { createSolanaConnectionFactory } from '../common/utils' + +interface Args { + mint: string + eid: EndpointId + srcEid: EndpointId + programId: string + oftStore: string + capacity: bigint + refillPerSecond: bigint +} + +task( + 'lz:oft:solana:inbound-rate-limit', + "Sets the Solana and EVM rate limits from './scripts/solana/utils/constants.ts'" +) + .addParam('mint', 'The OFT token mint public key') + .addParam('programId', 'The OFT Program id') + .addParam('eid', 'Solana mainnet (30168) or testnet (40168)', undefined, types.eid) + .addParam('srcEid', 'The source endpoint ID', undefined, types.eid) + .addParam('oftStore', 'The OFTStore account') + .addParam('capacity', 'The capacity of the rate limit', undefined, types.bigint) + .addParam('refillPerSecond', 'The refill rate of the rate limit', undefined, types.bigint) + .setAction(async (taskArgs: Args, hre) => { + const privateKey = process.env.SOLANA_PRIVATE_KEY + assert(!!privateKey, 'SOLANA_PRIVATE_KEY is not defined in the environment variables.') + + const keypair = Keypair.fromSecretKey(bs58.decode(privateKey)) + const umiKeypair = fromWeb3JsKeypair(keypair) + + const connectionFactory = createSolanaConnectionFactory() + const connection = await connectionFactory(taskArgs.eid) + + const umi = createUmi(connection.rpcEndpoint).use(mplToolbox()) + const umiWalletSigner = createSignerFromKeypair(umi, umiKeypair) + umi.use(signerIdentity(umiWalletSigner)) + + const solanaSdkFactory = createOFTFactory( + () => toWeb3JsPublicKey(umiWalletSigner.publicKey), + () => new PublicKey(taskArgs.programId), + connectionFactory + ) + const sdk = await solanaSdkFactory({ + address: new PublicKey(taskArgs.oftStore).toBase58(), + eid: taskArgs.eid, + }) + const solanaRateLimits = { + capacity: taskArgs.capacity, + refillPerSecond: taskArgs.refillPerSecond, + } + try { + const tx = deserializeTransactionMessage( + (await sdk.setInboundRateLimit(taskArgs.srcEid, solanaRateLimits)).data + ) + tx.sign(keypair) + const txId = await sendAndConfirmTransaction(connection, tx, [keypair]) + console.log(`Transaction successful with ID: ${txId}`) + const [peer] = new OftPDA(publicKey(taskArgs.programId)).peer(publicKey(taskArgs.oftStore), taskArgs.srcEid) + const peerInfo = await oft.accounts.fetchPeerConfig({ rpc: umi.rpc }, peer) + console.dir({ peerInfo }, { depth: null }) + } catch (error) { + console.error(`setInboundRateLimit failed:`, error) + } + }) diff --git a/examples/oft-main/tasks/solana/setOutboundRateLimit.ts b/examples/oft-main/tasks/solana/setOutboundRateLimit.ts new file mode 100644 index 0000000000..4d5abbf51c --- /dev/null +++ b/examples/oft-main/tasks/solana/setOutboundRateLimit.ts @@ -0,0 +1,81 @@ +import assert from 'assert' + +import { mplToolbox } from '@metaplex-foundation/mpl-toolbox' +import { createSignerFromKeypair, publicKey, signerIdentity } from '@metaplex-foundation/umi' +import { createUmi } from '@metaplex-foundation/umi-bundle-defaults' +import { fromWeb3JsKeypair, toWeb3JsKeypair, toWeb3JsPublicKey } from '@metaplex-foundation/umi-web3js-adapters' +import { Keypair, PublicKey, sendAndConfirmTransaction } from '@solana/web3.js' +import bs58 from 'bs58' +import { task } from 'hardhat/config' + +import { types } from '@layerzerolabs/devtools-evm-hardhat' +import { deserializeTransactionMessage } from '@layerzerolabs/devtools-solana' +import { EndpointId } from '@layerzerolabs/lz-definitions' +import { OftPDA, oft } from '@layerzerolabs/oft-v2-solana-sdk' +import { createOFTFactory } from '@layerzerolabs/ua-devtools-solana' + +import { createSolanaConnectionFactory } from '../common/utils' + +interface Args { + mint: string + eid: EndpointId + dstEid: EndpointId + programId: string + oftStore: string + capacity: bigint + refillPerSecond: bigint +} + +task( + 'lz:oft:solana:outbound-rate-limit', + "Sets the Solana and EVM rate limits from './scripts/solana/utils/constants.ts'" +) + .addParam('mint', 'The OFT token mint public key') + .addParam('programId', 'The OFT Program id') + .addParam('eid', 'Solana mainnet (30168) or testnet (40168)', undefined, types.eid) + .addParam('dstEid', 'The destination endpoint ID', undefined, types.eid) + .addParam('oftStore', 'The OFTStore account') + .addParam('capacity', 'The capacity of the rate limit', undefined, types.bigint) + .addParam('refillPerSecond', 'The refill rate of the rate limit', undefined, types.bigint) + .setAction(async (taskArgs: Args, hre) => { + const privateKey = process.env.SOLANA_PRIVATE_KEY + assert(!!privateKey, 'SOLANA_PRIVATE_KEY is not defined in the environment variables.') + + const keypair = Keypair.fromSecretKey(bs58.decode(privateKey)) + const umiKeypair = fromWeb3JsKeypair(keypair) + const connectionFactory = createSolanaConnectionFactory() + const connection = await connectionFactory(taskArgs.eid) + const umi = createUmi(connection.rpcEndpoint).use(mplToolbox()) + const umiWalletSigner = createSignerFromKeypair(umi, umiKeypair) + const web3WalletKeyPair = toWeb3JsKeypair(umiKeypair) + umi.use(signerIdentity(umiWalletSigner)) + + const solanaSdkFactory = createOFTFactory( + () => toWeb3JsPublicKey(umiWalletSigner.publicKey), + () => new PublicKey(taskArgs.programId), + connectionFactory + ) + + const sdk = await solanaSdkFactory({ + address: new PublicKey(taskArgs.oftStore).toBase58(), + eid: taskArgs.eid, + }) + const solanaRateLimits = { + capacity: taskArgs.capacity, + refillPerSecond: taskArgs.refillPerSecond, + } + // for (const peer of graph.connections.filter((connection) => connection.vector.from.eid === solanaEid)) { + try { + const tx = deserializeTransactionMessage( + (await sdk.setOutboundRateLimit(EndpointId.SEPOLIA_V2_TESTNET, solanaRateLimits)).data + ) + tx.sign(keypair) + const txId = await sendAndConfirmTransaction(connection, tx, [keypair]) + console.log(`Transaction successful with ID: ${txId}`) + const [peer] = new OftPDA(publicKey(taskArgs.programId)).peer(publicKey(taskArgs.oftStore), taskArgs.dstEid) + const peerInfo = await oft.accounts.fetchPeerConfig({ rpc: umi.rpc }, peer) + console.dir({ peerInfo }, { depth: null }) + } catch (error) { + console.error(`setOutboundRateLimit failed:`, error) + } + }) diff --git a/examples/oft-main/tasks/solana/setUpdateAuthority.ts b/examples/oft-main/tasks/solana/setUpdateAuthority.ts new file mode 100644 index 0000000000..3658728487 --- /dev/null +++ b/examples/oft-main/tasks/solana/setUpdateAuthority.ts @@ -0,0 +1,103 @@ +import { fetchMetadataFromSeeds, updateV1 } from '@metaplex-foundation/mpl-token-metadata' +import { publicKey } from '@metaplex-foundation/umi' +import { SystemProgram } from '@solana/web3.js' +import bs58 from 'bs58' +import { task } from 'hardhat/config' + +import { types as devtoolsTypes } from '@layerzerolabs/devtools-evm-hardhat' +import { promptToContinue } from '@layerzerolabs/io-devtools' +import { EndpointId } from '@layerzerolabs/lz-definitions' + +import { deriveConnection, getExplorerTxLink } from '.' + +interface Args { + mint: string + newUpdateAuthority?: string + renounceUpdateAuthority?: boolean + eid: EndpointId +} + +// sets the update authority via Metaplex +// Example (set new update authority): +// pnpm hardhat lz:oft:solana:set-update-authority --eid --mint --new-update-authority +// Example (renounce update authority): +// pnpm hardhat lz:oft:solana:set-update-authority --eid --mint --renounce-update-authority true +task('lz:oft:solana:set-update-authority', 'Updates the metaplex update authority of the SPL Token') + .addParam('eid', 'Solana mainnet (30168) or testnet (40168)', undefined, devtoolsTypes.eid) + .addParam('mint', 'The Token mint public key', undefined, devtoolsTypes.string) + .addOptionalParam('newUpdateAuthority', 'The new update authority', undefined, devtoolsTypes.string) + .addOptionalParam('renounceUpdateAuthority', 'Renounce update authority', false, devtoolsTypes.boolean) + .setAction( + async ({ eid, mint: mintStr, newUpdateAuthority: newUpdateAuthorityStr, renounceUpdateAuthority }: Args) => { + // if not renouncing, must provide new update authority + if (!renounceUpdateAuthority && !newUpdateAuthorityStr) { + throw new Error( + 'Either specify the new update authority via --new-update-authority or renounce via --renounce-update-authority true' + ) + } + + // if renouncing, must not provide new update authority + if (renounceUpdateAuthority && newUpdateAuthorityStr) { + throw new Error('Cannot provide new update authority if renouncing') + } + + /* + * On why the update authority is set to SystemProgram.programId ("11111111111111111111111111111111") when renouncing: + * The Metaplex Token Metadata program defines the update_authority strictly as a Pubkey: + * https://github.com/metaplex-foundation/mpl-token-metadata/blob/23aee718e723578ee5df411f045184e0ac9a9e63/programs/token-metadata/program/src/state/metadata.rs#L73 + * Hence, the value must always be a Pubkey + * To renounce the update authority, we can to set its value to SystemProgram ID ("11111111111111111111111111111111") + * This is done on top of setting `isMutable` to false + */ + + const updateAuthority = renounceUpdateAuthority + ? publicKey(SystemProgram.programId) + : // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + publicKey(newUpdateAuthorityStr!) // we already checked that this is defined + + const { umi, umiWalletSigner } = await deriveConnection(eid) + + const mint = publicKey(mintStr) + const initialMetadata = await fetchMetadataFromSeeds(umi, { mint }) + + if (initialMetadata.updateAuthority === SystemProgram.programId.toString()) { + console.log('\nThe update authority has already been renounced\n') + return + } + + if (initialMetadata.updateAuthority !== umiWalletSigner.publicKey.toString()) { + throw new Error('Only the update authority can update the metadata') + } + + console.log(`\nMint Address: ${mintStr}\n`) + console.log(`\nCurrent update authority: ${initialMetadata.updateAuthority}\n`) + console.log(`\nNew update authority: ${updateAuthority.toString()}\n`) + + if (renounceUpdateAuthority) { + const doContinue = await promptToContinue( + 'You have chosen `--renounce-update-authority true`. This means that the Update Authority will be immediately renounced. This is irreversible. Continue?' + ) + if (!doContinue) { + return + } + } + + const isMutable = renounceUpdateAuthority ? false : initialMetadata.isMutable + + // Verify that isMutable is true when not renouncing, can't be too safe. + if (!renounceUpdateAuthority && !isMutable) { + throw new Error('When not renouncing, `isMutable` must be true') + } + + const txn = await updateV1(umi, { + mint, + newUpdateAuthority: updateAuthority, + authority: umiWalletSigner, + isMutable: renounceUpdateAuthority ? false : isMutable, + }).sendAndConfirm(umi) + + const isTestnet = eid == EndpointId.SOLANA_V2_TESTNET + + console.log(`Txn link: ${getExplorerTxLink(bs58.encode(txn.signature), isTestnet)}`) + } + ) diff --git a/examples/oft-main/tasks/solana/updateMetadata.ts b/examples/oft-main/tasks/solana/updateMetadata.ts new file mode 100644 index 0000000000..3c10b3e538 --- /dev/null +++ b/examples/oft-main/tasks/solana/updateMetadata.ts @@ -0,0 +1,92 @@ +import { + UpdateV1InstructionAccounts, + UpdateV1InstructionArgs, + fetchMetadataFromSeeds, + updateV1, +} from '@metaplex-foundation/mpl-token-metadata' +import { publicKey, transactionBuilder } from '@metaplex-foundation/umi' +import { toWeb3JsTransaction } from '@metaplex-foundation/umi-web3js-adapters' +import bs58 from 'bs58' +import { task } from 'hardhat/config' + +import { types as devtoolsTypes } from '@layerzerolabs/devtools-evm-hardhat' +import { EndpointId } from '@layerzerolabs/lz-definitions' + +import { deriveConnection, getExplorerTxLink } from './index' + +interface UpdateMetadataTaskArgs { + eid: EndpointId + name: string + mint: string + sellerFeeBasisPoints: number + symbol: string + uri: string + vaultPda: string +} + +// note that if URI is specified, then the name and symbol in there would be used and will override the 'outer' name and symbol +// Example: +// pnpm hardhat lz:oft:solana:update-metadata --eid --mint --name +// If Update Authority is a multisig (Vault PDA): +// // pnpm hardhat lz:oft:solana:update-metadata --eid --mint --name --vault-pda +task('lz:oft:solana:update-metadata', 'Updates the metaplex metadata of the SPL Token') + .addParam('eid', 'Solana mainnet (30168) or testnet (40168)', undefined, devtoolsTypes.eid) + .addParam('mint', 'The Token mint public key', undefined, devtoolsTypes.string) + .addOptionalParam('name', 'Token Name', undefined, devtoolsTypes.string) + .addOptionalParam('symbol', 'Token Symbol', undefined, devtoolsTypes.string) + .addOptionalParam('sellerFeeBasisPoints', 'Seller fee basis points', undefined, devtoolsTypes.int) + .addOptionalParam('uri', 'URI for token metadata', undefined, devtoolsTypes.string) + .addOptionalParam('vaultPda', 'The Vault PDA public key', undefined, devtoolsTypes.string) + .setAction( + async ({ eid, name, mint: mintStr, sellerFeeBasisPoints, symbol, uri, vaultPda }: UpdateMetadataTaskArgs) => { + const { umi, umiWalletSigner } = await deriveConnection(eid, { + noopSigner: vaultPda ? publicKey(vaultPda) : undefined, + }) + + const mint = publicKey(mintStr) + + const initialMetadata = await fetchMetadataFromSeeds(umi, { mint }) + + if (!vaultPda && initialMetadata.updateAuthority !== umiWalletSigner.publicKey.toString()) { + throw new Error('Only the update authority can update the metadata') + } + + if (vaultPda && initialMetadata.updateAuthority !== publicKey(vaultPda).toString()) { + throw new Error('Provided vaultPda is not the current update authority on this metadata') + } + + if (initialMetadata.isMutable == false) { + throw new Error('Metadata is not mutable') + } + + const isTestnet = eid == EndpointId.SOLANA_V2_TESTNET + + const updateV1Args: UpdateV1InstructionAccounts & UpdateV1InstructionArgs = { + mint, + authority: umiWalletSigner, + data: { + ...initialMetadata, + name: name || initialMetadata.name, + symbol: symbol || initialMetadata.symbol, + uri: uri || initialMetadata.uri, + sellerFeeBasisPoints: + sellerFeeBasisPoints != undefined ? sellerFeeBasisPoints : initialMetadata.sellerFeeBasisPoints, + }, + } + const updateIxn = updateV1(umi, updateV1Args) + const txBuilder = transactionBuilder().add(updateIxn) + if (vaultPda) { + txBuilder.setFeePayer(umiWalletSigner).useV0() + // Include a recent blockhash before building + const web3JsTxn = toWeb3JsTransaction(await txBuilder.buildWithLatestBlockhash(umi)) + const base58 = bs58.encode(new Uint8Array(web3JsTxn.message.serialize())) + console.log('==== Import the following base58 txn data into the Squads UI ====') + console.log(base58) + // output txn data as base58 + } else { + // submit the txn + const createTokenTx = await txBuilder.sendAndConfirm(umi) + console.log(`createTokenTx: ${getExplorerTxLink(bs58.encode(createTokenTx.signature), isTestnet)}`) + } + } + ) diff --git a/examples/oft-main/tasks/solana/utils.ts b/examples/oft-main/tasks/solana/utils.ts new file mode 100644 index 0000000000..dd2b1cf240 --- /dev/null +++ b/examples/oft-main/tasks/solana/utils.ts @@ -0,0 +1,85 @@ +import { Connection } from '@solana/web3.js' +import { HardhatRuntimeEnvironment } from 'hardhat/types' + +import { ChainType, EndpointId, endpointIdToChainType } from '@layerzerolabs/lz-definitions' +import { OAppOmniGraph } from '@layerzerolabs/ua-devtools' +import { + OAppOmniGraphHardhatSchema, + SUBTASK_LZ_OAPP_CONFIG_LOAD, + SubtaskLoadConfigTaskArgs, + TASK_LZ_OAPP_CONFIG_GET, +} from '@layerzerolabs/ua-devtools-evm-hardhat' + +export const findSolanaEndpointIdInGraph = async ( + hre: HardhatRuntimeEnvironment, + oappConfig: string +): Promise => { + if (!oappConfig) throw new Error('Missing oappConfig') + + let graph: OAppOmniGraph + try { + graph = await hre.run(SUBTASK_LZ_OAPP_CONFIG_LOAD, { + configPath: oappConfig, + schema: OAppOmniGraphHardhatSchema, + task: TASK_LZ_OAPP_CONFIG_GET, + } satisfies SubtaskLoadConfigTaskArgs) + } catch (error) { + if (error instanceof Error) { + throw new Error(`Failed to load OApp configuration: ${error.message}`) + } else { + throw new Error('Failed to load OApp configuration: Unknown error') + } + } + + let solanaEid: EndpointId | null = null + + const checkSolanaEndpoint = (eid: EndpointId) => { + if (endpointIdToChainType(eid) === ChainType.SOLANA) { + if (solanaEid && solanaEid !== eid) { + throw new Error(`Multiple Solana Endpoint IDs found: ${solanaEid}, ${eid}`) + } + solanaEid = eid + } + } + + for (const { vector } of graph.connections) { + checkSolanaEndpoint(vector.from.eid) + checkSolanaEndpoint(vector.to.eid) + if (solanaEid) return solanaEid + } + + return null +} + +/** + * Turn a human decimal amount (e.g. "1.234") into a BigInt of base‐units given `decimals`. + */ +export function parseDecimalToUnits(amount: string, decimals: number): bigint { + const [whole, fraction = ''] = amount.split('.') + const wholeUnits = BigInt(whole) * 10n ** BigInt(decimals) + // pad or trim the fractional part to exactly `decimals` digits + const fracUnits = BigInt( + fraction + .padEnd(decimals, '0') // "23" → "230000" + .slice(0, decimals) // in case user typed more digits than `decimals` + ) + return wholeUnits + fracUnits +} + +/** + * Suppresses Solana‐web3.js "429 Too Many Requests" retry spam + * by intercepting stderr.write and dropping any chunk + * that mentions the 429 retry. + */ +export function silenceSolana429(connection: Connection): void { + const origWrite = process.stderr.write.bind(process.stderr) + process.stderr.write = ((chunk: any, ...args: any[]) => { + const str = Buffer.isBuffer(chunk) ? chunk.toString('utf8') : chunk + if (typeof str === 'string' && str.includes('429 Too Many Requests')) { + // swallow it + return true + } + // otherwise pass through + return origWrite(chunk, ...args) + }) as typeof process.stderr.write +} diff --git a/examples/oft-main/tasks/starknet/sendStarknet.ts b/examples/oft-main/tasks/starknet/sendStarknet.ts new file mode 100644 index 0000000000..846e009867 --- /dev/null +++ b/examples/oft-main/tasks/starknet/sendStarknet.ts @@ -0,0 +1,137 @@ +import { Contract } from 'starknet' + +import { createConnectionFactory, createRpcUrlFactory } from '@layerzerolabs/devtools-starknet' +import { EndpointId, Stage, endpointIdToStage } from '@layerzerolabs/lz-definitions' + +import { SendResult } from '../common/types' +import { getLayerZeroScanLink } from '../solana' +import { parseDecimalToUnits } from '../solana/utils' + +import { assertStarknetEid, getStarknetAccountFromEnv } from './utils' + +// STRK token address on Starknet mainnet +const STRK_TOKEN_ADDRESS = '0x04718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d' + +// Minimal ERC20 ABI for approve +const ERC20_ABI = [ + { + name: 'approve', + type: 'function', + inputs: [ + { name: 'spender', type: 'core::starknet::contract_address::ContractAddress' }, + { name: 'amount', type: 'core::integer::u256' }, + ], + outputs: [{ type: 'core::bool' }], + state_mutability: 'external', + }, +] + +/** + * Convert hex string to a string for Cairo ByteArray. + * In starknet.js v8, ByteArray parameters accept plain strings. + * + * NOTE: This uses latin1 encoding which can be corrupted by starknet.js's + * UTF-8 re-encoding for bytes >= 128. For enforced options which typically + * contain 0x80-0xFF bytes, use hexToByteArrayCalldata() with raw calldata. + */ +const hexToString = (hex?: string): string => { + if (!hex || hex === '0x' || hex === '') { + return '' + } + const clean = hex.replace(/^0x/, '') + const buffer = Buffer.from(clean, 'hex') + return buffer.toString('latin1') +} + +export interface StarknetArgs { + amount: string + to: string + srcEid: EndpointId + dstEid: EndpointId + minAmount?: string + extraOptions?: string + composeMsg?: string + oftAddress: string + tokenDecimals?: number +} + +export async function sendStarknet({ + amount, + to, + srcEid, + dstEid, + minAmount, + extraOptions, + composeMsg, + oftAddress, + tokenDecimals = 18, +}: StarknetArgs): Promise { + assertStarknetEid(srcEid) + + // Use createRpcUrlFactory() to read from environment variables (RPC_URL_STARKNET) + const providerFactory = createConnectionFactory(createRpcUrlFactory()) + const provider = await providerFactory(srcEid) + const account = await getStarknetAccountFromEnv(srcEid) + + const oftContract = await getOftMintBurnAdapterContract(oftAddress, account) + + const amountUnits = parseDecimalToUnits(amount, tokenDecimals) + const minAmountUnits = minAmount ? parseDecimalToUnits(minAmount, tokenDecimals) : amountUnits + + const sendParam = { + dst_eid: dstEid, + to: { value: BigInt(to) }, + amount_ld: amountUnits, + min_amount_ld: minAmountUnits, + extra_options: hexToString(extraOptions), + compose_msg: hexToString(composeMsg), + oft_cmd: hexToString(), + } + + const feeQuote = await oftContract.quote_send(sendParam, false) + + // Create STRK approval for the native fee (with 10% buffer for price fluctuation) + const feeWithBuffer = (BigInt(feeQuote.native_fee) * 110n) / 100n + const strkContract = new Contract({ + abi: ERC20_ABI as any, + address: STRK_TOKEN_ADDRESS, + providerOrAccount: account, + }) + const approveCall = strkContract.populateTransaction.approve(oftAddress, { low: feeWithBuffer, high: 0n }) + + const sendCall = oftContract.populateTransaction.send( + sendParam, + { + native_fee: feeQuote.native_fee, + lz_token_fee: feeQuote.lz_token_fee, + }, + account.address + ) + + // Execute approval and send in a single multicall + const response = await account.execute([approveCall, sendCall]) + const txHash = response.transaction_hash + await provider.waitForTransaction(txHash) + + const isTestnet = endpointIdToStage(srcEid) !== Stage.MAINNET + return { + txHash, + scanLink: getLayerZeroScanLink(txHash, isTestnet), + } +} + +function getOftMintBurnAdapterAbi(): unknown { + // Load the ABI from the package's main export + // eslint-disable-next-line @typescript-eslint/no-var-requires + const pkg = require('@layerzerolabs/oft-mint-burn-starknet') + const abi = pkg.abi?.oFTMintBurnAdapter + if (!abi) { + throw new Error('Unable to locate OFTMintBurnAdapter ABI in @layerzerolabs/oft-mint-burn-starknet') + } + return abi +} + +async function getOftMintBurnAdapterContract(address: string, providerOrAccount: any) { + const abi = getOftMintBurnAdapterAbi() + return new Contract({ abi: abi as any, address, providerOrAccount }) +} diff --git a/examples/oft-main/tasks/starknet/utils.ts b/examples/oft-main/tasks/starknet/utils.ts new file mode 100644 index 0000000000..76c7931976 --- /dev/null +++ b/examples/oft-main/tasks/starknet/utils.ts @@ -0,0 +1,31 @@ +import { Account } from 'starknet' + +import { formatEid } from '@layerzerolabs/devtools' +import { createConnectionFactory, createRpcUrlFactory } from '@layerzerolabs/devtools-starknet' +import { ChainType, EndpointId, Stage, endpointIdToChainType, endpointIdToStage } from '@layerzerolabs/lz-definitions' + +export function assertStarknetEid(eid: EndpointId) { + if (endpointIdToChainType(eid) !== ChainType.STARKNET) { + throw new Error(`Expected Starknet EID but got ${formatEid(eid)}`) + } +} + +export async function getStarknetAccountFromEnv(eid: EndpointId): Promise { + const isTestnet = endpointIdToStage(eid) !== Stage.MAINNET + const address = + (isTestnet ? process.env.STARKNET_ACCOUNT_ADDRESS_TESTNET : process.env.STARKNET_ACCOUNT_ADDRESS) ?? + process.env.STARKNET_ACCOUNT_ADDRESS + const privateKey = + (isTestnet ? process.env.STARKNET_PRIVATE_KEY_TESTNET : process.env.STARKNET_PRIVATE_KEY) ?? + process.env.STARKNET_PRIVATE_KEY + + if (!address || !privateKey) { + throw new Error('STARKNET_ACCOUNT_ADDRESS and STARKNET_PRIVATE_KEY are required') + } + + // Use createRpcUrlFactory() to read from environment variables (RPC_URL_STARKNET) + const providerFactory = createConnectionFactory(createRpcUrlFactory()) + const provider = await providerFactory(eid) + // starknet.js v8+ uses an options object for Account constructor + return new Account({ provider, address, signer: privateKey }) +} diff --git a/examples/oft-main/tasks/sui/sendSui.ts b/examples/oft-main/tasks/sui/sendSui.ts new file mode 100644 index 0000000000..01f6430847 --- /dev/null +++ b/examples/oft-main/tasks/sui/sendSui.ts @@ -0,0 +1,102 @@ +import { Transaction } from '@mysten/sui/transactions' + +import { createConnectionFactory, createRpcUrlFactory } from '@layerzerolabs/devtools-sui' +import { EndpointId, Stage, endpointIdToStage } from '@layerzerolabs/lz-definitions' +import { OFT } from '@layerzerolabs/lz-sui-oft-sdk-v2' +import { SDK } from '@layerzerolabs/lz-sui-sdk-v2' +import { addressToBytes32 } from '@layerzerolabs/lz-v2-utilities' + +import { SendResult } from '../common/types' +import { getLayerZeroScanLink } from '../solana' +import { parseDecimalToUnits } from '../solana/utils' + +import { assertSuiEid, getSuiKeypairFromEnv } from './utils' + +const hexToBytes = (value?: string) => + value ? Uint8Array.from(Buffer.from(value.replace(/^0x/, ''), 'hex')) : new Uint8Array() + +const toBytes32 = (value: string) => { + const clean = value.replace(/^0x/, '') + if (clean.length === 64) { + return Uint8Array.from(Buffer.from(clean, 'hex')) + } + return addressToBytes32(value) +} + +export interface SuiArgs { + amount: string + to: string + srcEid: EndpointId + dstEid: EndpointId + minAmount?: string + extraOptions?: string + composeMsg?: string + oftPackageId: string + oftObjectId: string + oappObjectId: string + tokenType: string +} + +export async function sendSui({ + amount, + to, + srcEid, + dstEid, + minAmount, + extraOptions, + composeMsg, + oftPackageId, + oftObjectId, + oappObjectId, + tokenType, +}: SuiArgs): Promise { + assertSuiEid(srcEid) + + const keypair = getSuiKeypairFromEnv() + const sender = keypair.getPublicKey().toSuiAddress() + const connectionFactory = createConnectionFactory(createRpcUrlFactory()) + const client = await connectionFactory(srcEid) + + const stage = endpointIdToStage(srcEid) as Stage + const sdk = new SDK({ client, stage }) + const oft = new OFT(sdk, oftPackageId, oftObjectId, tokenType, oappObjectId) + + const metadata = await client.getCoinMetadata({ coinType: tokenType }) + if (!metadata) { + throw new Error(`Unable to fetch Sui coin metadata for ${tokenType}`) + } + + const amountUnits = parseDecimalToUnits(amount, metadata.decimals) + const minAmountUnits = minAmount ? parseDecimalToUnits(minAmount, metadata.decimals) : amountUnits + + const sendParam = { + dstEid, + to: Buffer.from(toBytes32(to)), + amountLd: amountUnits, + minAmountLd: minAmountUnits, + extraOptions: hexToBytes(extraOptions), + composeMsg: hexToBytes(composeMsg), + oftCmd: new Uint8Array(), + } + + const fee = await oft.quoteSend(sender, sendParam, false) + + const tx = new Transaction() + const coinProvided = await oft.splitCoinMoveCall(tx, sender, sendParam.amountLd) + await oft.sendMoveCall(tx, sender, sendParam, coinProvided, fee.nativeFee, fee.zroFee, sender) + tx.transferObjects([coinProvided], sender) + + const result = await client.signAndExecuteTransaction({ + transaction: tx, + signer: keypair, + options: { showObjectChanges: true }, + }) + + await client.waitForTransaction({ digest: result.digest }) + + const isTestnet = endpointIdToStage(srcEid) !== Stage.MAINNET + return { + txHash: result.digest, + scanLink: getLayerZeroScanLink(result.digest, isTestnet), + } +} diff --git a/examples/oft-main/tasks/sui/utils.ts b/examples/oft-main/tasks/sui/utils.ts new file mode 100644 index 0000000000..cf61ce06c5 --- /dev/null +++ b/examples/oft-main/tasks/sui/utils.ts @@ -0,0 +1,26 @@ +import { decodeSuiPrivateKey } from '@mysten/sui/cryptography' +import { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519' + +import { formatEid } from '@layerzerolabs/devtools' +import { ChainType, EndpointId, endpointIdToChainType } from '@layerzerolabs/lz-definitions' + +export function getSuiKeypairFromEnv(): Ed25519Keypair { + const suiPrivateKey = process.env.SUI_PRIVATE_KEY + if (!suiPrivateKey) { + throw new Error('SUI_PRIVATE_KEY environment variable is required') + } + + try { + const { secretKey } = decodeSuiPrivateKey(suiPrivateKey) + return Ed25519Keypair.fromSecretKey(secretKey) + } catch { + const secretKey = Uint8Array.from(Buffer.from(suiPrivateKey.replace(/^0x/, ''), 'hex')) + return Ed25519Keypair.fromSecretKey(secretKey) + } +} + +export function assertSuiEid(eid: EndpointId) { + if (endpointIdToChainType(eid) !== ChainType.SUI) { + throw new Error(`Expected Sui EID but got ${formatEid(eid)}`) + } +} diff --git a/examples/oft-main/test/foundry/MyOFT.t.sol b/examples/oft-main/test/foundry/MyOFT.t.sol new file mode 100644 index 0000000000..f285c0a532 --- /dev/null +++ b/examples/oft-main/test/foundry/MyOFT.t.sol @@ -0,0 +1,160 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.20; + +// Mock imports +import { OFTMock } from "../mocks/OFTMock.sol"; +import { ERC20Mock } from "../mocks/ERC20Mock.sol"; +import { OFTComposerMock } from "../mocks/OFTComposerMock.sol"; + +// OApp imports +import { IOAppOptionsType3, EnforcedOptionParam } from "@layerzerolabs/oapp-evm/contracts/oapp/libs/OAppOptionsType3.sol"; +import { OptionsBuilder } from "@layerzerolabs/oapp-evm/contracts/oapp/libs/OptionsBuilder.sol"; + +// OFT imports +import { IOFT, SendParam, OFTReceipt } from "@layerzerolabs/oft-evm/contracts/interfaces/IOFT.sol"; +import { MessagingFee, MessagingReceipt } from "@layerzerolabs/oft-evm/contracts/OFTCore.sol"; +import { OFTMsgCodec } from "@layerzerolabs/oft-evm/contracts/libs/OFTMsgCodec.sol"; +import { OFTComposeMsgCodec } from "@layerzerolabs/oft-evm/contracts/libs/OFTComposeMsgCodec.sol"; + +// OZ imports +import { IERC20 } from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; + +// Forge imports +//import "forge-std/console.sol"; + +// DevTools imports +import { TestHelperOz5 } from "@layerzerolabs/test-devtools-evm-foundry/contracts/TestHelperOz5.sol"; + +contract MyOFTTest is TestHelperOz5 { + using OptionsBuilder for bytes; + + uint32 private aEid = 1; + uint32 private bEid = 2; + + OFTMock private aOFT; + OFTMock private bOFT; + + address private userA = address(0x1); + address private userB = address(0x2); + uint256 private initialBalance = 100 ether; + + function setUp() public virtual override { + vm.deal(userA, 1000 ether); + vm.deal(userB, 1000 ether); + + super.setUp(); + setUpEndpoints(2, LibraryType.UltraLightNode); + + aOFT = OFTMock( + _deployOApp(type(OFTMock).creationCode, abi.encode("aOFT", "aOFT", address(endpoints[aEid]), address(this))) + ); + + bOFT = OFTMock( + _deployOApp(type(OFTMock).creationCode, abi.encode("bOFT", "bOFT", address(endpoints[bEid]), address(this))) + ); + + // config and wire the ofts + address[] memory ofts = new address[](2); + ofts[0] = address(aOFT); + ofts[1] = address(bOFT); + this.wireOApps(ofts); + + // mint tokens + aOFT.mint(userA, initialBalance); + bOFT.mint(userB, initialBalance); + } + + function test_constructor() public { + assertEq(aOFT.owner(), address(this)); + assertEq(bOFT.owner(), address(this)); + + assertEq(aOFT.balanceOf(userA), initialBalance); + assertEq(bOFT.balanceOf(userB), initialBalance); + + assertEq(aOFT.token(), address(aOFT)); + assertEq(bOFT.token(), address(bOFT)); + } + + function test_send_oft() public { + uint256 tokensToSend = 1 ether; + bytes memory options = OptionsBuilder.newOptions().addExecutorLzReceiveOption(200000, 0); + SendParam memory sendParam = SendParam( + bEid, + addressToBytes32(userB), + tokensToSend, + tokensToSend, + options, + "", + "" + ); + MessagingFee memory fee = aOFT.quoteSend(sendParam, false); + + assertEq(aOFT.balanceOf(userA), initialBalance); + assertEq(bOFT.balanceOf(userB), initialBalance); + + vm.prank(userA); + aOFT.send{ value: fee.nativeFee }(sendParam, fee, payable(address(this))); + verifyPackets(bEid, addressToBytes32(address(bOFT))); + + assertEq(aOFT.balanceOf(userA), initialBalance - tokensToSend); + assertEq(bOFT.balanceOf(userB), initialBalance + tokensToSend); + } + + function test_send_oft_compose_msg() public { + uint256 tokensToSend = 1 ether; + + OFTComposerMock composer = new OFTComposerMock(); + + bytes memory options = OptionsBuilder + .newOptions() + .addExecutorLzReceiveOption(200000, 0) + .addExecutorLzComposeOption(0, 500000, 0); + bytes memory composeMsg = hex"1234"; + SendParam memory sendParam = SendParam( + bEid, + addressToBytes32(address(composer)), + tokensToSend, + tokensToSend, + options, + composeMsg, + "" + ); + MessagingFee memory fee = aOFT.quoteSend(sendParam, false); + + assertEq(aOFT.balanceOf(userA), initialBalance); + assertEq(bOFT.balanceOf(address(composer)), 0); + + vm.prank(userA); + (MessagingReceipt memory msgReceipt, OFTReceipt memory oftReceipt) = aOFT.send{ value: fee.nativeFee }( + sendParam, + fee, + payable(address(this)) + ); + verifyPackets(bEid, addressToBytes32(address(bOFT))); + + // lzCompose params + uint32 dstEid_ = bEid; + address from_ = address(bOFT); + bytes memory options_ = options; + bytes32 guid_ = msgReceipt.guid; + address to_ = address(composer); + bytes memory composerMsg_ = OFTComposeMsgCodec.encode( + msgReceipt.nonce, + aEid, + oftReceipt.amountReceivedLD, + abi.encodePacked(addressToBytes32(userA), composeMsg) + ); + this.lzCompose(dstEid_, from_, options_, guid_, to_, composerMsg_); + + assertEq(aOFT.balanceOf(userA), initialBalance - tokensToSend); + assertEq(bOFT.balanceOf(address(composer)), tokensToSend); + + assertEq(composer.from(), from_); + assertEq(composer.guid(), guid_); + assertEq(composer.message(), composerMsg_); + assertEq(composer.executor(), address(this)); + assertEq(composer.extraData(), composerMsg_); // default to setting the extraData to the message as well to test + } + + // TODO import the rest of oft tests? +} diff --git a/examples/oft-main/test/hardhat/MyOFT.test.ts b/examples/oft-main/test/hardhat/MyOFT.test.ts new file mode 100644 index 0000000000..257bc5218e --- /dev/null +++ b/examples/oft-main/test/hardhat/MyOFT.test.ts @@ -0,0 +1,101 @@ +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers' +import { expect } from 'chai' +import { Contract, ContractFactory } from 'ethers' +import { deployments, ethers } from 'hardhat' + +import { Options } from '@layerzerolabs/lz-v2-utilities' + +describe('MyOFT Test', function () { + // Constant representing a mock Endpoint ID for testing purposes + const eidA = 1 + const eidB = 2 + // Declaration of variables to be used in the test suite + let MyOFT: ContractFactory + let EndpointV2Mock: ContractFactory + let ownerA: SignerWithAddress + let ownerB: SignerWithAddress + let endpointOwner: SignerWithAddress + let myOFTA: Contract + let myOFTB: Contract + let mockEndpointV2A: Contract + let mockEndpointV2B: Contract + + // Before hook for setup that runs once before all tests in the block + before(async function () { + // Contract factory for our tested contract + // + // We are using a derived contract that exposes a mint() function for testing purposes + MyOFT = await ethers.getContractFactory('MyOFTMock') + + // Fetching the first three signers (accounts) from Hardhat's local Ethereum network + const signers = await ethers.getSigners() + + ;[ownerA, ownerB, endpointOwner] = signers + + // The EndpointV2Mock contract comes from @layerzerolabs/test-devtools-evm-hardhat package + // and its artifacts are connected as external artifacts to this project + // + // Unfortunately, hardhat itself does not yet provide a way of connecting external artifacts, + // so we rely on hardhat-deploy to create a ContractFactory for EndpointV2Mock + // + // See https://github.com/NomicFoundation/hardhat/issues/1040 + const EndpointV2MockArtifact = await deployments.getArtifact('EndpointV2Mock') + EndpointV2Mock = new ContractFactory(EndpointV2MockArtifact.abi, EndpointV2MockArtifact.bytecode, endpointOwner) + }) + + // beforeEach hook for setup that runs before each test in the block + beforeEach(async function () { + // Deploying a mock LZEndpoint with the given Endpoint ID + mockEndpointV2A = await EndpointV2Mock.deploy(eidA) + mockEndpointV2B = await EndpointV2Mock.deploy(eidB) + + // Deploying two instances of MyOFT contract with different identifiers and linking them to the mock LZEndpoint + myOFTA = await MyOFT.deploy('aOFT', 'aOFT', mockEndpointV2A.address, ownerA.address) + myOFTB = await MyOFT.deploy('bOFT', 'bOFT', mockEndpointV2B.address, ownerB.address) + + // Setting destination endpoints in the LZEndpoint mock for each MyOFT instance + await mockEndpointV2A.setDestLzEndpoint(myOFTB.address, mockEndpointV2B.address) + await mockEndpointV2B.setDestLzEndpoint(myOFTA.address, mockEndpointV2A.address) + + // Setting each MyOFT instance as a peer of the other in the mock LZEndpoint + await myOFTA.connect(ownerA).setPeer(eidB, ethers.utils.zeroPad(myOFTB.address, 32)) + await myOFTB.connect(ownerB).setPeer(eidA, ethers.utils.zeroPad(myOFTA.address, 32)) + }) + + // A test case to verify token transfer functionality + it('should send a token from A address to B address via each OFT', async function () { + // Minting an initial amount of tokens to ownerA's address in the myOFTA contract + const initialAmount = ethers.utils.parseEther('100') + await myOFTA.mint(ownerA.address, initialAmount) + + // Defining the amount of tokens to send and constructing the parameters for the send operation + const tokensToSend = ethers.utils.parseEther('1') + + // Defining extra message execution options for the send operation + const options = Options.newOptions().addExecutorLzReceiveOption(200000, 0).toHex().toString() + + const sendParam = [ + eidB, + ethers.utils.zeroPad(ownerB.address, 32), + tokensToSend, + tokensToSend, + options, + '0x', + '0x', + ] + + // Fetching the native fee for the token send operation + const [nativeFee] = await myOFTA.quoteSend(sendParam, false) + + // Executing the send operation from myOFTA contract + await myOFTA.send(sendParam, [nativeFee, 0], ownerA.address, { value: nativeFee }) + + // Fetching the final token balances of ownerA and ownerB + const finalBalanceA = await myOFTA.balanceOf(ownerA.address) + const finalBalanceB = await myOFTB.balanceOf(ownerB.address) + + // Asserting that the final balances are as expected after the send operation + expect(finalBalanceA).eql(initialAmount.sub(tokensToSend)) + expect(finalBalanceB).eql(tokensToSend) + }) +}) diff --git a/examples/oft-main/test/mocks/ERC20Mock.sol b/examples/oft-main/test/mocks/ERC20Mock.sol new file mode 100644 index 0000000000..6ce17e4184 --- /dev/null +++ b/examples/oft-main/test/mocks/ERC20Mock.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.20; + +import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; + +contract ERC20Mock is ERC20 { + constructor(string memory _name, string memory _symbol) ERC20(_name, _symbol) {} + + function mint(address _to, uint256 _amount) public { + _mint(_to, _amount); + } +} diff --git a/examples/oft-main/test/mocks/OFTComposerMock.sol b/examples/oft-main/test/mocks/OFTComposerMock.sol new file mode 100644 index 0000000000..fdd5c24264 --- /dev/null +++ b/examples/oft-main/test/mocks/OFTComposerMock.sol @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.0; + +import { IOAppComposer } from "@layerzerolabs/oapp-evm/contracts/oapp/interfaces/IOAppComposer.sol"; + +contract OFTComposerMock is IOAppComposer { + // default empty values for testing a lzCompose received message + address public from; + bytes32 public guid; + bytes public message; + address public executor; + bytes public extraData; + + function lzCompose( + address _from, + bytes32 _guid, + bytes calldata _message, + address _executor, + bytes calldata /*_extraData*/ + ) external payable { + from = _from; + guid = _guid; + message = _message; + executor = _executor; + extraData = _message; + } +} diff --git a/examples/oft-main/test/mocks/OFTMock.sol b/examples/oft-main/test/mocks/OFTMock.sol new file mode 100644 index 0000000000..cef8770f55 --- /dev/null +++ b/examples/oft-main/test/mocks/OFTMock.sol @@ -0,0 +1,59 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.0; + +import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; +import { OFT } from "@layerzerolabs/oft-evm/contracts/OFT.sol"; +import { SendParam } from "@layerzerolabs/oft-evm/contracts/OFTCore.sol"; + +contract OFTMock is OFT { + constructor( + string memory _name, + string memory _symbol, + address _lzEndpoint, + address _delegate + ) Ownable(_delegate) OFT(_name, _symbol, _lzEndpoint, _delegate) {} + + function mint(address _to, uint256 _amount) public { + _mint(_to, _amount); + } + + // @dev expose internal functions for testing purposes + function debit( + uint256 _amountToSendLD, + uint256 _minAmountToCreditLD, + uint32 _dstEid + ) public returns (uint256 amountDebitedLD, uint256 amountToCreditLD) { + return _debit(msg.sender, _amountToSendLD, _minAmountToCreditLD, _dstEid); + } + + function debitView( + uint256 _amountToSendLD, + uint256 _minAmountToCreditLD, + uint32 _dstEid + ) public view returns (uint256 amountDebitedLD, uint256 amountToCreditLD) { + return _debitView(_amountToSendLD, _minAmountToCreditLD, _dstEid); + } + + function removeDust(uint256 _amountLD) public view returns (uint256 amountLD) { + return _removeDust(_amountLD); + } + + function toLD(uint64 _amountSD) public view returns (uint256 amountLD) { + return _toLD(_amountSD); + } + + function toSD(uint256 _amountLD) public view returns (uint64 amountSD) { + return _toSD(_amountLD); + } + + function credit(address _to, uint256 _amountToCreditLD, uint32 _srcEid) public returns (uint256 amountReceivedLD) { + return _credit(_to, _amountToCreditLD, _srcEid); + } + + function buildMsgAndOptions( + SendParam calldata _sendParam, + uint256 _amountToCreditLD + ) public view returns (bytes memory message, bytes memory options) { + return _buildMsgAndOptions(_sendParam, _amountToCreditLD); + } +} diff --git a/examples/oft-main/tsconfig.json b/examples/oft-main/tsconfig.json new file mode 100644 index 0000000000..6bedb2f64a --- /dev/null +++ b/examples/oft-main/tsconfig.json @@ -0,0 +1,13 @@ +{ + "exclude": ["node_modules"], + "compilerOptions": { + "target": "es2020", + "module": "nodenext", + "esModuleInterop": true, + "moduleResolution": "nodenext", + "forceConsistentCasingInFileNames": true, + "strict": true, + "skipLibCheck": true, + "resolveJsonModule": true + } +} diff --git a/examples/oft-main/turbo.json b/examples/oft-main/turbo.json new file mode 100644 index 0000000000..b38dc23a02 --- /dev/null +++ b/examples/oft-main/turbo.json @@ -0,0 +1,8 @@ +{ + "extends": ["//"], + "pipeline": { + "compile": { + "outputs": ["target/**"] + } + } +} diff --git a/packages/devtools-starknet/.eslintignore b/packages/devtools-starknet/.eslintignore new file mode 100644 index 0000000000..de4d1f007d --- /dev/null +++ b/packages/devtools-starknet/.eslintignore @@ -0,0 +1,2 @@ +dist +node_modules diff --git a/packages/devtools-starknet/.eslintrc.json b/packages/devtools-starknet/.eslintrc.json new file mode 100644 index 0000000000..be97c53fbb --- /dev/null +++ b/packages/devtools-starknet/.eslintrc.json @@ -0,0 +1,3 @@ +{ + "extends": "../../.eslintrc.json" +} diff --git a/packages/devtools-starknet/.prettierignore b/packages/devtools-starknet/.prettierignore new file mode 100644 index 0000000000..1eae0cf670 --- /dev/null +++ b/packages/devtools-starknet/.prettierignore @@ -0,0 +1,2 @@ +dist/ +node_modules/ diff --git a/packages/devtools-starknet/CHANGELOG.md b/packages/devtools-starknet/CHANGELOG.md new file mode 100644 index 0000000000..bd25c28af7 --- /dev/null +++ b/packages/devtools-starknet/CHANGELOG.md @@ -0,0 +1,5 @@ +# @layerzerolabs/devtools-starknet + +## 0.1.0 + +- Initial release. diff --git a/packages/devtools-starknet/README.md b/packages/devtools-starknet/README.md new file mode 100644 index 0000000000..b05cf14341 --- /dev/null +++ b/packages/devtools-starknet/README.md @@ -0,0 +1,9 @@ +

+ + LayerZero + +

+ +

@layerzerolabs/devtools-starknet

+ +Utilities for working with LayerZero Starknet contracts. diff --git a/packages/devtools-starknet/package.json b/packages/devtools-starknet/package.json new file mode 100644 index 0000000000..6d6290130a --- /dev/null +++ b/packages/devtools-starknet/package.json @@ -0,0 +1,66 @@ +{ + "name": "@layerzerolabs/devtools-starknet", + "version": "0.1.0", + "description": "Developer utilities for working with LayerZero Starknet contracts", + "repository": { + "type": "git", + "url": "git+https://github.com/LayerZero-Labs/devtools.git", + "directory": "packages/devtools-starknet" + }, + "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-v2-utilities": "^3.0.148", + "@layerzerolabs/protocol-starknet-v2": "^0.2.19", + "@swc/core": "^1.4.0", + "@swc/jest": "^0.2.36", + "@types/jest": "^29.5.12", + "jest": "^29.7.0", + "starknet": "^8.9.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", + "starknet": "^8.9.0" + }, + "publishConfig": { + "access": "public" + } +} diff --git a/packages/devtools-starknet/src/common/addresses.ts b/packages/devtools-starknet/src/common/addresses.ts new file mode 100644 index 0000000000..2beeee2845 --- /dev/null +++ b/packages/devtools-starknet/src/common/addresses.ts @@ -0,0 +1,9 @@ +const STARKNET_HEX_REGEX = /^0x[0-9a-fA-F]{1,64}$/ + +export const isStarknetAddress = (value: string): boolean => STARKNET_HEX_REGEX.test(value) + +export const assertStarknetAddress = (value: string, label = 'address'): void => { + if (!isStarknetAddress(value)) { + throw new Error(`Invalid Starknet ${label}: ${value}`) + } +} diff --git a/packages/devtools-starknet/src/common/index.ts b/packages/devtools-starknet/src/common/index.ts new file mode 100644 index 0000000000..897b610db2 --- /dev/null +++ b/packages/devtools-starknet/src/common/index.ts @@ -0,0 +1 @@ +export * from './addresses' diff --git a/packages/devtools-starknet/src/connection/factory.ts b/packages/devtools-starknet/src/connection/factory.ts new file mode 100644 index 0000000000..f99988bdac --- /dev/null +++ b/packages/devtools-starknet/src/connection/factory.ts @@ -0,0 +1,22 @@ +import pMemoize from 'p-memoize' +import { type RpcUrlFactory } from '@layerzerolabs/devtools' +import type { EndpointId } from '@layerzerolabs/lz-definitions' +import { RpcProvider } from 'starknet' +import type { ConnectionFactory } from './types' + +export const defaultRpcUrlFactory: RpcUrlFactory = (eid) => { + throw new Error( + `No default Starknet RPC URL configured for eid ${eid}. Provide an override via createRpcUrlFactory().` + ) +} + +export const createRpcUrlFactory = + (overrides: Partial> = {}): RpcUrlFactory => + (eid) => + overrides[eid] ?? + process.env.RPC_URL_STARKNET ?? + process.env.RPC_URL_STARKNET_TESTNET ?? + defaultRpcUrlFactory(eid) + +export const createConnectionFactory = (urlFactory: RpcUrlFactory = defaultRpcUrlFactory): ConnectionFactory => + pMemoize(async (eid) => new RpcProvider({ nodeUrl: await urlFactory(eid) })) diff --git a/packages/devtools-starknet/src/connection/index.ts b/packages/devtools-starknet/src/connection/index.ts new file mode 100644 index 0000000000..97a7b59914 --- /dev/null +++ b/packages/devtools-starknet/src/connection/index.ts @@ -0,0 +1,2 @@ +export * from './factory' +export * from './types' diff --git a/packages/devtools-starknet/src/connection/types.ts b/packages/devtools-starknet/src/connection/types.ts new file mode 100644 index 0000000000..4e19316a6c --- /dev/null +++ b/packages/devtools-starknet/src/connection/types.ts @@ -0,0 +1,4 @@ +import type { RpcProvider } from 'starknet' +import type { EndpointId } from '@layerzerolabs/lz-definitions' + +export type ConnectionFactory = (eid: EndpointId) => Promise diff --git a/packages/devtools-starknet/src/index.ts b/packages/devtools-starknet/src/index.ts new file mode 100644 index 0000000000..ded5780815 --- /dev/null +++ b/packages/devtools-starknet/src/index.ts @@ -0,0 +1,4 @@ +export * from './common' +export * from './connection' +export * from './omnigraph' +export * from './transactions' diff --git a/packages/devtools-starknet/src/omnigraph/coordinates.ts b/packages/devtools-starknet/src/omnigraph/coordinates.ts new file mode 100644 index 0000000000..0742758b51 --- /dev/null +++ b/packages/devtools-starknet/src/omnigraph/coordinates.ts @@ -0,0 +1,10 @@ +import type { OmniPoint } from '@layerzerolabs/devtools' +import { ChainType, endpointIdToChainType, type EndpointId } from '@layerzerolabs/lz-definitions' +import { assertStarknetAddress } from '../common' + +export const createStarknetPoint = (eid: EndpointId, address: string): OmniPoint => { + assertStarknetAddress(address) + return { eid, address } +} + +export const isOmniPointOnStarknet = ({ eid }: OmniPoint): boolean => endpointIdToChainType(eid) === ChainType.STARKNET diff --git a/packages/devtools-starknet/src/omnigraph/index.ts b/packages/devtools-starknet/src/omnigraph/index.ts new file mode 100644 index 0000000000..02b48ea20f --- /dev/null +++ b/packages/devtools-starknet/src/omnigraph/index.ts @@ -0,0 +1,3 @@ +export * from './coordinates' +export * from './sdk' +export * from './types' diff --git a/packages/devtools-starknet/src/omnigraph/sdk.ts b/packages/devtools-starknet/src/omnigraph/sdk.ts new file mode 100644 index 0000000000..29ba4795a2 --- /dev/null +++ b/packages/devtools-starknet/src/omnigraph/sdk.ts @@ -0,0 +1,24 @@ +import type { Call, RpcProvider } from 'starknet' +import { formatOmniPoint, OmniPoint, OmniTransaction } from '@layerzerolabs/devtools' +import { createModuleLogger, type Logger } from '@layerzerolabs/io-devtools' +import type { IOmniSDK } from './types' +import { serializeStarknetCalls } from '../transactions' + +export class OmniSDK implements IOmniSDK { + constructor( + public readonly provider: RpcProvider, + public readonly point: OmniPoint, + protected readonly logger: Logger = createModuleLogger(`Starknet SDK @ ${formatOmniPoint(point)}`) + ) {} + + get label(): string { + return `Starknet contract @ ${formatOmniPoint(this.point)}` + } + + protected createTransaction(calls: Call[]): OmniTransaction { + return { + point: this.point, + data: serializeStarknetCalls(calls), + } + } +} diff --git a/packages/devtools-starknet/src/omnigraph/types.ts b/packages/devtools-starknet/src/omnigraph/types.ts new file mode 100644 index 0000000000..4f75ffaa06 --- /dev/null +++ b/packages/devtools-starknet/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-starknet/src/transactions/index.ts b/packages/devtools-starknet/src/transactions/index.ts new file mode 100644 index 0000000000..18aee9d5ff --- /dev/null +++ b/packages/devtools-starknet/src/transactions/index.ts @@ -0,0 +1,2 @@ +export * from './serde' +export * from './signer' diff --git a/packages/devtools-starknet/src/transactions/serde.ts b/packages/devtools-starknet/src/transactions/serde.ts new file mode 100644 index 0000000000..43933f5cc2 --- /dev/null +++ b/packages/devtools-starknet/src/transactions/serde.ts @@ -0,0 +1,6 @@ +import type { Call } from 'starknet' + +export const serializeStarknetCalls = (calls: Call[]): string => + JSON.stringify(calls, (_key, value) => (typeof value === 'bigint' ? value.toString() : value)) + +export const deserializeStarknetCalls = (data: string): Call[] => JSON.parse(data) as Call[] diff --git a/packages/devtools-starknet/src/transactions/signer.ts b/packages/devtools-starknet/src/transactions/signer.ts new file mode 100644 index 0000000000..cad0e74189 --- /dev/null +++ b/packages/devtools-starknet/src/transactions/signer.ts @@ -0,0 +1,59 @@ +import type { Account, Call, RpcProvider } from 'starknet' +import { + OmniSigner, + OmniSignerBase, + type OmniSignerFactory, + type OmniTransaction, + type OmniTransactionReceipt, + type OmniTransactionResponse, + OmniPoint, +} from '@layerzerolabs/devtools' +import type { EndpointId } from '@layerzerolabs/lz-definitions' +import { deserializeStarknetCalls } from './serde' +import { createModuleLogger, type Logger } from '@layerzerolabs/io-devtools' + +export class OmniSignerStarknet extends OmniSignerBase implements OmniSigner { + constructor( + eid: EndpointId, + public readonly provider: RpcProvider, + public readonly account: Account, + protected readonly logger: Logger = createModuleLogger('OmniSignerStarknet') + ) { + super(eid) + } + + getPoint(): OmniPoint { + return { eid: this.eid, address: this.account.address } + } + + async sign(): Promise { + throw new Error('Starknet OmniSigner does not support offline signing. Use signAndSend instead.') + } + + async signAndSend(transaction: OmniTransaction): Promise> { + this.assertTransaction(transaction) + + const calls = deserializeStarknetCalls(transaction.data) as Call[] + const response = await this.account.execute(calls) + const transactionHash = response.transaction_hash + + return { + transactionHash, + wait: async () => { + await this.provider.waitForTransaction(transactionHash) + return { transactionHash } + }, + } + } +} + +export type StarknetAccountFactory = (eid: EndpointId) => Promise +export type StarknetProviderFactory = (eid: EndpointId) => Promise + +export const createStarknetSignerFactory = + ( + accountFactory: StarknetAccountFactory, + providerFactory: StarknetProviderFactory + ): OmniSignerFactory>> => + async (eid: EndpointId) => + new OmniSignerStarknet(eid, await providerFactory(eid), await accountFactory(eid)) diff --git a/packages/devtools-starknet/tsconfig.json b/packages/devtools-starknet/tsconfig.json new file mode 100644 index 0000000000..75eba9f992 --- /dev/null +++ b/packages/devtools-starknet/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "rootDir": "src", + "outDir": "dist" + }, + "include": ["src"] +} diff --git a/packages/devtools-starknet/tsup.config.ts b/packages/devtools-starknet/tsup.config.ts new file mode 100644 index 0000000000..cbe50c7c92 --- /dev/null +++ b/packages/devtools-starknet/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-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 @@ +

+ + LayerZero + +

+ +

@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 d890dd6c36..28646f22c7 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: case ChainType.STARKNET: return toBytes32(fromHex(address)) @@ -131,6 +132,7 @@ export const denormalizePeer = (bytes: Uint8Array | null | undefined, eid: Endpo return bs58.encode(toBytes32(bytes)) case ChainType.APTOS: + case ChainType.SUI: case ChainType.STARKNET: return toHex(toBytes32(bytes)) @@ -194,10 +196,18 @@ export const toHex = (bytes: Uint8Array): string => `0x${Buffer.from(bytes).toSt /** * Helper utility to convert a hex string (with or without leading `0x`) to `UInt8Array` * + * Note: Buffer.from(str, 'hex') silently truncates the last character if the string + * has odd length. We pad with a leading '0' to prevent data loss. + * * @param {string} hex * @returns {Uint8Array} */ -export const fromHex = (hex: string): Uint8Array => Uint8Array.from(Buffer.from(hex.replace(/^0x/, ''), 'hex')) +export const fromHex = (hex: string): Uint8Array => { + const stripped = hex.replace(/^0x/, '') + // Pad with leading '0' if odd length to prevent Buffer.from truncation + const padded = stripped.length % 2 === 1 ? '0' + stripped : stripped + return Uint8Array.from(Buffer.from(padded, 'hex')) +} /** * Helper utility that returns the leftmost bytes after removing the rightmost `length` bytes from a UInt8Array. diff --git a/packages/protocol-devtools-starknet/.eslintignore b/packages/protocol-devtools-starknet/.eslintignore new file mode 100644 index 0000000000..de4d1f007d --- /dev/null +++ b/packages/protocol-devtools-starknet/.eslintignore @@ -0,0 +1,2 @@ +dist +node_modules diff --git a/packages/protocol-devtools-starknet/.eslintrc.json b/packages/protocol-devtools-starknet/.eslintrc.json new file mode 100644 index 0000000000..be97c53fbb --- /dev/null +++ b/packages/protocol-devtools-starknet/.eslintrc.json @@ -0,0 +1,3 @@ +{ + "extends": "../../.eslintrc.json" +} diff --git a/packages/protocol-devtools-starknet/.prettierignore b/packages/protocol-devtools-starknet/.prettierignore new file mode 100644 index 0000000000..1eae0cf670 --- /dev/null +++ b/packages/protocol-devtools-starknet/.prettierignore @@ -0,0 +1,2 @@ +dist/ +node_modules/ diff --git a/packages/protocol-devtools-starknet/CHANGELOG.md b/packages/protocol-devtools-starknet/CHANGELOG.md new file mode 100644 index 0000000000..1181690e98 --- /dev/null +++ b/packages/protocol-devtools-starknet/CHANGELOG.md @@ -0,0 +1,5 @@ +# @layerzerolabs/protocol-devtools-starknet + +## 0.1.0 + +- Initial release. diff --git a/packages/protocol-devtools-starknet/README.md b/packages/protocol-devtools-starknet/README.md new file mode 100644 index 0000000000..6474cd79a7 --- /dev/null +++ b/packages/protocol-devtools-starknet/README.md @@ -0,0 +1,19 @@ +

+ + LayerZero + +

+ +

@layerzerolabs/protocol-devtools-starknet

+ + +

+ + NPM Version + + Downloads + + NPM License +

+ +Utilities for working with LayerZero Starknet protocol contracts. diff --git a/packages/protocol-devtools-starknet/bin/test b/packages/protocol-devtools-starknet/bin/test new file mode 100755 index 0000000000..cb0085aeda --- /dev/null +++ b/packages/protocol-devtools-starknet/bin/test @@ -0,0 +1,7 @@ +#!/usr/bin/env bash + +if [ -z "${LZ_DEVTOOLS_ENABLE_STARKNET_TESTS}" ]; then + echo 'Starknet tests can be enabled by setting LZ_DEVTOOLS_ENABLE_STARKNET_TESTS environment variable to a non-empty value' +else + jest --ci "$@" +fi diff --git a/packages/protocol-devtools-starknet/jest.config.js b/packages/protocol-devtools-starknet/jest.config.js new file mode 100644 index 0000000000..04c8477342 --- /dev/null +++ b/packages/protocol-devtools-starknet/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-starknet/jest.setup.js b/packages/protocol-devtools-starknet/jest.setup.js new file mode 100644 index 0000000000..956faa4d5c --- /dev/null +++ b/packages/protocol-devtools-starknet/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-starknet/package.json b/packages/protocol-devtools-starknet/package.json new file mode 100644 index 0000000000..f3ca137da7 --- /dev/null +++ b/packages/protocol-devtools-starknet/package.json @@ -0,0 +1,79 @@ +{ + "name": "@layerzerolabs/protocol-devtools-starknet", + "version": "0.1.0", + "description": "Utilities for LayerZero Starknet protocol contracts", + "repository": { + "type": "git", + "url": "git+https://github.com/LayerZero-Labs/devtools.git", + "directory": "packages/protocol-devtools-starknet" + }, + "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-starknet": "~0.1.0", + "@layerzerolabs/io-devtools": "~0.3.2", + "@layerzerolabs/lz-definitions": "^3.0.148", + "@layerzerolabs/lz-v2-utilities": "^3.0.148", + "@layerzerolabs/protocol-devtools": "~3.0.2", + "@layerzerolabs/protocol-starknet-v2": "^0.2.19", + "@layerzerolabs/test-devtools": "~0.4.7", + "@layerzerolabs/test-devtools-starknet": "~0.0.1", + "@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", + "starknet": "^8.9.0", + "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-starknet": "~0.1.0", + "@layerzerolabs/io-devtools": "~0.3.2", + "@layerzerolabs/lz-definitions": "^3.0.148", + "@layerzerolabs/lz-v2-utilities": "^3.0.148", + "@layerzerolabs/protocol-devtools": "~3.0.2", + "@layerzerolabs/protocol-starknet-v2": "^0.2.19", + "starknet": "^8.9.0", + "zod": "^3.22.4" + }, + "publishConfig": { + "access": "public" + } +} diff --git a/packages/protocol-devtools-starknet/src/addresses.ts b/packages/protocol-devtools-starknet/src/addresses.ts new file mode 100644 index 0000000000..1887a15db4 --- /dev/null +++ b/packages/protocol-devtools-starknet/src/addresses.ts @@ -0,0 +1,16 @@ +import { EndpointId } from '@layerzerolabs/lz-definitions' + +export const STARKNET_ENDPOINT_V2_ADDRESSES: Partial> = { + [EndpointId.STARKNET_V2_MAINNET]: '0x0524e065abff21d225fb7b28f26ec2f48314ace6094bc085f0a7cf1dc2660f68', + [EndpointId.STARKNET_V2_TESTNET]: '0x0316d70a6e0445a58c486215fac8ead48d3db985acde27efca9130da4c675878', +} + +export const STARKNET_ULN_302_ADDRESSES: Partial> = { + [EndpointId.STARKNET_V2_MAINNET]: '0x0727f40349719ac76861a51a0b3d3e07be1577fff137bb81a5dc32e5a5c61d38', + [EndpointId.STARKNET_V2_TESTNET]: '0x0706572d6f7b938c813a20dc1b0328b83de939066e25bd0fbe14c270077f769d', +} + +export const STARKNET_EXECUTOR_ADDRESSES: Partial> = { + [EndpointId.STARKNET_V2_MAINNET]: '0x03887bd8da2999d39e2e88fe55733c4cac8e20a6d51bfe162176c9f2eb134c65', + [EndpointId.STARKNET_V2_TESTNET]: '0x068ffdaca6533001344f377beaf1137360168604b227df3e8cf735fe06da47a9', +} diff --git a/packages/protocol-devtools-starknet/src/endpointv2/index.ts b/packages/protocol-devtools-starknet/src/endpointv2/index.ts new file mode 100644 index 0000000000..7db67b18a1 --- /dev/null +++ b/packages/protocol-devtools-starknet/src/endpointv2/index.ts @@ -0,0 +1 @@ +export * from './sdk' diff --git a/packages/protocol-devtools-starknet/src/endpointv2/sdk.ts b/packages/protocol-devtools-starknet/src/endpointv2/sdk.ts new file mode 100644 index 0000000000..01744035ab --- /dev/null +++ b/packages/protocol-devtools-starknet/src/endpointv2/sdk.ts @@ -0,0 +1,415 @@ +import type { + IEndpointV2, + IUlnRead, + MessageParams, + MessagingFee, + SetConfigParam, + Timeout, + Uln302ConfigType, + Uln302ExecutorConfig, + Uln302SetExecutorConfig, + Uln302SetUlnConfig, + Uln302UlnConfig, + Uln302UlnUserConfig, + UlnReadSetUlnConfig, + UlnReadUlnConfig, + UlnReadUlnUserConfig, +} from '@layerzerolabs/protocol-devtools' +import { type EndpointId } from '@layerzerolabs/lz-definitions' +import { + formatEid, + type Bytes32, + type OmniAddress, + type OmniTransaction, + type PossiblyBytes, +} from '@layerzerolabs/devtools' +import { OmniSDK } from '@layerzerolabs/devtools-starknet' +import type { Call, Contract } from 'starknet' +import type { Uln302 } from '../uln302' +import { STARKNET_ENDPOINT_V2_ADDRESSES } from '../addresses' +import { + encodeExecutorConfig, + encodeUlnConfig, + getEndpointV2Contract, + getOAppContract, + MessageLibConfigType, +} from '../protocol' + +const RECEIVE_ULN_CONFIG_TYPE = 3 + +export class EndpointV2 extends OmniSDK implements IEndpointV2 { + private endpoint?: Contract + + async getUln302SDK(address: OmniAddress): Promise { + this.logger.debug(`Getting Uln302 SDK for address ${address}`) + const { Uln302 } = await import('../uln302') + return new Uln302(this.provider, { eid: this.point.eid, address }) + } + + async getUlnReadSDK(_address: OmniAddress): Promise { + throw new Error('ULN Read functionality is not supported for Starknet.') + } + + async getDelegate(_oapp: OmniAddress): Promise { + const oapp = await this.getOApp(_oapp) + if (!('get_delegate' in oapp)) { + return this.notImplemented('getDelegate') + } + const result = await (oapp as any).get_delegate() + return this.parseFelt(result) + } + + async isDelegate(_oapp: OmniAddress, _delegate: OmniAddress): Promise { + const delegate = await this.getDelegate(_oapp) + return delegate === _delegate + } + + async getDefaultReceiveLibrary(_eid: EndpointId): Promise { + const endpoint = await this.getEndpoint() + const result = await (endpoint as any).get_default_receive_library(_eid) + return this.parseFelt(result) + } + + async setDefaultReceiveLibrary( + _eid: EndpointId, + _uln: OmniAddress | null | undefined, + _gracePeriod: bigint = 0n + ): Promise { + return this.notImplemented('setDefaultReceiveLibrary') + } + + async getDefaultSendLibrary(_eid: EndpointId): Promise { + const endpoint = await this.getEndpoint() + const result = await (endpoint as any).get_default_send_library(_eid) + return this.parseFelt(result) + } + + async setDefaultSendLibrary(_eid: EndpointId, _uln: OmniAddress | null | undefined): Promise { + return this.notImplemented('setDefaultSendLibrary') + } + + 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 endpoint = await this.getEndpoint() + const result = await (endpoint as any).get_send_library(_sender, _dstEid) + return this.parseFelt(result?.lib ?? result) + } + + async getReceiveLibrary( + _receiver: OmniAddress, + _srcEid: EndpointId + ): Promise<[address: Bytes32 | undefined, isDefault: boolean]> { + const endpoint = await this.getEndpoint() + const result = await (endpoint as any).get_receive_library(_receiver, _srcEid) + const address = this.parseFelt(result?.lib ?? result) + const isDefault = Boolean(result?.is_default) + return [address, isDefault] + } + + async getDefaultReceiveLibraryTimeout(_eid: EndpointId): Promise { + return this.notImplemented('getDefaultReceiveLibraryTimeout') + } + + async getReceiveLibraryTimeout(_receiver: OmniAddress, _srcEid: EndpointId): Promise { + return this.notImplemented('getReceiveLibraryTimeout') + } + + async setSendLibrary(_oapp: OmniAddress, _eid: EndpointId, _uln: OmniAddress): Promise { + const endpoint = await this.getEndpoint() + const call = (endpoint as any).populateTransaction.set_send_library(_oapp, _eid, _uln) + return this.createTransactionWithDescription([call], `Setting send library for ${formatEid(_eid)} to ${_uln}`) + } + + async isDefaultSendLibrary(_sender: PossiblyBytes, _dstEid: EndpointId): Promise { + // Get the send library for this sender and destination + const sendLib = await this.getSendLibrary(String(_sender), _dstEid) + // Get the default send library for this destination + const defaultLib = await this.getDefaultSendLibrary(_dstEid) + // If the send library matches the default, or if no specific send library is set, it's using the default + return sendLib === defaultLib || sendLib == null + } + + async setReceiveLibrary( + _oapp: OmniAddress, + _eid: EndpointId, + _uln: OmniAddress, + _gracePeriod: bigint + ): Promise { + const endpoint = await this.getEndpoint() + const call = (endpoint as any).populateTransaction.set_receive_library(_oapp, _eid, _uln, _gracePeriod) + return this.createTransactionWithDescription( + [call], + `Setting receive library for ${formatEid(_eid)} to ${_uln}` + ) + } + + async setReceiveLibraryTimeout( + _oapp: OmniAddress, + _eid: EndpointId, + _uln: OmniAddress, + _expiry: bigint + ): Promise { + return this.notImplemented('setReceiveLibraryTimeout') + } + + 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 { + const endpoint = await this.getEndpoint() + return _setExecutorConfig.map(({ eid, executorConfig }) => { + const encoded = encodeExecutorConfig({ + max_message_size: executorConfig.maxMessageSize, + executor: executorConfig.executor, + }) + const call = (endpoint as any).populateTransaction.set_send_configs(String(_oapp), String(_uln), [ + { + eid, + config_type: MessageLibConfigType.EXECUTOR, + config: encoded, + }, + ]) + return this.createTransactionWithDescription([call], `Setting executor config for ${formatEid(eid)}`) + }) + } + + 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 Starknet.') + } + + 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 Starknet.') + } + + async setUlnConfig( + _oapp: OmniAddress, + _uln: OmniAddress, + _setUlnConfig: Uln302SetUlnConfig[] + ): Promise { + const endpoint = await this.getEndpoint() + return _setUlnConfig.map(({ eid, ulnConfig, type }) => { + const encoded = encodeUlnConfig({ + confirmations: ulnConfig.confirmations ?? 0n, + required_dvns: ulnConfig.requiredDVNs, + optional_dvns: ulnConfig.optionalDVNs ?? [], + optional_dvn_threshold: ulnConfig.optionalDVNThreshold ?? 0, + }) + const call = + type === 'send' + ? (endpoint as any).populateTransaction.set_send_configs(_oapp, _uln, [ + { + eid, + config_type: MessageLibConfigType.ULN, + config: encoded, + }, + ]) + : (endpoint as any).populateTransaction.set_receive_configs(_oapp, _uln, [ + { + eid, + config_type: MessageLibConfigType.ULN, + config: encoded, + }, + ]) + return this.createTransactionWithDescription([call], `Setting ${type} ULN config for ${formatEid(eid)}`) + }) + } + + async setUlnReadConfig( + _oapp: OmniAddress, + _uln: OmniAddress, + _setUlnConfig: UlnReadSetUlnConfig[] + ): Promise { + throw new Error('ULN Read functionality is not supported for Starknet.') + } + + async getUlnConfigParams(_uln: OmniAddress, _setUlnConfig: Uln302SetUlnConfig[]): Promise { + return _setUlnConfig.map(({ eid, ulnConfig, type }) => { + return { + eid, + configType: type === 'send' ? MessageLibConfigType.ULN : RECEIVE_ULN_CONFIG_TYPE, + config: encodeUlnConfig({ + confirmations: ulnConfig.confirmations ?? 0n, + required_dvns: ulnConfig.requiredDVNs, + optional_dvns: ulnConfig.optionalDVNs ?? [], + optional_dvn_threshold: ulnConfig.optionalDVNThreshold ?? 0, + }), + } + }) + } + + async getUlnReadConfigParams(_uln: OmniAddress, _setUlnConfig: UlnReadSetUlnConfig[]): Promise { + throw new Error('ULN Read functionality is not supported for Starknet.') + } + + async getExecutorConfigParams( + _uln: OmniAddress, + _setExecutorConfig: Uln302SetExecutorConfig[] + ): Promise { + return _setExecutorConfig.map(({ eid, executorConfig }) => ({ + eid, + configType: MessageLibConfigType.EXECUTOR, + config: encodeExecutorConfig({ + max_message_size: executorConfig.maxMessageSize, + executor: executorConfig.executor, + }), + })) + } + + async setConfig( + _oapp: OmniAddress, + _uln: OmniAddress, + _setConfigParam: SetConfigParam[] + ): Promise { + const endpoint = await this.getEndpoint() + return _setConfigParam.map(({ eid, configType, config }) => { + if (configType === RECEIVE_ULN_CONFIG_TYPE) { + const call = (endpoint as any).populateTransaction.set_receive_configs(_oapp, _uln, [ + { + eid, + config_type: MessageLibConfigType.ULN, + config, + }, + ]) + return this.createTransactionWithDescription([call], `Setting receive ULN config for ${formatEid(eid)}`) + } + + const call = (endpoint as any).populateTransaction.set_send_configs(_oapp, _uln, [ + { + eid, + config_type: configType, + config, + }, + ]) + return this.createTransactionWithDescription( + [call], + `Setting send config ${configType} for ${formatEid(eid)}` + ) + }) + } + + async quote(_params: MessageParams, _sender: OmniAddress): Promise { + return this.notImplemented('quote') + } + + private notImplemented(method: string): never { + throw new TypeError(`${method}() not implemented on Starknet Endpoint SDK`) + } + + private async getEndpoint(): Promise { + if (!this.endpoint) { + const endpointAddress = STARKNET_ENDPOINT_V2_ADDRESSES[this.point.eid] + if (!endpointAddress) { + throw new Error(`Missing Starknet EndpointV2 address for eid ${this.point.eid}`) + } + this.endpoint = getEndpointV2Contract(endpointAddress, this.provider) + } + return this.endpoint! + } + + private async getOApp(address: OmniAddress): Promise { + return getOAppContract(address, this.provider) + } + + protected override createTransaction(calls: Call[]): OmniTransaction { + return super.createTransaction(calls) + } + + private createTransactionWithDescription(calls: Call[], description: string): OmniTransaction { + return { ...super.createTransaction(calls), description } + } + + private parseFelt(value: unknown): string | undefined { + if (value == null) { + return undefined + } + let hexValue: string | undefined + if (typeof value === 'string') { + hexValue = value + } else if (typeof value === 'bigint') { + hexValue = `0x${value.toString(16)}` + } else if (typeof value === 'object' && value !== null && 'value' in value) { + const feltValue = (value as { value: bigint | string }).value + hexValue = typeof feltValue === 'bigint' ? `0x${feltValue.toString(16)}` : String(feltValue) + } + // Normalize Starknet felt252 addresses by removing leading zeros after 0x + // This ensures consistent comparison regardless of how addresses are formatted + // e.g., 0x0727f... and 0x727f... should be treated as the same address + if (hexValue) { + const normalized = hexValue.toLowerCase().replace(/^0x0*/, '0x') + return normalized === '0x' ? '0x0' : normalized + } + return undefined + } +} diff --git a/packages/protocol-devtools-starknet/src/index.ts b/packages/protocol-devtools-starknet/src/index.ts new file mode 100644 index 0000000000..8571ea73f9 --- /dev/null +++ b/packages/protocol-devtools-starknet/src/index.ts @@ -0,0 +1,4 @@ +export * from './addresses' +export * from './protocol' +export * from './endpointv2' +export * from './uln302' diff --git a/packages/protocol-devtools-starknet/src/protocol.ts b/packages/protocol-devtools-starknet/src/protocol.ts new file mode 100644 index 0000000000..9a088a2f3f --- /dev/null +++ b/packages/protocol-devtools-starknet/src/protocol.ts @@ -0,0 +1,66 @@ +import { Contract } from 'starknet' +import { abi } from '@layerzerolabs/protocol-starknet-v2' + +type StarknetProvider = unknown + +export enum MessageLibConfigType { + EXECUTOR = 1, + ULN = 2, +} + +type ExecutorConfigInput = { + max_message_size?: number + maxMessageSize?: number + executor: string +} + +type UlnConfigInput = { + confirmations?: bigint | number + required_dvns?: string[] + requiredDVNs?: string[] + optional_dvns?: string[] + optionalDVNs?: string[] + optional_dvn_threshold?: number + optionalDVNThreshold?: number +} + +const toBoolFelt = (value: boolean) => (value ? 1 : 0) + +export const encodeExecutorConfig = (config: ExecutorConfigInput): (string | number | bigint)[] => { + const maxMessageSize = config.max_message_size ?? config.maxMessageSize ?? 0 + return [maxMessageSize, config.executor] +} + +export const encodeUlnConfig = (config: UlnConfigInput): (string | number | bigint)[] => { + const confirmations = BigInt(config.confirmations ?? 0) + const requiredDvns = config.required_dvns ?? config.requiredDVNs ?? [] + const optionalDvns = config.optional_dvns ?? config.optionalDVNs ?? [] + const optionalThreshold = config.optional_dvn_threshold ?? config.optionalDVNThreshold ?? 0 + const hasConfirmations = confirmations !== 0n + const hasRequiredDvns = requiredDvns.length > 0 + const hasOptionalDvns = optionalDvns.length > 0 + + return [ + confirmations, + toBoolFelt(hasConfirmations), + requiredDvns.length, + ...requiredDvns, + toBoolFelt(hasRequiredDvns), + optionalDvns.length, + ...optionalDvns, + optionalThreshold, + toBoolFelt(hasOptionalDvns), + ] +} + +const createContract = (contractAbi: unknown, address: string, provider: StarknetProvider) => + new (Contract as any)({ abi: contractAbi, address, providerOrAccount: provider }) + +export const getEndpointV2Contract = (address: string, provider: StarknetProvider) => + createContract(abi.endpointV2, address, provider) + +export const getOAppContract = (address: string, provider: StarknetProvider) => + createContract(abi.oApp, address, provider) + +export const getUltraLightNodeContractWithAddress = (address: string, provider: StarknetProvider) => + createContract(abi.ultraLightNode302, address, provider) diff --git a/packages/protocol-devtools-starknet/src/uln302/index.ts b/packages/protocol-devtools-starknet/src/uln302/index.ts new file mode 100644 index 0000000000..7db67b18a1 --- /dev/null +++ b/packages/protocol-devtools-starknet/src/uln302/index.ts @@ -0,0 +1 @@ +export * from './sdk' diff --git a/packages/protocol-devtools-starknet/src/uln302/sdk.ts b/packages/protocol-devtools-starknet/src/uln302/sdk.ts new file mode 100644 index 0000000000..9fed972057 --- /dev/null +++ b/packages/protocol-devtools-starknet/src/uln302/sdk.ts @@ -0,0 +1,144 @@ +import type { + IUln302, + Uln302ConfigType, + Uln302ExecutorConfig, + Uln302UlnConfig, + Uln302UlnUserConfig, +} from '@layerzerolabs/protocol-devtools' +import type { EndpointId } from '@layerzerolabs/lz-definitions' +import type { OmniAddress, OmniTransaction } from '@layerzerolabs/devtools' +import { areBytes32Equal } from '@layerzerolabs/devtools' +import { OmniSDK } from '@layerzerolabs/devtools-starknet' +import type { Contract } from 'starknet' +import { getUltraLightNodeContractWithAddress } from '../protocol' + +export class Uln302 extends OmniSDK implements IUln302 { + private uln?: Contract + + async getUlnConfig( + _eid: EndpointId, + _address: OmniAddress | null | undefined, + _type: Uln302ConfigType + ): Promise { + if (!_address) { + return this.emptyUlnConfig() + } + return this.getAppUlnConfig(_eid, _address, _type) + } + + async getAppUlnConfig(_eid: EndpointId, _address: OmniAddress, _type: Uln302ConfigType): Promise { + const uln = await this.getUln() + const config = + _type === 'send' + ? await (uln as any).get_raw_oapp_uln_send_config(_address, _eid) + : await (uln as any).get_raw_oapp_uln_receive_config(_address, _eid) + return { + confirmations: config.has_confirmations ? BigInt(config.confirmations) : 0n, + requiredDVNs: config.has_required_dvns ? this.normalizeAddressArray(config.required_dvns) : [], + requiredDVNCount: config.has_required_dvns ? config.required_dvns.length : 0, + optionalDVNs: config.has_optional_dvns ? this.normalizeAddressArray(config.optional_dvns) : [], + optionalDVNThreshold: config.has_optional_dvns ? Number(config.optional_dvn_threshold) : 0, + } + } + + async hasAppUlnConfig( + _eid: EndpointId, + _oapp: OmniAddress, + _config: Uln302UlnUserConfig, + _type: Uln302ConfigType + ): Promise { + const current = await this.getAppUlnConfig(_eid, _oapp, _type) + + const confirmationsMatch = current.confirmations === (_config.confirmations ?? current.confirmations) + const requiredDvnsMatch = this.equalAddressArrays(current.requiredDVNs, _config.requiredDVNs) + const optionalDvnsMatch = this.equalAddressArrays(current.optionalDVNs, _config.optionalDVNs ?? []) + const thresholdMatch = current.optionalDVNThreshold === (_config.optionalDVNThreshold ?? 0) + + return confirmationsMatch && requiredDvnsMatch && optionalDvnsMatch && thresholdMatch + } + + async setDefaultUlnConfig(_eid: EndpointId, _config: Uln302UlnUserConfig): Promise { + return this.notImplemented('setDefaultUlnConfig') + } + + async getExecutorConfig( + _eid: EndpointId, + _address?: OmniAddress | null | undefined + ): Promise { + if (!_address) { + return { maxMessageSize: 0, executor: '0x0' } + } + return this.getAppExecutorConfig(_eid, _address) + } + + async getAppExecutorConfig(_eid: EndpointId, _address: OmniAddress): Promise { + const uln = await this.getUln() + const config = await (uln as any).get_raw_oapp_executor_config(_address, _eid) + return { + maxMessageSize: Number(config.max_message_size ?? 0), + executor: this.normalizeAddress(config.executor) ?? '0x0', + } + } + + async hasAppExecutorConfig(_eid: EndpointId, _oapp: OmniAddress, _config: Uln302ExecutorConfig): Promise { + const current = await this.getAppExecutorConfig(_eid, _oapp) + return current.maxMessageSize === _config.maxMessageSize && areBytes32Equal(current.executor, _config.executor) + } + + async setDefaultExecutorConfig(_eid: EndpointId, _config: Uln302ExecutorConfig): Promise { + return this.notImplemented('setDefaultExecutorConfig') + } + + private notImplemented(method: string): never { + throw new TypeError(`${method}() not implemented on Starknet ULN302 SDK`) + } + + private async getUln(): Promise { + if (!this.uln) { + this.uln = await getUltraLightNodeContractWithAddress(this.point.address, this.provider) + } + return this.uln! + } + + private emptyUlnConfig(): Uln302UlnConfig { + return { + confirmations: 0n, + requiredDVNs: [], + requiredDVNCount: 0, + optionalDVNs: [], + optionalDVNThreshold: 0, + } + } + + private equalAddressArrays(left: string[], right: string[]): boolean { + if (left.length !== right.length) { + return false + } + // Use areBytes32Equal for address comparison to handle leading zero differences + const normalizedLeft = [...left].sort() + const normalizedRight = [...right].sort() + return normalizedLeft.every((value, index) => areBytes32Equal(value, normalizedRight[index])) + } + + private normalizeAddress(value: unknown): string | undefined { + if (value == null) { + return undefined + } + let hexValue: string | undefined + if (typeof value === 'string') { + hexValue = value + } else if (typeof value === 'bigint') { + hexValue = `0x${value.toString(16)}` + } + // Normalize Starknet felt252 addresses by removing leading zeros after 0x + if (hexValue) { + const normalized = hexValue.toLowerCase().replace(/^0x0*/, '0x') + return normalized === '0x' ? '0x0' : normalized + } + return undefined + } + + private normalizeAddressArray(addresses: unknown[]): string[] { + return addresses.map((addr) => this.normalizeAddress(addr) ?? '0x0') + } +} diff --git a/packages/protocol-devtools-starknet/tsconfig.json b/packages/protocol-devtools-starknet/tsconfig.json new file mode 100644 index 0000000000..12774c873d --- /dev/null +++ b/packages/protocol-devtools-starknet/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-starknet/tsup.config.ts b/packages/protocol-devtools-starknet/tsup.config.ts new file mode 100644 index 0000000000..7ef46a5ad1 --- /dev/null +++ b/packages/protocol-devtools-starknet/tsup.config.ts @@ -0,0 +1,14 @@ +import { defineConfig } from 'tsup' + +export default defineConfig([ + { + entry: ['src/index.ts'], + outDir: './dist', + clean: true, + dts: true, + sourcemap: true, + splitting: false, + treeshake: true, + format: ['esm', 'cjs'], + }, +]) diff --git a/packages/protocol-devtools-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 @@ +

+ + LayerZero + +

+ +

@layerzerolabs/protocol-devtools-sui

+ + +

+ + NPM Version + + Downloads + + NPM License +

+ +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'], + }, +]) diff --git a/packages/ua-devtools-starknet/.eslintignore b/packages/ua-devtools-starknet/.eslintignore new file mode 100644 index 0000000000..de4d1f007d --- /dev/null +++ b/packages/ua-devtools-starknet/.eslintignore @@ -0,0 +1,2 @@ +dist +node_modules diff --git a/packages/ua-devtools-starknet/.eslintrc.json b/packages/ua-devtools-starknet/.eslintrc.json new file mode 100644 index 0000000000..be97c53fbb --- /dev/null +++ b/packages/ua-devtools-starknet/.eslintrc.json @@ -0,0 +1,3 @@ +{ + "extends": "../../.eslintrc.json" +} diff --git a/packages/ua-devtools-starknet/.prettierignore b/packages/ua-devtools-starknet/.prettierignore new file mode 100644 index 0000000000..1eae0cf670 --- /dev/null +++ b/packages/ua-devtools-starknet/.prettierignore @@ -0,0 +1,2 @@ +dist/ +node_modules/ diff --git a/packages/ua-devtools-starknet/CHANGELOG.md b/packages/ua-devtools-starknet/CHANGELOG.md new file mode 100644 index 0000000000..cbb231d0ce --- /dev/null +++ b/packages/ua-devtools-starknet/CHANGELOG.md @@ -0,0 +1,5 @@ +# @layerzerolabs/ua-devtools-starknet + +## 0.1.0 + +- Initial release. diff --git a/packages/ua-devtools-starknet/README.md b/packages/ua-devtools-starknet/README.md new file mode 100644 index 0000000000..ccaec12655 --- /dev/null +++ b/packages/ua-devtools-starknet/README.md @@ -0,0 +1,19 @@ +

+ + LayerZero + +

+ +

@layerzerolabs/ua-devtools-starknet

+ + +

+ + NPM Version + + Downloads + + NPM License +

+ +Utilities for working with LayerZero Starknet contracts. diff --git a/packages/ua-devtools-starknet/bin/test b/packages/ua-devtools-starknet/bin/test new file mode 100755 index 0000000000..cb0085aeda --- /dev/null +++ b/packages/ua-devtools-starknet/bin/test @@ -0,0 +1,7 @@ +#!/usr/bin/env bash + +if [ -z "${LZ_DEVTOOLS_ENABLE_STARKNET_TESTS}" ]; then + echo 'Starknet tests can be enabled by setting LZ_DEVTOOLS_ENABLE_STARKNET_TESTS environment variable to a non-empty value' +else + jest --ci "$@" +fi diff --git a/packages/ua-devtools-starknet/jest.config.js b/packages/ua-devtools-starknet/jest.config.js new file mode 100644 index 0000000000..04c8477342 --- /dev/null +++ b/packages/ua-devtools-starknet/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-starknet/jest.setup.js b/packages/ua-devtools-starknet/jest.setup.js new file mode 100644 index 0000000000..956faa4d5c --- /dev/null +++ b/packages/ua-devtools-starknet/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-starknet/package.json b/packages/ua-devtools-starknet/package.json new file mode 100644 index 0000000000..8cfa2d3fe9 --- /dev/null +++ b/packages/ua-devtools-starknet/package.json @@ -0,0 +1,83 @@ +{ + "name": "@layerzerolabs/ua-devtools-starknet", + "version": "0.1.0", + "description": "Utilities for LayerZero Starknet projects", + "repository": { + "type": "git", + "url": "git+https://github.com/LayerZero-Labs/devtools.git", + "directory": "packages/ua-devtools-starknet" + }, + "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-starknet": "~0.1.0", + "@layerzerolabs/io-devtools": "~0.3.2", + "@layerzerolabs/lz-definitions": "^3.0.148", + "@layerzerolabs/lz-v2-utilities": "^3.0.148", + "@layerzerolabs/oft-mint-burn-starknet": "^0.2.19", + "@layerzerolabs/protocol-devtools": "~3.0.2", + "@layerzerolabs/protocol-devtools-starknet": "~0.1.0", + "@layerzerolabs/protocol-starknet-v2": "^0.2.19", + "@layerzerolabs/test-devtools": "~0.4.7", + "@layerzerolabs/test-devtools-starknet": "~0.0.1", + "@layerzerolabs/ua-devtools": "~5.0.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", + "starknet": "^8.9.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/devtools-starknet": "~0.1.0", + "@layerzerolabs/io-devtools": "~0.3.2", + "@layerzerolabs/lz-definitions": "^3.0.148", + "@layerzerolabs/lz-v2-utilities": "^3.0.148", + "@layerzerolabs/oft-mint-burn-starknet": "^0.2.19", + "@layerzerolabs/protocol-devtools": "~3.0.2", + "@layerzerolabs/protocol-devtools-starknet": "~0.1.0", + "@layerzerolabs/protocol-starknet-v2": "^0.2.19", + "@layerzerolabs/ua-devtools": "~5.0.2", + "starknet": "^8.9.0" + }, + "publishConfig": { + "access": "public" + } +} diff --git a/packages/ua-devtools-starknet/src/index.ts b/packages/ua-devtools-starknet/src/index.ts new file mode 100644 index 0000000000..ab18876664 --- /dev/null +++ b/packages/ua-devtools-starknet/src/index.ts @@ -0,0 +1 @@ +export * from './oft' diff --git a/packages/ua-devtools-starknet/src/oft/config.ts b/packages/ua-devtools-starknet/src/oft/config.ts new file mode 100644 index 0000000000..a24f7146fe --- /dev/null +++ b/packages/ua-devtools-starknet/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 { isOmniPointOnStarknet } from '@layerzerolabs/devtools-starknet' +import type { IOApp, OAppConfigurator, OAppOmniGraph } from '@layerzerolabs/ua-devtools' +import { OFT } from './sdk' + +const createOFTLogger = () => createModuleLogger('OFT') +const withOFTLogger = createWithAsyncLogger(createOFTLogger) + +const isVectorFromStarknet = (vector: OmniVector): boolean => isOmniPointOnStarknet(vector.from) + +const onlyEdgesFromStarknet = ( + createTransactions: CreateTransactionsFromOmniEdges +): CreateTransactionsFromOmniEdges => { + const logger = createOFTLogger() + + return (edge, sdk, graph, createSdk) => { + if (!isVectorFromStarknet(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( + onlyEdgesFromStarknet( + withOFTLogger(async () => { + const logger = createOFTLogger() + logger.warn('Starknet OFT initConfig is not implemented yet') + return undefined + }) + ) +) + +export const initOFTAccounts = createConfigureMultiple(initConfig) diff --git a/packages/ua-devtools-starknet/src/oft/factory.ts b/packages/ua-devtools-starknet/src/oft/factory.ts new file mode 100644 index 0000000000..373e2340ce --- /dev/null +++ b/packages/ua-devtools-starknet/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-starknet' + +/** + * Syntactic sugar that creates an instance of Starknet `OFT` SDK + * based on an `OmniPoint` with help of an `ConnectionFactory`. + * + * @param {ConnectionFactory} connectionFactory A function that returns a `RpcProvider` 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-starknet/src/oft/index.ts b/packages/ua-devtools-starknet/src/oft/index.ts new file mode 100644 index 0000000000..444d96c1a3 --- /dev/null +++ b/packages/ua-devtools-starknet/src/oft/index.ts @@ -0,0 +1,3 @@ +export * from './config' +export * from './factory' +export * from './sdk' diff --git a/packages/ua-devtools-starknet/src/oft/sdk.ts b/packages/ua-devtools-starknet/src/oft/sdk.ts new file mode 100644 index 0000000000..5b5cd1f32f --- /dev/null +++ b/packages/ua-devtools-starknet/src/oft/sdk.ts @@ -0,0 +1,318 @@ +import type { IOApp, OAppEnforcedOptionParam } from '@layerzerolabs/ua-devtools' +import type { EndpointId } from '@layerzerolabs/lz-definitions' +import { formatEid, areBytes32Equal, type Bytes, type OmniAddress, type OmniTransaction } from '@layerzerolabs/devtools' +import { OmniSDK } from '@layerzerolabs/devtools-starknet' +import { EndpointV2, STARKNET_ENDPOINT_V2_ADDRESSES } from '@layerzerolabs/protocol-devtools-starknet' +import { Contract } from 'starknet' + +// OFT ABI from oft-mint-burn-starknet package - includes enforced options functions +const getOftAbi = (): unknown[] => { + try { + // eslint-disable-next-line @typescript-eslint/no-var-requires + const pkg = require('@layerzerolabs/oft-mint-burn-starknet') + return pkg.abi?.oFTMintBurnAdapter + } catch { + // Fallback to generic OApp ABI if OFT package not available + // eslint-disable-next-line @typescript-eslint/no-var-requires + const protocol = require('@layerzerolabs/protocol-starknet-v2') + return protocol.abi?.oApp + } +} + +const getOFTContract = (address: string, provider: unknown): Contract => { + const abi = getOftAbi() + return new (Contract as any)({ abi, address, providerOrAccount: provider }) +} + +const normalizeHex = (value: string): string => (value.startsWith('0x') ? value.slice(2) : value) + +const toFixedBytes = (value: unknown, size: number): Buffer => { + if (typeof value === 'string') { + const hex = normalizeHex(value).padStart(size * 2, '0') + return Buffer.from(hex.slice(-size * 2), 'hex') + } + if (typeof value === 'bigint') { + const hex = value.toString(16).padStart(size * 2, '0') + return Buffer.from(hex.slice(-size * 2), 'hex') + } + if (typeof value === 'number') { + return toFixedBytes(BigInt(value), size) + } + return Buffer.alloc(size) +} + +/** + * Convert hex string to flat calldata for Cairo ByteArray. + * + * IMPORTANT: We cannot use starknet.js's string-based ByteArray encoding + * because it re-encodes strings as UTF-8, corrupting bytes >= 128. + * For example, byte 0x80 becomes 0xc2 0x80 in UTF-8. + * + * Instead, we return the flat calldata representation that matches Cairo's + * ByteArray serialization format: + * [data_len, ...data_words, pending_word, pending_word_len] + * + * This is used with Calldata.compile() to bypass starknet.js's ByteArray handling. + */ +const hexToByteArrayCalldata = (hex: string): string[] => { + const clean = normalizeHex(hex || '') + if (!clean) { + return ['0', '0x0', '0'] + } + + const buffer = Buffer.from(clean, 'hex') + const calldata: string[] = [] + + // Each data chunk is 31 bytes + const chunkSize = 31 + let offset = 0 + const dataWords: string[] = [] + + // Process full 31-byte chunks + while (offset + chunkSize <= buffer.length) { + const chunk = buffer.subarray(offset, offset + chunkSize) + dataWords.push('0x' + chunk.toString('hex')) + offset += chunkSize + } + + // Add data array: length followed by elements + calldata.push(dataWords.length.toString()) + calldata.push(...dataWords) + + // Remaining bytes go into pending_word + const remaining = buffer.subarray(offset) + const pendingWord = remaining.length > 0 ? '0x' + remaining.toString('hex') : '0x0' + calldata.push(pendingWord) + calldata.push(remaining.length.toString()) + + return calldata +} + +/** + * Convert hex string to a string for Cairo ByteArray. + * This is kept for backward compatibility but should only be used + * for data that doesn't contain bytes >= 128. + */ +const _toCairoByteArray = (hex: string): string => { + const clean = normalizeHex(hex || '') + if (!clean) { + return '' + } + const buffer = Buffer.from(clean, 'hex') + return buffer.toString('latin1') +} + +const fromCairoByteArray = (value: unknown): string => { + if (value == null) { + return '0x' + } + if (typeof value === 'string') { + return value.startsWith('0x') ? value : `0x${value}` + } + if (value instanceof Uint8Array || Buffer.isBuffer(value)) { + return `0x${Buffer.from(value).toString('hex')}` + } + if (typeof value === 'object' && value !== null && 'data' in value && 'pending_word' in value) { + const data = (value as { data?: unknown[] }).data ?? [] + const pendingWord = (value as { pending_word?: unknown }).pending_word + const pendingLen = Number((value as { pending_word_len?: unknown }).pending_word_len ?? 0) + const chunks = data.map((entry) => toFixedBytes(entry, 31)) + const pending = pendingLen ? toFixedBytes(pendingWord, pendingLen) : Buffer.alloc(0) + return `0x${Buffer.concat([...chunks, pending]).toString('hex')}` + } + return '0x' +} + +export class OFT extends OmniSDK implements IOApp { + private oapp?: Contract + + async getEndpointSDK(): Promise { + const endpoint = STARKNET_ENDPOINT_V2_ADDRESSES[this.point.eid] + if (!endpoint) { + throw new Error( + `No Starknet EndpointV2 address configured for eid ${this.point.eid} (${formatEid(this.point.eid)})` + ) + } + return new EndpointV2(this.provider, { 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 { + const oapp = await this.getOApp() + if (!('get_peer' in oapp)) { + return this.notImplemented('getPeer') + } + const result = await (oapp as any).get_peer(_eid) + return this.parseFelt(result?.value ?? result) + } + + async hasPeer(_eid: EndpointId, _address: OmniAddress | null | undefined): Promise { + const peer = await this.getPeer(_eid) + // Both null/undefined = no peer set + if (peer == null && _address == null) { + return true + } + // One is null, other is not + if (peer == null || _address == null) { + return false + } + // Use areBytes32Equal for address comparison to handle leading zero differences + return areBytes32Equal(peer, _address) + } + + async setPeer(_eid: EndpointId, _peer: OmniAddress | null | undefined): Promise { + const oapp = await this.getOApp() + const peerValue = _peer ? { value: BigInt(_peer) } : { value: 0n } + const call = (oapp as any).populateTransaction.set_peer(_eid, peerValue) + return { + ...this.createTransaction([call]), + description: `Setting peer for ${formatEid(_eid)} to ${_peer ?? '0x0'}`, + } + } + + async getDelegate(): Promise { + const oapp = await this.getOApp() + if (!('get_delegate' in oapp)) { + return this.notImplemented('getDelegate') + } + const result = await (oapp as any).get_delegate() + return this.parseFelt(result) + } + + async isDelegate(_address: OmniAddress): Promise { + const delegate = await this.getDelegate() + return delegate === _address + } + + async setDelegate(_address: OmniAddress): Promise { + const oapp = await this.getOApp() + const call = (oapp as any).populateTransaction.set_delegate(_address) + return { + ...this.createTransaction([call]), + description: `Setting delegate to ${_address}`, + } + } + + async getEnforcedOptions(_eid: EndpointId, _msgType: number): Promise { + try { + const oapp = await this.getOApp() + if (!('get_enforced_options' in oapp)) { + // Contract doesn't expose this function - return empty options + return '0x' + } + const result = await (oapp as any).get_enforced_options(_eid, _msgType) + return fromCairoByteArray(result) + } catch (error) { + // If the call fails (e.g., no enforced options set), return empty options + if (this.isMissingStarknetConfig(error)) { + return '0x' + } + throw error + } + } + + private isMissingStarknetConfig(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 + } + // Common patterns for missing config in Starknet + return message.includes('entry point') || message.includes('not found') || message.includes('contract error') + } + + async setEnforcedOptions(_enforcedOptions: OAppEnforcedOptionParam[]): Promise { + const oapp = await this.getOApp() + // Try both function names - the contract may use either form + const funcName = + 'set_enforced_options' in oapp + ? 'set_enforced_options' + : 'setEnforcedOptions' in oapp + ? 'setEnforcedOptions' + : null + if (!funcName) { + // Contract doesn't support enforced options - return a no-op transaction + this.logger.warn(`Contract at ${this.point.address} does not support setEnforcedOptions - skipping`) + return this.createTransaction([]) + } + + // Build calldata manually to avoid UTF-8 corruption of ByteArray data + // The function signature is: set_enforced_options(params: Array<{eid: u32, msg_type: u8, options: ByteArray}>) + // Calldata format: [array_len, param1_eid, param1_msg_type, param1_options..., param2_eid, ...] + const calldata: string[] = [] + + // Array length + calldata.push(_enforcedOptions.length.toString()) + + // Each param: eid (u32), msg_type (u8), options (ByteArray) + for (const { eid, option } of _enforcedOptions) { + calldata.push(eid.toString()) + calldata.push(option.msgType.toString()) + // ByteArray is serialized as: [data_len, ...data_words, pending_word, pending_word_len] + calldata.push(...hexToByteArrayCalldata(option.options)) + } + + const call = { + contractAddress: this.point.address, + entrypoint: funcName, + calldata, + } + + return { + ...this.createTransaction([call]), + description: `Setting enforced options for ${_enforcedOptions.length} pathway(s)`, + } + } + + 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 Starknet OFT SDK`) + } + + private async getOApp(): Promise { + if (!this.oapp) { + this.oapp = getOFTContract(this.point.address, this.provider) + } + return this.oapp! + } + + private parseFelt(value: unknown): string | undefined { + if (value == null) { + return undefined + } + if (typeof value === 'string') { + return value + } + if (typeof value === 'bigint') { + return `0x${value.toString(16)}` + } + if (typeof value === 'object' && value !== null && 'value' in value) { + const feltValue = (value as { value: bigint | string }).value + return typeof feltValue === 'bigint' ? `0x${feltValue.toString(16)}` : String(feltValue) + } + return undefined + } +} diff --git a/packages/ua-devtools-starknet/tsconfig.json b/packages/ua-devtools-starknet/tsconfig.json new file mode 100644 index 0000000000..12774c873d --- /dev/null +++ b/packages/ua-devtools-starknet/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-starknet/tsup.config.ts b/packages/ua-devtools-starknet/tsup.config.ts new file mode 100644 index 0000000000..7ef46a5ad1 --- /dev/null +++ b/packages/ua-devtools-starknet/tsup.config.ts @@ -0,0 +1,14 @@ +import { defineConfig } from 'tsup' + +export default defineConfig([ + { + entry: ['src/index.ts'], + outDir: './dist', + clean: true, + dts: true, + sourcemap: true, + splitting: false, + treeshake: true, + format: ['esm', 'cjs'], + }, +]) diff --git a/packages/ua-devtools-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 @@ +

+ + LayerZero + +

+ +

@layerzerolabs/ua-devtools-sui

+ + +

+ + NPM Version + + Downloads + + NPM License +

+ +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'], + }, +]) diff --git a/packages/ua-devtools/src/oapp/config.ts b/packages/ua-devtools/src/oapp/config.ts index 43c1c8b5e2..8bc8366a34 100644 --- a/packages/ua-devtools/src/oapp/config.ts +++ b/packages/ua-devtools/src/oapp/config.ts @@ -9,6 +9,7 @@ import { createConfigureMultiple, createConfigureNodes, createConfigureEdges, + areBytes32Equal, } from '@layerzerolabs/devtools' import type { OAppConfigurator, OAppEnforcedOption, OAppEnforcedOptionParam, OAppFactory } from './types' import { createModuleLogger, createWithAsyncLogger, printBoolean } from '@layerzerolabs/io-devtools' @@ -137,9 +138,13 @@ export const configureSendLibraries: OAppConfigurator = withOAppLogger( ) } - if (!isDefaultLibrary && currentSendLibrary?.toLowerCase() === config.sendLibrary.toLowerCase()) { + // Skip if the current library already matches the configured library + // This handles both cases: + // 1. Non-default library that matches config + // 2. Default library that matches config (avoids SAME_VALUE errors) + if (areBytes32Equal(currentSendLibrary, config.sendLibrary)) { logger.verbose( - `Current sendLibrary is not default library and is already set to ${config.sendLibrary} for ${formatOmniVector({ from, to })}, skipping` + `Current sendLibrary is already set to ${config.sendLibrary} for ${formatOmniVector({ from, to })}${isDefaultLibrary ? ' (default)' : ''}, skipping` ) return [] } @@ -212,9 +217,13 @@ export const configureReceiveLibraries: OAppConfigurator = withOAppLogger( ) } - if (!isDefaultLibrary && currentReceiveLibrary === config.receiveLibraryConfig.receiveLibrary) { + // Skip if the current library already matches the configured library + // This handles both cases: + // 1. Non-default library that matches config + // 2. Default library that matches config (avoids SAME_VALUE errors) + if (areBytes32Equal(currentReceiveLibrary, config.receiveLibraryConfig.receiveLibrary)) { logger.verbose( - `Current recieveLibrary is not default and is already set to ${config.receiveLibraryConfig.receiveLibrary} for ${formatOmniVector({ from, to })}, skipping` + `Current recieveLibrary is already set to ${config.receiveLibraryConfig.receiveLibrary} for ${formatOmniVector({ from, to })}${isDefaultLibrary ? ' (default)' : ''}, skipping` ) return [] } diff --git a/plan.md b/plan.md new file mode 100644 index 0000000000..45fba98411 --- /dev/null +++ b/plan.md @@ -0,0 +1,671 @@ +# Plan: Fix Devtools VM Packages for Multi-VM Wire Support + +## ⚠️ CRITICAL CONSTRAINTS + +**This is NOT negotiable:** + +1. **OFTs MUST be connected using `lz:oapp:wire`** - This is the LayerZero devtools convention. No alternative approaches, scripts, or workarounds are acceptable. + +2. **The devtools packages MUST work** - If `lz:oapp:wire` fails, the solution is to FIX THE DEVTOOLS PACKAGES, not to find a different way to wire OFTs. + +3. **No workarounds** - Do not: + - Write custom scripts to wire OFTs + - Use direct contract calls bypassing devtools + - Suggest manual transaction construction + - Propose any solution that doesn't use `lz:oapp:wire` + +--- + +## Progress Overview + +| VM | Wire Support | Send/Receive | Status | +|----|--------------|--------------|--------| +| Sui | ✅ Complete | ✅ Verified | **DONE** | +| Starknet | 🔄 In Progress | ⏳ Pending | **CURRENT** | +| Aptos | ⏳ Pending | ⏳ Pending | Next | + +--- + +## Current Goal: Starknet Integration + +**Make `lz:oapp:wire` work for Starknet OFTs.** + +The command that MUST succeed: +```bash +pnpm -C examples/oft-main exec hardhat lz:oapp:wire --oapp-config layerzero.config.ts +``` + +This command must successfully: +1. Read Starknet OFT configurations from `layerzero.config.ts` +2. Use the devtools-starknet package to create signers +3. Use the ua-devtools-starknet package to configure OFTs +4. Wire all pathways (Starknet↔EVM, Starknet↔Sui) + +--- + +## Success Criteria (Starknet Phase) + +| Criterion | Verification | +|-----------|--------------| +| `lz:oapp:wire` completes without errors | Exit code 0, no exceptions | +| Starknet OFT is wired to EVM OFTs | Peers are set bidirectionally | +| Starknet OFT is wired to Sui OFT | Peers are set bidirectionally | +| Cross-chain send works | LayerZero Scan shows DELIVERED status | + +**Verification command:** +```bash +# After wire completes, verify a cross-chain send +curl -s "https://scan.layerzero-api.com/v1/messages/tx/{txHash}" | jq '.messages[0].status' +# Expected: "DELIVERED" +``` + +--- + +## Required Devtools Packages (MUST ALL WORK) + +### Sui Packages +| Package | Purpose | Must Export | +|---------|---------|-------------| +| `@layerzerolabs/devtools-sui` | Sui signer/provider | `SuiSigner`, `createSuiSignerFactory` | +| `@layerzerolabs/ua-devtools-sui` | Sui OFT SDK | `OFT`, `createOFTFactory` | +| `@layerzerolabs/protocol-devtools-sui` | Sui endpoint SDK | `EndpointV2` | + +### Starknet Packages +| Package | Purpose | Must Export | +|---------|---------|-------------| +| `@layerzerolabs/devtools-starknet` | Starknet signer/provider | `StarknetSigner`, `createStarknetSignerFactory` | +| `@layerzerolabs/ua-devtools-starknet` | Starknet OFT SDK | `OFT`, `createOFTFactory` | +| `@layerzerolabs/protocol-devtools-starknet` | Starknet endpoint SDK | `EndpointV2` | + +**If any of these packages fail to build, export correctly, or function during `lz:oapp:wire`, FIX THE PACKAGE.** + +--- + +## Current State Analysis + +### Sui (✅ COMPLETE) +| Component | Status | +|-----------|--------| +| SDK Package (ua-devtools-sui) | ✅ Working | +| Signer Package (devtools-sui) | ✅ Working | +| SDK Factory in `utils.ts` | ✅ Registered | +| Signer Factory in `wire.ts` | ✅ Registered | +| Deploy artifacts | ✅ Has oftPackageId | +| Wire command | ✅ Verified | +| Send/Receive | ✅ Verified both directions | + +### Starknet (🔄 IN PROGRESS) +| Component | Status | Action Required | +|-----------|--------|-----------------| +| SDK Package (ua-devtools-starknet) | ✅ Exists | Verify build & exports | +| Signer Package (devtools-starknet) | ✅ Exists | Verify build & exports | +| SDK Factory in `utils.ts` | ✅ Line 73 | Test functionality | +| Signer Factory in `wire.ts` | ✅ Lines 234-238 | Test functionality | +| Deploy artifacts | ⏳ Needs deploy | Deploy Starknet OFT | +| Starknet in config | ❌ Missing | Add to `layerzero.config.ts` | +| Wire command | ⏳ Untested | Run and debug | +| Send/Receive | ⏳ Untested | Test after wire works | + +### What's Needed for Starknet +| Task | Location | Priority | +|------|----------|----------| +| Deploy Starknet OFT | `examples/oft-main/starknet/` | 1 | +| Add Starknet to config | `layerzero.config.ts` | 2 | +| Test package builds | `packages/devtools-starknet/` | 3 | +| Run `lz:oapp:wire` | - | 4 | +| Debug and fix issues | Various packages | 5 | +| Test cross-chain send | - | 6 | + +--- + +## Implementation Phases + +### Phase 0: Ensure All VM Packages Build + +**This is the foundation. Nothing else matters if packages don't build.** + +#### Step 0.1: Build Sui Packages +```bash +pnpm turbo run build --filter @layerzerolabs/devtools-sui +pnpm turbo run build --filter @layerzerolabs/ua-devtools-sui +pnpm turbo run build --filter @layerzerolabs/protocol-devtools-sui +``` + +**If any build fails: FIX THE BUILD. Do not proceed until all Sui packages build.** + +#### Step 0.2: Build Starknet Packages +```bash +pnpm turbo run build --filter @layerzerolabs/devtools-starknet +pnpm turbo run build --filter @layerzerolabs/ua-devtools-starknet +pnpm turbo run build --filter @layerzerolabs/protocol-devtools-starknet +``` + +**If any build fails: FIX THE BUILD. Do not proceed until all Starknet packages build.** + +#### Step 0.3: Verify Exports +```bash +cd examples/oft-main +node -e "const sui = require('@layerzerolabs/devtools-sui'); console.log('Sui exports:', Object.keys(sui))" +node -e "const starknet = require('@layerzerolabs/devtools-starknet'); console.log('Starknet exports:', Object.keys(starknet))" +node -e "const uaSui = require('@layerzerolabs/ua-devtools-sui'); console.log('UA Sui exports:', Object.keys(uaSui))" +node -e "const uaStarknet = require('@layerzerolabs/ua-devtools-starknet'); console.log('UA Starknet exports:', Object.keys(uaStarknet))" +``` + +**If exports are missing: FIX THE PACKAGE EXPORTS.** + +--- + +### Phase 1: Ensure oft-main Uses Workspace Packages + +#### Step 1.1: Check package.json Dependencies +```bash +grep -E "devtools-sui|devtools-starknet|ua-devtools-sui|ua-devtools-starknet" examples/oft-main/package.json +``` + +Required entries in `examples/oft-main/package.json`: +```json +{ + "devDependencies": { + "@layerzerolabs/devtools-sui": "workspace:^", + "@layerzerolabs/devtools-starknet": "workspace:^", + "@layerzerolabs/ua-devtools-sui": "workspace:^", + "@layerzerolabs/ua-devtools-starknet": "workspace:^", + "@layerzerolabs/protocol-devtools-sui": "workspace:^", + "@layerzerolabs/protocol-devtools-starknet": "workspace:^" + } +} +``` + +#### Step 1.2: Reinstall Dependencies +```bash +pnpm install +``` + +#### Step 1.3: Verify Symlinks +```bash +ls -la examples/oft-main/node_modules/@layerzerolabs/ | grep -E "sui|starknet" +``` + +Should show symlinks to local packages, NOT npm registry versions. + +--- + +### Phase 2: Add Starknet to layerzero.config.ts + +#### Step 2.1: Review Sui Pattern +The Sui integration provides a template for adding Starknet: +- Load deployment from `sui/deploy.json` +- Define contract with endpoint ID and address +- Add enforced options for pathways +- Add connection pathways + +#### Step 2.2: Add Starknet Contract +Add Starknet OFT contract definition following the same pattern as Sui. + +Required additions: +1. Import Starknet endpoint ID (`EndpointId.STARKNET_V2_MAINNET` or testnet) +2. Load deployment from `starknet/deploy.json` +3. Define Starknet contract with address from deploy artifacts +4. Add `STARKNET_ENFORCED_OPTIONS` with appropriate gas settings +5. Add connection pathways for Starknet↔EVM, Starknet↔Sui + +#### Step 2.3: Starknet-Specific Considerations +- **Address format:** Starknet uses felt252 addresses (252-bit integers) +- **Gas units:** Starknet uses Cairo steps, not EVM gas +- **Token decimals:** May need `starknetTokenDecimals` param in send task +- **Account abstraction:** Starknet has native AA, signer setup may differ + +--- + +### Phase 3: Validate Environment + +#### Step 3.1: Check Required Environment Variables +```bash +# Starknet (REQUIRED for this phase) +echo "STARKNET_PRIVATE_KEY: ${STARKNET_PRIVATE_KEY:+set}" +echo "STARKNET_ACCOUNT_ADDRESS: ${STARKNET_ACCOUNT_ADDRESS:+set}" +echo "RPC_URL_STARKNET: ${RPC_URL_STARKNET:+set}" + +# Sui (already configured from Phase 1) +echo "SUI_MNEMONIC: ${SUI_MNEMONIC:+set}" +echo "RPC_URL_SUI: ${RPC_URL_SUI:+set}" + +# EVM (already configured) +echo "PRIVATE_KEY: ${PRIVATE_KEY:+set}" +``` + +All Starknet variables must be set for `lz:oapp:wire` to work with Starknet. + +#### Step 3.2: Starknet Account Setup +Starknet requires: +1. An account address (deployed contract) +2. Private key for that account +3. RPC URL (Infura, Alchemy, or other Starknet RPC provider) + +--- + +### Phase 4: Run lz:oapp:wire + +**This is the moment of truth.** + +```bash +pnpm -C examples/oft-main exec hardhat lz:oapp:wire --oapp-config layerzero.config.ts +``` + +#### If it fails: + +1. **Read the error message carefully** +2. **Identify which package/component failed** +3. **Fix that specific issue in the devtools package** +4. **Rebuild the package** +5. **Try again** + +**DO NOT look for workarounds. FIX THE DEVTOOLS.** + +--- + +## Debugging Guide + +### Common Errors and Solutions + +| Error | Likely Cause | Fix | +|-------|--------------|-----| +| `Cannot find module '@layerzerolabs/devtools-starknet'` | Package not built or not linked | Build package, run `pnpm install` | +| `createStarknetSignerFactory is not a function` | Missing export | Add export to package's index.ts | +| `Invalid Starknet address` | Deploy artifact issue | Check `starknet/deploy.json` | +| `Starknet provider error` | RPC or signer issue | Check env vars (STARKNET_PRIVATE_KEY, etc.) | +| `Cannot read property 'setPeer'` | OFT SDK issue | Fix ua-devtools-starknet | +| `Missing transaction sender` | Transaction build before sign | Use serialize() not build() | +| `Invalid address length` | EVM→Starknet padding | Pad to felt252 size | +| `Account validation failed` | Starknet AA issue | Check account contract compatibility | + +### Starknet-Specific Considerations +- Starknet uses **felt252** (252-bit field elements) for addresses +- Starknet has native **account abstraction** - accounts are contracts +- Transaction execution may require **STRK** or **ETH** for gas +- RPC providers: Infura, Alchemy, Blast, or public nodes + +### Debug Logging +```bash +DEBUG=* pnpm -C examples/oft-main exec hardhat lz:oapp:wire --oapp-config layerzero.config.ts +``` + +--- + +## Files That May Need Modification + +### Starknet Devtools Packages (FOCUS FOR THIS PHASE) +- `packages/devtools-starknet/src/index.ts` - Starknet signer exports +- `packages/devtools-starknet/src/omnigraph/sdk.ts` - Transaction creation (apply Sui learnings) +- `packages/devtools-starknet/src/transactions/signer.ts` - Transaction signing (apply Sui learnings) +- `packages/ua-devtools-starknet/src/index.ts` - Starknet OFT SDK exports +- `packages/ua-devtools-starknet/src/oft/sdk.ts` - OFT operations (address padding, etc.) +- `packages/protocol-devtools-starknet/src/endpointv2/sdk.ts` - Endpoint SDK + +### Wire Task (already has Starknet support, may need fixes) +- `packages/devtools-evm-hardhat/src/tasks/oapp/wire.ts` - Wire task VM integration +- `packages/devtools-evm-hardhat/src/utils.ts` - SDK factory registration + +### Example Configuration +- `examples/oft-main/layerzero.config.ts` - Add Starknet configuration +- `examples/oft-main/starknet/deploy.json` - Starknet deployment artifacts +- `examples/oft-main/package.json` - Ensure workspace dependencies +- `examples/oft-main/.env` - Starknet environment variables + +### Sui Packages (COMPLETE - reference only) +- `packages/devtools-sui/` - ✅ Working +- `packages/ua-devtools-sui/` - ✅ Working +- `packages/protocol-devtools-sui/` - ✅ Working + +--- + +## Summary + +**The target outcome for Starknet phase:** + +```bash +$ pnpm -C examples/oft-main exec hardhat lz:oapp:wire --oapp-config layerzero.config.ts + +✓ Sui OFT peers already configured (no transactions needed) +✓ Setting peer for Starknet OFT -> Arbitrum OFT +✓ Setting peer for Arbitrum OFT -> Starknet OFT +✓ Setting peer for Starknet OFT -> Sui OFT +✓ Setting peer for Sui OFT -> Starknet OFT +✓ Setting enforced options for Starknet pathways +... +Done. +``` + +**If this doesn't work, FIX THE DEVTOOLS PACKAGES until it does.** + +Apply lessons learned from Sui integration proactively to avoid similar issues. + +--- + +## Lessons Learned: Devtools Integration Painpoints + +The following issues were discovered while making `lz:oapp:wire` work for Sui. These patterns are **directly applicable to Starknet and Aptos** - expect similar issues and apply these solutions proactively. + +### 1. Transaction Serialization vs Building + +**Problem:** Sui's `Transaction.build()` requires a sender address, but the SDK creates transactions before knowing who will sign them. + +**Error:** `Missing transaction sender` + +**Fix:** Use `transaction.serialize()` instead of `transaction.build()` in `createTransaction()`. The sender is set later during signing. + +**Package:** `packages/devtools-sui/src/omnigraph/sdk.ts` + +```typescript +// WRONG: Requires sender at build time +const bytes = await transaction.build({ client: this.client }) + +// CORRECT: Serialize without sender, set sender during signing +const serialized = transaction.serialize() +``` + +**Design Principle:** SDK methods should create transaction representations that can be signed by any signer later. Don't require execution context during transaction creation. + +--- + +### 2. Transaction Reconstruction During Signing + +**Problem:** The signer receives serialized transaction data but needs to reconstruct, set sender, then build. + +**Fix:** Update signer to use `Transaction.from()` to reconstruct, then `setSender()` before building. + +**Package:** `packages/devtools-sui/src/transactions/signer.ts` + +```typescript +async signAndSend(transaction: OmniTransaction): Promise { + const suiTransaction = Transaction.from(transaction.data) + suiTransaction.setSender(this.signer.toSuiAddress()) + // Now build and execute +} +``` + +**Design Principle:** Signers should handle all execution context (sender, gas, etc.) at signing time. + +--- + +### 3. Address Length Normalization (EVM ↔ Sui) + +**Problem:** EVM addresses are 20 bytes, but Sui expects 32-byte `bytes32` for peer addresses. + +**Error:** `Move abort in bytes32::from_bytes` (code 1) + +**Fix:** Pad EVM addresses with leading zeros to 32 bytes in `setPeer()`. + +**Package:** `packages/ua-devtools-sui/src/oft/sdk.ts` + +```typescript +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) // Right-align +} +``` + +**Design Principle:** Always normalize addresses to the target chain's expected format at the boundary (in SDK methods that write to chain). + +--- + +### 4. Address Comparison Must Be Normalized + +**Problem:** `hasPeer()` compared a 32-byte padded address from chain with a 20-byte EVM address, always returning `false`. + +**Result:** Unnecessary `setPeer` transactions generated on every wire run. + +**Fix:** Use `areBytes32Equal()` which normalizes both addresses before comparison. + +**Package:** `packages/ua-devtools-sui/src/oft/sdk.ts` + +```typescript +// WRONG: Direct comparison fails due to length mismatch +return (peer ?? null) === (_address ?? null) + +// CORRECT: Normalize both to bytes32 before comparing +return areBytes32Equal(peer, _address) +``` + +**Design Principle:** All address comparisons should normalize to a common format. Use utility functions like `areBytes32Equal()` consistently. + +--- + +### 5. Move Call Results Must Be Consumed + +**Problem:** Sui Move functions return `Call` objects that MUST be consumed. Unused results cause transaction failure. + +**Error:** `UnusedValueWithoutDrop { result_idx: 0 }` + +**Fix:** Call `populateSetConfigTransaction()` after `setConfigMoveCall()` to consume the result. + +**Package:** `packages/protocol-devtools-sui/src/endpointv2/sdk.ts` + +```typescript +// setConfigMoveCall returns Call +const setConfigCall = await this.getOApp(oapp).setConfigMoveCall(tx, ...) + +// MUST consume the result with populateSetConfigTransaction +await this.getEndpoint().populateSetConfigTransaction(tx, setConfigCall) +``` + +**Design Principle:** When wrapping Sui SDK methods, always check if the underlying Move function returns a value that needs consumption. Document these requirements clearly. + +--- + +### 6. Graceful Handling of Missing Configuration + +**Problem:** Querying config that doesn't exist throws Move abort errors instead of returning empty/default values. + +**Error:** `Move abort in send_uln::*` or similar + +**Fix:** Catch Move abort errors and return empty config objects. + +**Package:** `packages/protocol-devtools-sui/src/uln302/sdk.ts` + +```typescript +async getAppUlnConfig(...): Promise { + try { + return await this.getUln().getOAppSendUlnConfig(...) + } catch (error) { + if (this.isMissingSuiConfig(error)) { + return { confirmations: 0n, requiredDVNs: [], ... } + } + throw error + } +} +``` + +**Design Principle:** SDK "get" methods should return sensible defaults for missing data rather than throwing. This allows wire tasks to detect what needs configuration. + +--- + +### 7. Enforced Options Order in Config + +**Problem:** The pathway config tuple `[contractA, contractB, ..., [optionsA, optionsB]]` means: +- `optionsA` = options when sending FROM A TO B +- `optionsB` = options when sending FROM B TO A + +The naming should reflect the DESTINATION, not the source. + +**Mistake Made:** +```typescript +// WRONG: Named by source chain +[EVM_ENFORCED_OPTIONS, SUI_ENFORCED_OPTIONS] // Confusing! + +// CORRECT: Named by destination chain +[SUI_ENFORCED_OPTIONS, EVM_ENFORCED_OPTIONS] // Arb→Sui uses SUI options +``` + +**Result:** First Sui→EVM transaction failed with 5000 gas (Sui gas) instead of 80000 (EVM gas). + +**Design Principle:** Name enforced options by DESTINATION chain (e.g., `TO_SUI_OPTIONS`, `TO_EVM_OPTIONS`) to make the pathway tuple order intuitive. + +--- + +### 8. RPC URL Factory Must Use Environment Variables + +**Problem:** `createConnectionFactory()` with no arguments uses a default factory that throws. + +**Fix:** Always pass `createRpcUrlFactory()` which reads from `process.env.RPC_URL_SUI`. + +**Package:** `packages/devtools-sui/src/connection/factory.ts` (usage in examples) + +```typescript +// WRONG: Uses default factory that throws +const connectionFactory = createConnectionFactory() + +// CORRECT: Uses factory that reads env vars +const connectionFactory = createConnectionFactory(createRpcUrlFactory()) +``` + +**Design Principle:** Connection factories should have sensible defaults that read from standard environment variables. + +--- + +### 9. Avoid Endless UI Retry Loops + +**Problem:** When `lz:oapp:wire` shows failed transactions and prompts "Would you like to retry?", piping `yes` creates an infinite loop if the failure is a configuration issue (not a transient error). + +**Symptoms:** +- "Successfully sent 0 transactions" +- "Failed to send 1 transaction" +- Endless retry prompts + +**Fix:** When automating wire commands: +1. Run once without `yes` piping to see the actual error +2. Fix the root cause (missing signer, network config, etc.) +3. Only use `yes` piping after confirming the error is transient + +**Root Causes to Check:** +- Missing signer factory for the chain type +- Missing network definition for the endpoint ID +- Environment variables not loaded (RPC URL, private key) +- Contract ABI mismatch + +**Design Principle:** Never blindly retry configuration errors. Inspect failures, fix root causes, then retry. + +--- + +## Testing Checklist for New VM Packages + +Before considering a VM devtools package complete, verify: + +- [ ] `createTransaction()` works without sender context +- [ ] Signer properly reconstructs and signs transactions +- [ ] Address normalization handles all source chain formats +- [ ] Address comparison uses normalized comparison +- [ ] All Move call results are properly consumed +- [ ] Missing config returns defaults, not errors +- [ ] Connection factory reads from environment variables +- [ ] Example enforced options use correct naming convention +- [ ] Signer factory is registered in wire.ts for the chain type +- [ ] Network is defined in lz-definitions for the endpoint ID + +--- + +--- + +## ✅ Completed: Sui Integration + +**Status:** COMPLETE - PR branch: `feat/devtools-sui` + +| Test | Result | +|------|--------| +| `lz:oapp:wire` completes | ✅ No transactions needed (fully configured) | +| Sui→EVM send | ✅ DELIVERED in 12 seconds | +| EVM→Sui send | ✅ DELIVERED in 25 seconds | +| Token balances correct | ✅ Sui: 0.5, Arbitrum: 99,998.9 | + +**LayerZero Scan Links:** +- Sui→Arbitrum: https://layerzeroscan.com/tx/BD3vzbMTsYkHMPRRLMdCgdoNyc3JgMPK4aboMyy4gn8N +- Arbitrum→Sui: https://layerzeroscan.com/tx/0x142ac09cb71a53846c6cd4650e214df175fae461415090290ed482335786d2e7 + +--- + +## 🔄 In Progress: Starknet Integration + +**Status:** Devtools SDK COMPLETE, Protocol-level send issue - Branch: `feat/devtools-sui` + +| Task | Status | +|------|--------| +| Deploy Starknet OFT | ✅ Complete | +| Create deploy.json | ✅ Complete | +| Add to layerzero.config.ts | ✅ Complete | +| Verify package builds | ✅ Complete | +| Run `lz:oapp:wire` | ✅ Complete (idempotent, 2 txns) | +| Debug and fix issues | ✅ Fixed all address normalization | +| EVM→Starknet send | ✅ Working | +| Starknet→EVM send | ❌ Protocol-level bug | +| Starknet→Sui send | ❌ Protocol-level bug | + +### Devtools Fixes Applied (ALL COMPLETE) + +1. **Address normalization in EndpointV2 SDK** (`protocol-devtools-starknet/src/endpointv2/sdk.ts`): + - `parseFelt()` now normalizes Starknet addresses by removing leading zeros + - Ensures `0x0727f...` and `0x727f...` are treated as equal + +2. **Library comparison** (`ua-devtools/src/oapp/config.ts`): + - Changed to use `areBytes32Equal()` for send/receive library comparison + - Handles addresses with different leading zero counts + +3. **Library skip logic** (`ua-devtools/src/oapp/config.ts`): + - Changed from `if (!isDefaultLibrary && areBytes32Equal(...))` to `if (areBytes32Equal(...))` + - Prevents SAME_VALUE errors when configured library matches current default + +4. **ULN302 SDK address comparison** (`protocol-devtools-starknet/src/uln302/sdk.ts`): + - Added `areBytes32Equal` for executor address comparison in `hasAppExecutorConfig` + - Renamed `equalStringArrays` to `equalAddressArrays` with `areBytes32Equal` + - Added `normalizeAddress` and `normalizeAddressArray` helpers + +5. **OFT SDK peer comparison** (`ua-devtools-starknet/src/oft/sdk.ts`): + - Fixed `hasPeer` to use `areBytes32Equal` instead of direct equality + +### Wire Task Status: ✅ WORKING + +The wire task now correctly: +- Detects already-configured peers (no redundant setPeer txns) +- Detects already-configured libraries (no SAME_VALUE errors) +- Detects already-configured ULN/executor configs +- Only generates necessary transactions (2 remaining: Sui peer for Starknet, Starknet enforced options) + +### On-Chain Configuration Verified ✅ + +All configurations ARE correctly set on the Starknet OFT: + +| Config | Value | Status | +|--------|-------|--------| +| Peer (Arbitrum) | `0x999af0b3fbfe75256cba36af10f367bd2efa319c` | ✅ Set | +| Send Library | `0x727f40349719ac76861a51a0b3d3e07be1577fff137bb81a5dc32e5a5c61d38` | ✅ Set | +| Receive Library | `0x727f40349719ac76861a51a0b3d3e07be1577fff137bb81a5dc32e5a5c61d38` | ✅ Set | +| Executor Config | max_message_size=10000, executor set | ✅ Set | +| ULN Send Config | confirmations=15, DVN set | ✅ Set | +| Enforced Options | `0x00030100110100000000000000000000000000013880` (80k gas) | ✅ Set | + +### Current Blocker: PROTOCOL-LEVEL BUG + +**Send from Starknet fails with "out of bound" error:** +``` +error":"0x6f7574206f6620626f756e64 ('out of bound') +``` + +**Key Finding:** This is NOT a devtools issue. The error occurs in the **Starknet SendLib contract** (`0x727f40...`) during the `quote` function. + +**Evidence:** +- EVM→Starknet send WORKS: https://layerzeroscan.com/tx/0x540dbe715862f57a41b6eb3de7a487151e3e8a85e2230b615b475208a61b9000 +- All on-chain configs verified correct via RPC queries +- Wire task is idempotent (configs properly detected) +- The error comes from deep inside the SendLib contract, not from SDK + +**Diagnosis:** +The Starknet SendLib contract has a bug in its `quote` function that causes an array/slice "out of bound" error. This needs to be fixed at the protocol contract level, not in devtools. + +### Devtools Work Complete For Starknet + +The devtools packages are now fully functional for Starknet: +- `@layerzerolabs/devtools-starknet` ✅ +- `@layerzerolabs/ua-devtools-starknet` ✅ +- `@layerzerolabs/protocol-devtools-starknet` ✅ + +The remaining issue (send FROM Starknet) requires a fix to the Starknet protocol contracts. diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 52972fbc99..17024e4f27 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -2365,6 +2365,288 @@ importers: specifier: ^2.6.1 version: 2.7.0 + examples/oft-main: + devDependencies: + '@coral-xyz/anchor': + specifier: ^0.31.1 + version: 0.31.1 + '@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.7.0 + '@ethersproject/contracts': + specifier: ^5.7.0 + version: 5.7.0 + '@ethersproject/providers': + specifier: ^5.7.0 + version: 5.8.0 + '@layerzerolabs/devtools': + specifier: workspace:^2.0.5 + version: link:../../packages/devtools + '@layerzerolabs/devtools-evm': + specifier: ~3.0.0 + version: link:../../packages/devtools-evm + '@layerzerolabs/devtools-evm-hardhat': + specifier: ^4.0.0 + version: link:../../packages/devtools-evm-hardhat + '@layerzerolabs/devtools-solana': + specifier: ~3.0.6 + version: link:../../packages/devtools-solana + '@layerzerolabs/devtools-starknet': + specifier: ~0.1.0 + version: link:../../packages/devtools-starknet + '@layerzerolabs/devtools-sui': + specifier: workspace:^0.1.0 + version: link:../../packages/devtools-sui + '@layerzerolabs/eslint-config-next': + specifier: ~2.3.39 + version: 2.3.44(typescript@5.5.3) + '@layerzerolabs/io-devtools': + specifier: ~0.3.0 + version: link:../../packages/io-devtools + '@layerzerolabs/lz-definitions': + specifier: ^3.0.86 + version: 3.0.148 + '@layerzerolabs/lz-evm-messagelib-v2': + specifier: ^3.0.86 + version: 3.0.148(@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.148)(@layerzerolabs/lz-evm-v1-0.7@3.0.148)(@openzeppelin/contracts-upgradeable@5.1.0)(@openzeppelin/contracts@5.1.0)(hardhat-deploy@0.12.4)(solidity-bytes-utils@0.8.2) + '@layerzerolabs/lz-evm-protocol-v2': + specifier: ^3.0.86 + version: 3.0.148(@openzeppelin/contracts-upgradeable@5.1.0)(@openzeppelin/contracts@5.1.0)(hardhat-deploy@0.12.4)(solidity-bytes-utils@0.8.2) + '@layerzerolabs/lz-evm-v1-0.7': + specifier: ^3.0.86 + version: 3.0.148(@openzeppelin/contracts-upgradeable@5.1.0)(@openzeppelin/contracts@5.1.0)(hardhat-deploy@0.12.4) + '@layerzerolabs/lz-solana-sdk-v2': + specifier: ^3.0.136 + version: 3.0.138(@swc/core@1.4.0)(@types/node@18.18.14)(chai@4.5.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.3) + '@layerzerolabs/lz-sui-oft-sdk-v2': + specifier: ^3.0.156 + version: 3.0.156(typescript@5.5.3) + '@layerzerolabs/lz-sui-sdk-v2': + specifier: ^3.0.156 + version: 3.0.156(typescript@5.5.3) + '@layerzerolabs/lz-v2-utilities': + specifier: ^3.0.86 + version: 3.0.148 + '@layerzerolabs/metadata-tools': + specifier: workspace:^3.0.2 + version: link:../../packages/metadata-tools + '@layerzerolabs/oapp-evm': + specifier: ^0.4.0 + version: link:../../packages/oapp-evm + '@layerzerolabs/oft-evm': + specifier: ^4.0.0 + version: link:../../packages/oft-evm + '@layerzerolabs/oft-mint-burn-starknet': + specifier: ^0.2.19 + version: 0.2.19(@layerzerolabs/protocol-starknet-v2@0.2.19) + '@layerzerolabs/oft-v2-solana-sdk': + specifier: ^3.0.136 + version: 3.0.138(@swc/core@1.4.0)(@types/node@18.18.14)(chai@4.5.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.3) + '@layerzerolabs/prettier-config-next': + specifier: ^2.3.39 + version: 2.3.44 + '@layerzerolabs/protocol-devtools': + specifier: ^3.0.0 + version: link:../../packages/protocol-devtools + '@layerzerolabs/protocol-devtools-evm': + specifier: ~5.0.0 + version: link:../../packages/protocol-devtools-evm + '@layerzerolabs/protocol-devtools-solana': + specifier: ^8.0.3 + version: link:../../packages/protocol-devtools-solana + '@layerzerolabs/protocol-devtools-starknet': + specifier: ~0.1.0 + version: link:../../packages/protocol-devtools-starknet + '@layerzerolabs/protocol-devtools-sui': + specifier: workspace:^0.1.0 + version: link:../../packages/protocol-devtools-sui + '@layerzerolabs/protocol-starknet-v2': + specifier: ^0.2.19 + version: 0.2.19 + '@layerzerolabs/solhint-config': + specifier: ^3.0.12 + version: 3.0.12(typescript@5.5.3) + '@layerzerolabs/test-devtools-evm-foundry': + specifier: ~8.0.0 + version: link:../../packages/test-devtools-evm-foundry + '@layerzerolabs/test-devtools-evm-hardhat': + specifier: ~0.5.2 + version: link:../../packages/test-devtools-evm-hardhat + '@layerzerolabs/toolbox-foundry': + specifier: ~0.1.12 + version: link:../../packages/toolbox-foundry + '@layerzerolabs/toolbox-hardhat': + specifier: ~0.6.12 + version: link:../../packages/toolbox-hardhat + '@layerzerolabs/ua-devtools': + specifier: ~5.0.0 + version: link:../../packages/ua-devtools + '@layerzerolabs/ua-devtools-evm': + specifier: ~7.0.0 + version: link:../../packages/ua-devtools-evm + '@layerzerolabs/ua-devtools-evm-hardhat': + specifier: ~9.0.0 + version: link:../../packages/ua-devtools-evm-hardhat + '@layerzerolabs/ua-devtools-solana': + specifier: ~8.0.2 + version: link:../../packages/ua-devtools-solana + '@layerzerolabs/ua-devtools-starknet': + specifier: ~0.1.0 + version: link:../../packages/ua-devtools-starknet + '@layerzerolabs/ua-devtools-sui': + specifier: workspace:^0.1.0 + version: link:../../packages/ua-devtools-sui + '@metaplex-foundation/mpl-token-metadata': + specifier: ^3.2.1 + version: 3.2.1(@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.0) + '@metaplex-foundation/umi-eddsa-web3js': + specifier: ^0.9.2 + version: 0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.98.0) + '@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.0) + '@mysten/bcs': + specifier: ^1.9.2 + version: 1.9.2 + '@mysten/sui': + specifier: ^1.45.2 + version: 1.45.2(typescript@5.5.3) + '@nomicfoundation/hardhat-ethers': + specifier: ^3.0.5 + version: 3.0.5(ethers@5.7.2)(hardhat@2.22.12) + '@nomiclabs/hardhat-ethers': + specifier: ^2.2.3 + version: 2.2.3(ethers@5.7.2)(hardhat@2.22.12) + '@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.7.2)(hardhat@2.22.12) + '@openzeppelin/contracts': + specifier: ^5.0.2 + version: 5.1.0 + '@openzeppelin/contracts-upgradeable': + specifier: ^5.0.2 + version: 5.1.0(@openzeppelin/contracts@5.1.0) + '@rushstack/eslint-patch': + specifier: ^1.7.0 + version: 1.7.0 + '@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.5.3) + '@solana/spl-token': + specifier: ^0.4.8 + version: 0.4.12(@solana/web3.js@1.98.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.3) + '@solana/web3.js': + specifier: ^1.95.8 + version: 1.98.0 + '@sqds/sdk': + specifier: ^2.0.4 + version: 2.0.4 + '@swc/core': + specifier: ^1.4.0 + version: 1.4.0 + '@swc/jest': + specifier: ^0.2.36 + version: 0.2.36(@swc/core@1.4.0) + '@types/chai': + specifier: ^4.3.11 + version: 4.3.20 + '@types/jest': + specifier: ^29.5.12 + version: 29.5.12 + '@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.0 + dotenv: + specifier: ^16.4.5 + version: 16.4.7 + eslint: + specifier: ^8.55.0 + version: 8.57.1 + eslint-plugin-jest-extended: + specifier: ~2.0.0 + version: 2.0.0(eslint@8.57.1)(typescript@5.5.3) + ethereumjs-util: + specifier: ^7.1.5 + version: 7.1.5 + ethers: + specifier: ^5.7.2 + version: 5.7.2 + exponential-backoff: + specifier: ~3.1.1 + version: 3.1.1 + fp-ts: + specifier: ^2.16.2 + version: 2.16.2 + hardhat: + specifier: ^2.22.10 + version: 2.22.12(ts-node@10.9.2)(typescript@5.5.3) + hardhat-contract-sizer: + specifier: ^2.10.0 + version: 2.10.0(hardhat@2.22.12) + 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.0.5)(hardhat-deploy@0.12.4)(hardhat@2.22.12) + 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.2.0 + prettier: + specifier: ^3.2.5 + version: 3.5.3 + solhint: + specifier: ^4.1.1 + version: 4.1.1(typescript@5.5.3) + solidity-bytes-utils: + specifier: ^0.8.2 + version: 0.8.2 + starknet: + specifier: ^8.9.0 + version: 8.9.2 + ts-node: + specifier: ^10.9.2 + version: 10.9.2(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3) + typescript: + specifier: ^5.4.4 + version: 5.5.3 + examples/oft-solana: devDependencies: '@coral-xyz/anchor': @@ -4183,6 +4465,107 @@ importers: specifier: ^3.22.4 version: 3.22.4 + packages/devtools-starknet: + dependencies: + p-memoize: + specifier: ~4.0.4 + version: 4.0.4 + devDependencies: + '@layerzerolabs/devtools': + specifier: ~2.0.4 + version: link:../devtools + '@layerzerolabs/io-devtools': + specifier: ~0.3.2 + version: link:../io-devtools + '@layerzerolabs/lz-definitions': + specifier: ^3.0.148 + version: 3.0.148 + '@layerzerolabs/lz-v2-utilities': + specifier: ^3.0.148 + version: 3.0.148 + '@layerzerolabs/protocol-starknet-v2': + specifier: ^0.2.19 + version: 0.2.19 + '@swc/core': + specifier: ^1.4.0 + version: 1.4.0 + '@swc/jest': + specifier: ^0.2.36 + version: 0.2.36(@swc/core@1.4.0) + '@types/jest': + specifier: ^29.5.12 + version: 29.5.12 + jest: + specifier: ^29.7.0 + version: 29.7.0(@types/node@18.18.14)(ts-node@10.9.2) + starknet: + specifier: ^8.9.0 + version: 8.9.2 + ts-node: + specifier: ^10.9.2 + version: 10.9.2(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3) + tslib: + specifier: ~2.6.2 + version: 2.6.3 + tsup: + specifier: ~8.0.1 + version: 8.0.1(@swc/core@1.4.0)(ts-node@10.9.2)(typescript@5.5.3) + typescript: + specifier: ^5.4.4 + version: 5.5.3 + + packages/devtools-sui: + dependencies: + p-memoize: + specifier: ~4.0.4 + version: 4.0.4 + devDependencies: + '@layerzerolabs/devtools': + specifier: ~2.0.4 + version: link:../devtools + '@layerzerolabs/io-devtools': + specifier: ~0.3.2 + version: link:../io-devtools + '@layerzerolabs/lz-definitions': + specifier: ^3.0.148 + version: 3.0.148 + '@layerzerolabs/lz-sui-oft-sdk-v2': + specifier: ^3.0.156 + version: 3.0.156(typescript@5.5.3) + '@layerzerolabs/lz-sui-sdk-v2': + specifier: ^3.0.156 + version: 3.0.156(typescript@5.5.3) + '@mysten/bcs': + specifier: ^1.9.2 + version: 1.9.2 + '@mysten/sui': + specifier: ^1.45.2 + version: 1.45.2(typescript@5.5.3) + '@swc/core': + specifier: ^1.4.0 + version: 1.4.0 + '@swc/jest': + specifier: ^0.2.36 + version: 0.2.36(@swc/core@1.4.0) + '@types/jest': + specifier: ^29.5.12 + version: 29.5.12 + jest: + specifier: ^29.7.0 + version: 29.7.0(@types/node@18.18.14)(ts-node@10.9.2) + ts-node: + specifier: ^10.9.2 + version: 10.9.2(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3) + tslib: + specifier: ~2.6.2 + version: 2.6.3 + tsup: + specifier: ~8.0.1 + version: 8.0.1(@swc/core@1.4.0)(ts-node@10.9.2)(typescript@5.5.3) + typescript: + specifier: ^5.4.4 + version: 5.5.3 + packages/devtools-ton: dependencies: '@ton/core': @@ -4193,7 +4576,7 @@ importers: version: 3.3.0 '@ton/ton': specifier: npm:@layerzerolabs/ton@15.2.0-rc.3 - version: /@layerzerolabs/ton@15.2.0-rc.3(@layerzerolabs/ton@15.2.0-rc.3)(@swc/core@1.4.0)(@ton/core@0.59.0)(@ton/crypto@3.3.0)(@types/node@18.18.14)(typescript@5.5.3) + version: /@layerzerolabs/ton@15.2.0-rc.3(@layerzerolabs/ton@15.2.0-rc.3)(@swc/core@1.4.0)(@ton/core@0.59.0)(@ton/crypto@3.3.0)(@types/node@18.18.14)(chai@4.5.0)(typescript@5.5.3) p-memoize: specifier: ~4.0.4 version: 4.0.4 @@ -4273,7 +4656,7 @@ importers: version: 2.16.2 jest: specifier: ^29.6.2 - version: 29.7.0(@types/node@18.18.14)(ts-node@10.9.2) + version: 29.7.0(@types/node@18.18.14) tsup: specifier: ~8.0.1 version: 8.0.1(@swc/core@1.4.0)(typescript@5.5.3) @@ -4470,7 +4853,7 @@ importers: version: 29.5.12 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@18.18.14)(ts-node@10.9.2) + version: 29.7.0(@types/node@18.18.14) tslib: specifier: ~2.6.2 version: 2.6.3 @@ -5129,6 +5512,146 @@ importers: specifier: ^3.22.4 version: 3.22.4 + packages/protocol-devtools-starknet: + dependencies: + p-memoize: + specifier: ~4.0.4 + version: 4.0.4 + devDependencies: + '@layerzerolabs/devtools': + specifier: ~2.0.4 + version: link:../devtools + '@layerzerolabs/devtools-starknet': + specifier: ~0.1.0 + version: link:../devtools-starknet + '@layerzerolabs/io-devtools': + specifier: ~0.3.2 + version: link:../io-devtools + '@layerzerolabs/lz-definitions': + specifier: ^3.0.148 + version: 3.0.148 + '@layerzerolabs/lz-v2-utilities': + specifier: ^3.0.148 + version: 3.0.148 + '@layerzerolabs/protocol-devtools': + specifier: ~3.0.2 + version: link:../protocol-devtools + '@layerzerolabs/protocol-starknet-v2': + specifier: ^0.2.19 + version: 0.2.19 + '@layerzerolabs/test-devtools': + specifier: ~0.4.7 + version: link:../test-devtools + '@layerzerolabs/test-devtools-starknet': + specifier: ~0.0.1 + version: link:../test-devtools-starknet + '@swc/core': + specifier: ^1.4.0 + version: 1.4.0 + '@swc/jest': + specifier: ^0.2.36 + version: 0.2.36(@swc/core@1.4.0) + '@types/jest': + specifier: ^29.5.12 + version: 29.5.12 + fast-check: + specifier: ^3.15.1 + version: 3.23.1 + jest: + specifier: ^29.7.0 + version: 29.7.0(@types/node@18.18.14)(ts-node@10.9.2) + jest-extended: + specifier: ^4.0.2 + version: 4.0.2(jest@29.7.0) + starknet: + specifier: ^8.9.0 + version: 8.9.2 + ts-node: + specifier: ^10.9.2 + version: 10.9.2(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3) + tslib: + specifier: ~2.6.2 + version: 2.6.3 + tsup: + specifier: ~8.0.1 + version: 8.0.1(@swc/core@1.4.0)(ts-node@10.9.2)(typescript@5.5.3) + typescript: + specifier: ^5.4.4 + version: 5.5.3 + zod: + specifier: ^3.22.4 + version: 3.22.4 + + packages/protocol-devtools-sui: + dependencies: + p-memoize: + specifier: ~4.0.4 + version: 4.0.4 + devDependencies: + '@layerzerolabs/devtools': + specifier: ~2.0.4 + version: link:../devtools + '@layerzerolabs/devtools-sui': + specifier: ~0.1.0 + version: link:../devtools-sui + '@layerzerolabs/io-devtools': + specifier: ~0.3.2 + version: link:../io-devtools + '@layerzerolabs/lz-definitions': + specifier: ^3.0.148 + version: 3.0.148 + '@layerzerolabs/lz-sui-sdk-v2': + specifier: ^3.0.156 + version: 3.0.156(typescript@5.5.3) + '@layerzerolabs/lz-v2-utilities': + specifier: ^3.0.148 + version: 3.0.148 + '@layerzerolabs/protocol-devtools': + specifier: ~3.0.2 + version: link:../protocol-devtools + '@layerzerolabs/test-devtools': + specifier: ~0.4.7 + version: link:../test-devtools + '@layerzerolabs/test-devtools-sui': + specifier: ~0.0.1 + version: link:../test-devtools-sui + '@mysten/sui': + specifier: ^1.45.2 + version: 1.45.2(typescript@5.5.3) + '@swc/core': + specifier: ^1.4.0 + version: 1.4.0 + '@swc/jest': + specifier: ^0.2.36 + version: 0.2.36(@swc/core@1.4.0) + '@types/jest': + specifier: ^29.5.12 + version: 29.5.12 + fast-check: + specifier: ^3.15.1 + version: 3.23.1 + jest: + specifier: ^29.7.0 + version: 29.7.0(@types/node@18.18.14)(ts-node@10.9.2) + jest-extended: + specifier: ^4.0.2 + version: 4.0.2(jest@29.7.0) + ts-node: + specifier: ^10.9.2 + version: 10.9.2(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3) + tslib: + specifier: ~2.6.2 + version: 2.6.3 + tsup: + specifier: ~8.0.1 + version: 8.0.1(@swc/core@1.4.0)(ts-node@10.9.2)(typescript@5.5.3) + typescript: + specifier: ^5.4.4 + version: 5.5.3 + zod: + specifier: ^3.22.4 + version: 3.22.4 + packages/script-devtools-evm-foundry: dependencies: '@layerzerolabs/oapp-evm': @@ -5289,7 +5812,43 @@ importers: version: 6.0.0 fast-check: specifier: ^3.15.1 - version: 3.15.1 + version: 3.15.1 + ts-node: + specifier: ^10.9.2 + version: 10.9.2(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3) + tslib: + specifier: ~2.6.2 + version: 2.6.3 + tsup: + specifier: ~8.0.1 + version: 8.0.1(@swc/core@1.4.0)(ts-node@10.9.2)(typescript@5.5.3) + typescript: + specifier: ^5.4.4 + version: 5.5.3 + + packages/test-devtools-starknet: + devDependencies: + fast-check: + specifier: ^3.15.1 + version: 3.23.1 + ts-node: + specifier: ^10.9.2 + version: 10.9.2(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3) + tslib: + specifier: ~2.6.2 + version: 2.6.3 + tsup: + specifier: ~8.0.1 + version: 8.0.1(@swc/core@1.4.0)(ts-node@10.9.2)(typescript@5.5.3) + typescript: + specifier: ^5.4.4 + version: 5.5.3 + + packages/test-devtools-sui: + devDependencies: + fast-check: + specifier: ^3.15.1 + version: 3.23.1 ts-node: specifier: ^10.9.2 version: 10.9.2(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3) @@ -5796,6 +6355,158 @@ importers: specifier: ^3.22.4 version: 3.22.4 + packages/ua-devtools-starknet: + dependencies: + p-memoize: + specifier: ~4.0.4 + version: 4.0.4 + devDependencies: + '@layerzerolabs/devtools': + specifier: ~2.0.4 + version: link:../devtools + '@layerzerolabs/devtools-starknet': + specifier: ~0.1.0 + version: link:../devtools-starknet + '@layerzerolabs/io-devtools': + specifier: ~0.3.2 + version: link:../io-devtools + '@layerzerolabs/lz-definitions': + specifier: ^3.0.148 + version: 3.0.148 + '@layerzerolabs/lz-v2-utilities': + specifier: ^3.0.148 + version: 3.0.148 + '@layerzerolabs/oft-mint-burn-starknet': + specifier: ^0.2.19 + version: 0.2.19(@layerzerolabs/protocol-starknet-v2@0.2.19) + '@layerzerolabs/protocol-devtools': + specifier: ~3.0.2 + version: link:../protocol-devtools + '@layerzerolabs/protocol-devtools-starknet': + specifier: ~0.1.0 + version: link:../protocol-devtools-starknet + '@layerzerolabs/protocol-starknet-v2': + specifier: ^0.2.19 + version: 0.2.19 + '@layerzerolabs/test-devtools': + specifier: ~0.4.7 + version: link:../test-devtools + '@layerzerolabs/test-devtools-starknet': + specifier: ~0.0.1 + version: link:../test-devtools-starknet + '@layerzerolabs/ua-devtools': + specifier: ~5.0.2 + version: link:../ua-devtools + '@swc/core': + specifier: ^1.4.0 + version: 1.4.0 + '@swc/jest': + specifier: ^0.2.36 + version: 0.2.36(@swc/core@1.4.0) + '@types/jest': + specifier: ^29.5.12 + version: 29.5.12 + fast-check: + specifier: ^3.15.1 + version: 3.23.1 + jest: + specifier: ^29.7.0 + version: 29.7.0(@types/node@18.18.14)(ts-node@10.9.2) + jest-extended: + specifier: ^4.0.2 + version: 4.0.2(jest@29.7.0) + starknet: + specifier: ^8.9.0 + version: 8.9.2 + ts-node: + specifier: ^10.9.2 + version: 10.9.2(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3) + tslib: + specifier: ~2.6.2 + version: 2.6.3 + tsup: + specifier: ~8.0.1 + version: 8.0.1(@swc/core@1.4.0)(ts-node@10.9.2)(typescript@5.5.3) + typescript: + specifier: ^5.4.4 + version: 5.5.3 + + packages/ua-devtools-sui: + dependencies: + p-memoize: + specifier: ~4.0.4 + version: 4.0.4 + devDependencies: + '@layerzerolabs/devtools': + specifier: ~2.0.4 + version: link:../devtools + '@layerzerolabs/devtools-sui': + specifier: ~0.1.0 + version: link:../devtools-sui + '@layerzerolabs/io-devtools': + specifier: ~0.3.2 + version: link:../io-devtools + '@layerzerolabs/lz-definitions': + specifier: ^3.0.148 + version: 3.0.148 + '@layerzerolabs/lz-sui-oft-sdk-v2': + specifier: ^3.0.156 + version: 3.0.156(typescript@5.5.3) + '@layerzerolabs/lz-sui-sdk-v2': + specifier: ^3.0.156 + version: 3.0.156(typescript@5.5.3) + '@layerzerolabs/lz-v2-utilities': + specifier: ^3.0.148 + version: 3.0.148 + '@layerzerolabs/protocol-devtools': + specifier: ~3.0.2 + version: link:../protocol-devtools + '@layerzerolabs/protocol-devtools-sui': + specifier: ~0.1.0 + version: link:../protocol-devtools-sui + '@layerzerolabs/test-devtools': + specifier: ~0.4.7 + version: link:../test-devtools + '@layerzerolabs/test-devtools-sui': + specifier: ~0.0.1 + version: link:../test-devtools-sui + '@layerzerolabs/ua-devtools': + specifier: ~5.0.2 + version: link:../ua-devtools + '@mysten/sui': + specifier: ^1.45.2 + version: 1.45.2(typescript@5.5.3) + '@swc/core': + specifier: ^1.4.0 + version: 1.4.0 + '@swc/jest': + specifier: ^0.2.36 + version: 0.2.36(@swc/core@1.4.0) + '@types/jest': + specifier: ^29.5.12 + version: 29.5.12 + fast-check: + specifier: ^3.15.1 + version: 3.23.1 + jest: + specifier: ^29.7.0 + version: 29.7.0(@types/node@18.18.14)(ts-node@10.9.2) + jest-extended: + specifier: ^4.0.2 + version: 4.0.2(jest@29.7.0) + ts-node: + specifier: ^10.9.2 + version: 10.9.2(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3) + tslib: + specifier: ~2.6.2 + version: 2.6.3 + tsup: + specifier: ~8.0.1 + version: 8.0.1(@swc/core@1.4.0)(ts-node@10.9.2)(typescript@5.5.3) + typescript: + specifier: ^5.4.4 + version: 5.5.3 + packages/verify-contract: devDependencies: '@ethersproject/abi': @@ -5833,7 +6544,7 @@ importers: version: 12.6.1 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@18.18.14)(ts-node@10.9.2) + version: 29.7.0(@types/node@18.18.14) tsup: specifier: ^8.0.1 version: 8.0.1(@swc/core@1.4.0)(typescript@5.5.3) @@ -6716,7 +7427,6 @@ packages: '@babel/helper-validator-identifier': 7.28.5 js-tokens: 4.0.0 picocolors: 1.1.1 - dev: true /@babel/compat-data@7.23.5: resolution: {integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==} @@ -6885,7 +7595,6 @@ packages: /@babel/helper-plugin-utils@7.27.1: resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} engines: {node: '>=6.9.0'} - dev: true /@babel/helper-simple-access@7.22.5: resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} @@ -6910,7 +7619,6 @@ packages: /@babel/helper-string-parser@7.27.1: resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} - dev: true /@babel/helper-validator-identifier@7.22.20: resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} @@ -6923,7 +7631,6 @@ packages: /@babel/helper-validator-identifier@7.28.5: resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} engines: {node: '>=6.9.0'} - dev: true /@babel/helper-validator-option@7.23.5: resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} @@ -6980,7 +7687,6 @@ packages: hasBin: true dependencies: '@babel/types': 7.28.5 - dev: true /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.9): resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} @@ -7033,6 +7739,15 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.23.9): + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 + /@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'} @@ -7043,6 +7758,15 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.23.9): + resolution: {integrity: sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.27.1 + /@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.28.5): resolution: {integrity: sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==} engines: {node: '>=6.9.0'} @@ -7208,6 +7932,15 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.23.9): + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 + /@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'} @@ -7277,7 +8010,6 @@ packages: '@babel/code-frame': 7.27.1 '@babel/parser': 7.28.5 '@babel/types': 7.28.5 - dev: true /@babel/traverse@7.23.9: resolution: {integrity: sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==} @@ -7332,7 +8064,6 @@ packages: dependencies: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.28.5 - dev: true /@balena/dockerignore@1.0.2: resolution: {integrity: sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q==} @@ -7344,7 +8075,7 @@ packages: /@bitcoinerlab/secp256k1@1.2.0: resolution: {integrity: sha512-jeujZSzb3JOZfmJYI0ph1PVpCRV5oaexCgy+RvCXV8XlY+XFB/2n3WOcvBsKLsOw78KYgnQrQWb2HrKE4be88Q==} dependencies: - '@noble/curves': 1.8.1 + '@noble/curves': 1.9.6 /@chainlink/contracts-ccip@0.7.6(ethers@5.7.2): resolution: {integrity: sha512-yNbCBFpLs3R+ALymto9dQYKz3vatnjqYGu1pnMD0i2fHEMthiXe0+otaNCGNht6n8k7ruNaA0DNpz3F+2jHQXw==} @@ -8321,7 +9052,7 @@ packages: - supports-color dev: true - /@ethereum-waffle/compiler@4.0.3(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(solc@0.8.15)(typechain@8.3.2)(typescript@5.5.3): + /@ethereum-waffle/compiler@4.0.3(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0)(ethers@5.7.2)(solc@0.8.15)(typechain@8.3.2)(typescript@5.5.3): resolution: {integrity: sha512-5x5U52tSvEVJS6dpCeXXKvRKyf8GICDwiTwUvGD3/WD+DpvgvaoHOL82XqpTSUHgV3bBq6ma5/8gKUJUIAnJCw==} engines: {node: '>=10.0'} peerDependencies: @@ -8331,7 +9062,7 @@ packages: dependencies: '@resolver-engine/imports': 0.3.3 '@resolver-engine/imports-fs': 0.3.3 - '@typechain/ethers-v5': 10.2.1(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typechain@8.3.2)(typescript@5.5.3) + '@typechain/ethers-v5': 10.2.1(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0)(ethers@5.7.2)(typechain@8.3.2)(typescript@5.5.3) '@types/mkdirp': 0.5.2 '@types/node-fetch': 2.6.11 ethers: 5.7.2 @@ -8601,7 +9332,7 @@ packages: /@ethersproject/bytes@5.7.0: resolution: {integrity: sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==} dependencies: - '@ethersproject/logger': 5.7.0 + '@ethersproject/logger': 5.8.0 /@ethersproject/bytes@5.8.0: resolution: {integrity: sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A==} @@ -8611,7 +9342,7 @@ packages: /@ethersproject/constants@5.7.0: resolution: {integrity: sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==} dependencies: - '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bignumber': 5.8.0 /@ethersproject/constants@5.8.0: resolution: {integrity: sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg==} @@ -8621,9 +9352,9 @@ packages: /@ethersproject/contracts@5.7.0: resolution: {integrity: sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==} dependencies: - '@ethersproject/abi': 5.7.0 + '@ethersproject/abi': 5.8.0 '@ethersproject/abstract-provider': 5.7.0 - '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/abstract-signer': 5.8.0 '@ethersproject/address': 5.7.0 '@ethersproject/bignumber': 5.7.0 '@ethersproject/bytes': 5.7.0 @@ -8635,7 +9366,7 @@ packages: /@ethersproject/hash@5.7.0: resolution: {integrity: sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==} dependencies: - '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/abstract-signer': 5.8.0 '@ethersproject/address': 5.7.0 '@ethersproject/base64': 5.7.0 '@ethersproject/bignumber': 5.7.0 @@ -8661,7 +9392,7 @@ packages: /@ethersproject/hdnode@5.7.0: resolution: {integrity: sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==} dependencies: - '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/abstract-signer': 5.8.0 '@ethersproject/basex': 5.7.0 '@ethersproject/bignumber': 5.7.0 '@ethersproject/bytes': 5.7.0 @@ -8677,7 +9408,7 @@ packages: /@ethersproject/json-wallets@5.7.0: resolution: {integrity: sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==} dependencies: - '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/abstract-signer': 5.8.0 '@ethersproject/address': 5.7.0 '@ethersproject/bytes': 5.7.0 '@ethersproject/hdnode': 5.7.0 @@ -8739,7 +9470,7 @@ packages: resolution: {integrity: sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==} dependencies: '@ethersproject/abstract-provider': 5.7.0 - '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/abstract-signer': 5.8.0 '@ethersproject/address': 5.7.0 '@ethersproject/base64': 5.7.0 '@ethersproject/basex': 5.7.0 @@ -8784,7 +9515,7 @@ packages: '@ethersproject/transactions': 5.8.0 '@ethersproject/web': 5.8.0 bech32: 1.1.4 - ws: 8.18.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + ws: 8.18.0 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -8918,7 +9649,7 @@ packages: resolution: {integrity: sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==} dependencies: '@ethersproject/abstract-provider': 5.7.0 - '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/abstract-signer': 5.8.0 '@ethersproject/address': 5.7.0 '@ethersproject/bignumber': 5.7.0 '@ethersproject/bytes': 5.7.0 @@ -9121,7 +9852,7 @@ packages: '@ledgerhq/hw-transport': 6.31.4 '@ledgerhq/hw-transport-webhid': 6.30.0 '@ledgerhq/hw-transport-webusb': 6.29.4 - '@mysten/bcs': 1.2.0 + '@mysten/bcs': 1.9.2 axios: 1.8.4 bech32: 2.0.0 bignumber.js: 9.1.2 @@ -9131,8 +9862,8 @@ packages: keccak256: 1.0.6 ripemd160: 2.0.2 secp256k1: 5.0.1 - semver: 7.6.3 - ws: 8.18.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + semver: 7.7.3 + ws: 8.18.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - debug @@ -9149,7 +9880,7 @@ packages: '@ledgerhq/hw-transport': 6.31.4 '@ledgerhq/hw-transport-webhid': 6.30.0 '@ledgerhq/hw-transport-webusb': 6.29.4 - '@mysten/bcs': 1.2.0 + '@mysten/bcs': 1.9.2 axios: 1.8.4 bech32: 2.0.0 bignumber.js: 9.1.2 @@ -9159,8 +9890,8 @@ packages: keccak256: 1.0.6 ripemd160: 2.0.2 secp256k1: 5.0.1 - semver: 7.6.3 - ws: 8.18.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + semver: 7.7.3 + ws: 8.18.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - debug @@ -9177,7 +9908,7 @@ packages: '@ledgerhq/hw-transport': 6.31.4 '@ledgerhq/hw-transport-webhid': 6.30.0 '@ledgerhq/hw-transport-webusb': 6.29.4 - '@mysten/bcs': 1.2.0 + '@mysten/bcs': 1.9.2 axios: 1.8.4 bech32: 2.0.0 bignumber.js: 9.1.2 @@ -9187,8 +9918,8 @@ packages: keccak256: 1.0.6 ripemd160: 2.0.2 secp256k1: 5.0.1 - semver: 7.6.3 - ws: 8.18.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + semver: 7.7.3 + ws: 8.18.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - debug @@ -9668,6 +10399,49 @@ packages: slash: 3.0.0 dev: true + /@jest/core@29.7.0: + 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) + 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/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} @@ -9975,7 +10749,7 @@ packages: resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jridgewell/trace-mapping': 0.3.22 + '@jridgewell/trace-mapping': 0.3.31 callsites: 3.1.0 graceful-fs: 4.2.11 @@ -10130,7 +10904,6 @@ packages: /@jridgewell/sourcemap-codec@1.5.0: resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} - dev: true /@jridgewell/trace-mapping@0.3.22: resolution: {integrity: sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==} @@ -10143,7 +10916,6 @@ packages: dependencies: '@jridgewell/resolve-uri': 3.1.1 '@jridgewell/sourcemap-codec': 1.5.0 - dev: true /@jridgewell/trace-mapping@0.3.9: resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} @@ -10485,19 +11257,21 @@ packages: resolution: {integrity: sha512-xnUHJq2Z6rUw8iz+896nOOv5nQsrrDFyN7zJYBVdE5OyAEdUXh6nhwoc/K7BK4MECZYCmP+HLyYKM1H87nTTQg==} dependencies: '@layerzerolabs/lz-core': 3.0.120 - '@layerzerolabs/lz-utilities': 3.0.120(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3) + '@layerzerolabs/lz-utilities': 3.0.138(@swc/core@1.4.0)(@types/node@18.18.14)(chai@4.5.0)(typescript@5.5.3) '@metaplex-foundation/umi': 0.9.2 '@metaplex-foundation/umi-eddsa-web3js': 0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.98.0) '@metaplex-foundation/umi-program-repository': 0.9.2(@metaplex-foundation/umi@0.9.2) '@metaplex-foundation/umi-rpc-web3js': 0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.98.0) '@metaplex-foundation/umi-transaction-factory-web3js': 0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.98.0) - '@noble/hashes': 1.7.1 + '@noble/hashes': 1.8.0 '@noble/secp256k1': 1.7.1 '@solana/web3.js': 1.98.0 bip39: 3.1.0 ed25519-hd-key: 1.3.0 memoizee: 0.4.17 transitivePeerDependencies: + - '@gql.tada/svelte-support' + - '@gql.tada/vue-support' - '@jest/globals' - '@swc/core' - '@swc/wasm' @@ -10514,20 +11288,54 @@ packages: /@layerzerolabs/lz-corekit-solana@3.0.120(@types/node@18.18.14)(chai@4.5.0)(typescript@5.5.3): resolution: {integrity: sha512-xnUHJq2Z6rUw8iz+896nOOv5nQsrrDFyN7zJYBVdE5OyAEdUXh6nhwoc/K7BK4MECZYCmP+HLyYKM1H87nTTQg==} dependencies: - '@layerzerolabs/lz-core': 3.0.120 - '@layerzerolabs/lz-utilities': 3.0.120(@types/node@18.18.14)(chai@4.5.0)(typescript@5.5.3) + '@layerzerolabs/lz-core': 3.0.120 + '@layerzerolabs/lz-utilities': 3.0.138(@types/node@18.18.14)(chai@4.5.0)(typescript@5.5.3) + '@metaplex-foundation/umi': 0.9.2 + '@metaplex-foundation/umi-eddsa-web3js': 0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.98.0) + '@metaplex-foundation/umi-program-repository': 0.9.2(@metaplex-foundation/umi@0.9.2) + '@metaplex-foundation/umi-rpc-web3js': 0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.98.0) + '@metaplex-foundation/umi-transaction-factory-web3js': 0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.98.0) + '@noble/hashes': 1.8.0 + '@noble/secp256k1': 1.7.1 + '@solana/web3.js': 1.98.0 + bip39: 3.1.0 + ed25519-hd-key: 1.3.0 + memoizee: 0.4.17 + transitivePeerDependencies: + - '@gql.tada/svelte-support' + - '@gql.tada/vue-support' + - '@jest/globals' + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - bufferutil + - chai + - debug + - encoding + - supports-color + - typescript + - utf-8-validate + dev: true + + /@layerzerolabs/lz-corekit-solana@3.0.138(@swc/core@1.4.0)(@types/node@18.18.14)(chai@4.4.1)(typescript@5.5.3): + resolution: {integrity: sha512-sVWbiaTb/+U+Rfsm9+1GKknRy8WwUDWJfp34T/7WWsR/kQeDBmGTlb6OE8/I3U/QcQP2Wgv+CSphKAhOXL6bgw==} + dependencies: + '@layerzerolabs/lz-core': 3.0.138 + '@layerzerolabs/lz-utilities': 3.0.138(@swc/core@1.4.0)(@types/node@18.18.14)(chai@4.4.1)(typescript@5.5.3) '@metaplex-foundation/umi': 0.9.2 '@metaplex-foundation/umi-eddsa-web3js': 0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.98.0) '@metaplex-foundation/umi-program-repository': 0.9.2(@metaplex-foundation/umi@0.9.2) '@metaplex-foundation/umi-rpc-web3js': 0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.98.0) '@metaplex-foundation/umi-transaction-factory-web3js': 0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.98.0) - '@noble/hashes': 1.7.1 + '@noble/hashes': 1.8.0 '@noble/secp256k1': 1.7.1 '@solana/web3.js': 1.98.0 bip39: 3.1.0 ed25519-hd-key: 1.3.0 memoizee: 0.4.17 transitivePeerDependencies: + - '@gql.tada/svelte-support' + - '@gql.tada/vue-support' - '@jest/globals' - '@swc/core' - '@swc/wasm' @@ -10541,11 +11349,11 @@ packages: - utf-8-validate dev: true - /@layerzerolabs/lz-corekit-solana@3.0.138(@swc/core@1.4.0)(@types/node@18.18.14)(chai@4.4.1)(typescript@5.5.3): + /@layerzerolabs/lz-corekit-solana@3.0.138(@swc/core@1.4.0)(@types/node@18.18.14)(chai@4.5.0)(typescript@5.5.3): resolution: {integrity: sha512-sVWbiaTb/+U+Rfsm9+1GKknRy8WwUDWJfp34T/7WWsR/kQeDBmGTlb6OE8/I3U/QcQP2Wgv+CSphKAhOXL6bgw==} dependencies: '@layerzerolabs/lz-core': 3.0.138 - '@layerzerolabs/lz-utilities': 3.0.138(@swc/core@1.4.0)(@types/node@18.18.14)(chai@4.4.1)(typescript@5.5.3) + '@layerzerolabs/lz-utilities': 3.0.138(@swc/core@1.4.0)(@types/node@18.18.14)(chai@4.5.0)(typescript@5.5.3) '@metaplex-foundation/umi': 0.9.2 '@metaplex-foundation/umi-eddsa-web3js': 0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.98.0) '@metaplex-foundation/umi-program-repository': 0.9.2(@metaplex-foundation/umi@0.9.2) @@ -10577,7 +11385,7 @@ packages: resolution: {integrity: sha512-sVWbiaTb/+U+Rfsm9+1GKknRy8WwUDWJfp34T/7WWsR/kQeDBmGTlb6OE8/I3U/QcQP2Wgv+CSphKAhOXL6bgw==} dependencies: '@layerzerolabs/lz-core': 3.0.138 - '@layerzerolabs/lz-utilities': 3.0.138(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3) + '@layerzerolabs/lz-utilities': 3.0.138(@swc/core@1.4.0)(@types/node@18.18.14)(chai@4.5.0)(typescript@5.5.3) '@metaplex-foundation/umi': 0.9.2 '@metaplex-foundation/umi-eddsa-web3js': 0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.98.0) '@metaplex-foundation/umi-program-repository': 0.9.2(@metaplex-foundation/umi@0.9.2) @@ -10648,6 +11456,12 @@ packages: dependencies: tiny-invariant: 1.3.3 + /@layerzerolabs/lz-definitions@3.0.156: + resolution: {integrity: sha512-9gXF+C3LJ3mwrrkVBvVwXaeRnZNFNFeEuA0ykp881IRMFmmcVKLYOkidFgmaItm70MishMrrt4Lo+wWuzkqqUg==} + dependencies: + tiny-invariant: 1.3.3 + dev: true + /@layerzerolabs/lz-definitions@3.0.75: resolution: {integrity: sha512-TIbFBCfuElg6WcND4HNUROTSAayBETDC0YrISVadByo3iM2baAi+rpGC1kdrOxOTRlSBetd2khTOUCd7/sZdOQ==} dependencies: @@ -11271,14 +12085,16 @@ packages: resolution: {integrity: sha512-3gHF042QffR7Vn3hj9jzQ4Y50iCQNnFPzMlrQYtsafYw/A30IjvxX0rhid2eVP9jC9Ib/nUDeakvx4joSe0KoQ==} dependencies: '@layerzerolabs/lz-definitions': 3.0.148 - '@layerzerolabs/lz-utilities': 3.0.120(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3) + '@layerzerolabs/lz-utilities': 3.0.138(@swc/core@1.4.0)(@types/node@18.18.14)(chai@4.5.0)(typescript@5.5.3) '@noble/ed25519': 1.7.3 - '@noble/hashes': 1.7.1 + '@noble/hashes': 1.8.0 '@noble/secp256k1': 1.7.1 - '@scure/base': 1.2.4 + '@scure/base': 1.2.6 bech32: 2.0.0 memoizee: 0.4.17 transitivePeerDependencies: + - '@gql.tada/svelte-support' + - '@gql.tada/vue-support' - '@jest/globals' - '@swc/core' - '@swc/wasm' @@ -11296,14 +12112,16 @@ packages: resolution: {integrity: sha512-3gHF042QffR7Vn3hj9jzQ4Y50iCQNnFPzMlrQYtsafYw/A30IjvxX0rhid2eVP9jC9Ib/nUDeakvx4joSe0KoQ==} dependencies: '@layerzerolabs/lz-definitions': 3.0.148 - '@layerzerolabs/lz-utilities': 3.0.120(@types/node@18.18.14)(chai@4.5.0)(typescript@5.5.3) + '@layerzerolabs/lz-utilities': 3.0.138(@types/node@18.18.14)(chai@4.5.0)(typescript@5.5.3) '@noble/ed25519': 1.7.3 - '@noble/hashes': 1.7.1 + '@noble/hashes': 1.8.0 '@noble/secp256k1': 1.7.1 - '@scure/base': 1.2.4 + '@scure/base': 1.2.6 bech32: 2.0.0 memoizee: 0.4.17 transitivePeerDependencies: + - '@gql.tada/svelte-support' + - '@gql.tada/vue-support' - '@jest/globals' - '@swc/core' - '@swc/wasm' @@ -11344,11 +12162,38 @@ packages: - utf-8-validate dev: true + /@layerzerolabs/lz-foundation@3.0.138(@swc/core@1.4.0)(@types/node@18.18.14)(chai@4.5.0)(typescript@5.5.3): + resolution: {integrity: sha512-NOv6yiNnIaNBfzGnGlNyJ4ZtIAdze8wVVdPEzL8JkiWvICS6DB56OzNTNx8c9lD1m5I6+Y4oEuIm1ttarNhqWQ==} + dependencies: + '@layerzerolabs/lz-definitions': 3.0.148 + '@layerzerolabs/lz-utilities': 3.0.138(@swc/core@1.4.0)(@types/node@18.18.14)(chai@4.5.0)(typescript@5.5.3) + '@noble/ed25519': 1.7.3 + '@noble/hashes': 1.8.0 + '@noble/secp256k1': 1.7.1 + '@scure/base': 1.2.6 + bech32: 2.0.0 + memoizee: 0.4.17 + transitivePeerDependencies: + - '@gql.tada/svelte-support' + - '@gql.tada/vue-support' + - '@jest/globals' + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - bufferutil + - chai + - debug + - encoding + - supports-color + - typescript + - utf-8-validate + dev: true + /@layerzerolabs/lz-foundation@3.0.138(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3): resolution: {integrity: sha512-NOv6yiNnIaNBfzGnGlNyJ4ZtIAdze8wVVdPEzL8JkiWvICS6DB56OzNTNx8c9lD1m5I6+Y4oEuIm1ttarNhqWQ==} dependencies: '@layerzerolabs/lz-definitions': 3.0.148 - '@layerzerolabs/lz-utilities': 3.0.138(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3) + '@layerzerolabs/lz-utilities': 3.0.138(@swc/core@1.4.0)(@types/node@18.18.14)(chai@4.5.0)(typescript@5.5.3) '@noble/ed25519': 1.7.3 '@noble/hashes': 1.8.0 '@noble/secp256k1': 1.7.1 @@ -11402,12 +12247,14 @@ packages: resolution: {integrity: sha512-0WDrlJ+DZ3GGxKPgcConoxQdTB7icpoOYjeTcwmBtJcUnXIE7G3vxzKUAKsUccGegFdgHMEj1K4D+3NPZbNQ2A==} dependencies: '@layerzerolabs/lz-definitions': 3.0.148 - '@layerzerolabs/lz-utilities': 3.0.120(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3) + '@layerzerolabs/lz-utilities': 3.0.138(@swc/core@1.4.0)(@types/node@18.18.14)(chai@4.5.0)(typescript@5.5.3) '@noble/ed25519': 1.7.3 - '@noble/hashes': 1.7.1 + '@noble/hashes': 1.8.0 '@noble/secp256k1': 1.7.1 - '@scure/base': 1.2.1 + '@scure/base': 1.2.6 transitivePeerDependencies: + - '@gql.tada/svelte-support' + - '@gql.tada/vue-support' - '@jest/globals' - '@swc/core' - '@swc/wasm' @@ -11425,12 +12272,14 @@ packages: resolution: {integrity: sha512-ZJC/PRPhF5LHt32dGIj3HGNAD+ReGNYsdLzfR2P8JMuAph1T0W3FsniVjjDMEVxyKOrXVHOt0GFg9o56lYCcEw==} dependencies: '@layerzerolabs/lz-definitions': 3.0.148 - '@layerzerolabs/lz-utilities': 3.0.120(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3) + '@layerzerolabs/lz-utilities': 3.0.138(@swc/core@1.4.0)(@types/node@18.18.14)(chai@4.5.0)(typescript@5.5.3) '@noble/ed25519': 1.7.3 - '@noble/hashes': 1.7.1 + '@noble/hashes': 1.8.0 '@noble/secp256k1': 1.7.1 - '@scure/base': 1.2.1 + '@scure/base': 1.2.6 transitivePeerDependencies: + - '@gql.tada/svelte-support' + - '@gql.tada/vue-support' - '@jest/globals' - '@swc/core' - '@swc/wasm' @@ -11471,7 +12320,7 @@ packages: dependencies: '@coral-xyz/anchor': 0.29.0 '@layerzerolabs/lz-core': 3.0.120 - '@layerzerolabs/lz-utilities': 3.0.120(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3) + '@layerzerolabs/lz-utilities': 3.0.138(@swc/core@1.4.0)(@types/node@18.18.14)(chai@4.5.0)(typescript@5.5.3) '@layerzerolabs/tron-utilities': 3.0.120(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3) aptos: 1.21.0 bip39: 3.1.0 @@ -11480,6 +12329,8 @@ packages: memoizee: 0.4.17 tronweb: 5.3.3 transitivePeerDependencies: + - '@gql.tada/svelte-support' + - '@gql.tada/vue-support' - '@jest/globals' - '@swc/core' - '@swc/wasm' @@ -11498,7 +12349,7 @@ packages: dependencies: '@coral-xyz/anchor': 0.29.0 '@layerzerolabs/lz-core': 3.0.120 - '@layerzerolabs/lz-utilities': 3.0.120(@types/node@18.18.14)(chai@4.5.0)(typescript@5.5.3) + '@layerzerolabs/lz-utilities': 3.0.138(@types/node@18.18.14)(chai@4.5.0)(typescript@5.5.3) '@layerzerolabs/tron-utilities': 3.0.120(@types/node@18.18.14)(chai@4.5.0)(typescript@5.5.3) aptos: 1.21.0 bip39: 3.1.0 @@ -11507,6 +12358,8 @@ packages: memoizee: 0.4.17 tronweb: 5.3.3 transitivePeerDependencies: + - '@gql.tada/svelte-support' + - '@gql.tada/vue-support' - '@jest/globals' - '@swc/core' - '@swc/wasm' @@ -11549,12 +12402,41 @@ packages: - utf-8-validate dev: true + /@layerzerolabs/lz-serdes@3.0.138(@swc/core@1.4.0)(@types/node@18.18.14)(chai@4.5.0)(typescript@5.5.3): + resolution: {integrity: sha512-syM+2bftTOw1k2i0NTSTSzI01Bf7fDiXiY0NuCHAxn+D5jOznGshdEh6uLnh1q+snaUBkgvFBesrh/IRQ09Wgg==} + dependencies: + '@coral-xyz/anchor': 0.29.0 + '@layerzerolabs/lz-core': 3.0.138 + '@layerzerolabs/lz-utilities': 3.0.138(@swc/core@1.4.0)(@types/node@18.18.14)(chai@4.5.0)(typescript@5.5.3) + '@layerzerolabs/tron-utilities': 3.0.138(@swc/core@1.4.0)(@types/node@18.18.14)(chai@4.5.0)(typescript@5.5.3) + aptos: 1.21.0 + bip39: 3.1.0 + ed25519-hd-key: 1.3.0 + ethers: 5.7.2 + memoizee: 0.4.17 + tronweb: 5.3.3 + transitivePeerDependencies: + - '@gql.tada/svelte-support' + - '@gql.tada/vue-support' + - '@jest/globals' + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - bufferutil + - chai + - debug + - encoding + - supports-color + - typescript + - utf-8-validate + dev: true + /@layerzerolabs/lz-serdes@3.0.138(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3): resolution: {integrity: sha512-syM+2bftTOw1k2i0NTSTSzI01Bf7fDiXiY0NuCHAxn+D5jOznGshdEh6uLnh1q+snaUBkgvFBesrh/IRQ09Wgg==} dependencies: '@coral-xyz/anchor': 0.29.0 '@layerzerolabs/lz-core': 3.0.138 - '@layerzerolabs/lz-utilities': 3.0.138(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3) + '@layerzerolabs/lz-utilities': 3.0.138(@swc/core@1.4.0)(@types/node@18.18.14)(chai@4.5.0)(typescript@5.5.3) '@layerzerolabs/tron-utilities': 3.0.138(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3) aptos: 1.21.0 bip39: 3.1.0 @@ -11634,6 +12516,8 @@ packages: bs58: 5.0.0 tiny-invariant: 1.3.3 transitivePeerDependencies: + - '@gql.tada/svelte-support' + - '@gql.tada/vue-support' - '@jest/globals' - '@swc/core' - '@swc/wasm' @@ -11671,6 +12555,8 @@ packages: bs58: 5.0.0 tiny-invariant: 1.3.3 transitivePeerDependencies: + - '@gql.tada/svelte-support' + - '@gql.tada/vue-support' - '@jest/globals' - '@swc/core' - '@swc/wasm' @@ -11724,6 +12610,45 @@ packages: - utf-8-validate dev: true + /@layerzerolabs/lz-solana-sdk-v2@3.0.138(@swc/core@1.4.0)(@types/node@18.18.14)(chai@4.5.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.3): + resolution: {integrity: sha512-e1PbfEQ/QJnHwL+wYxy/EjPsluf3y1NSZKenbwHNjF/I3BEjLRuLbE7V6rLO0HIG6rZMQXEkT/keo1+MTwd/gQ==} + dependencies: + '@layerzerolabs/lz-corekit-solana': 3.0.138(@swc/core@1.4.0)(@types/node@18.18.14)(chai@4.5.0)(typescript@5.5.3) + '@layerzerolabs/lz-definitions': 3.0.148 + '@layerzerolabs/lz-foundation': 3.0.138(@swc/core@1.4.0)(@types/node@18.18.14)(chai@4.5.0)(typescript@5.5.3) + '@layerzerolabs/lz-serdes': 3.0.138(@swc/core@1.4.0)(@types/node@18.18.14)(chai@4.5.0)(typescript@5.5.3) + '@layerzerolabs/lz-utilities': 3.0.138(@swc/core@1.4.0)(@types/node@18.18.14)(chai@4.5.0)(typescript@5.5.3) + '@layerzerolabs/lz-v2-utilities': 3.0.148 + '@metaplex-foundation/beet': 0.7.2 + '@metaplex-foundation/beet-solana': 0.4.1 + '@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.0) + '@metaplex-foundation/umi-program-repository': 0.9.2(@metaplex-foundation/umi@0.9.2) + '@metaplex-foundation/umi-rpc-web3js': 0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.98.0) + '@metaplex-foundation/umi-web3js-adapters': 0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.98.0) + '@solana/spl-token': 0.3.11(@solana/web3.js@1.98.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.3) + '@solana/web3.js': 1.98.0 + bn.js: 5.2.1 + bs58: 5.0.0 + tiny-invariant: 1.3.3 + transitivePeerDependencies: + - '@gql.tada/svelte-support' + - '@gql.tada/vue-support' + - '@jest/globals' + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - bufferutil + - chai + - debug + - encoding + - fastestsmallesttextencoderdecoder + - supports-color + - typescript + - utf-8-validate + dev: true + /@layerzerolabs/lz-solana-sdk-v2@3.0.138(@swc/core@1.4.0)(@types/node@18.18.14)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.3): resolution: {integrity: sha512-e1PbfEQ/QJnHwL+wYxy/EjPsluf3y1NSZKenbwHNjF/I3BEjLRuLbE7V6rLO0HIG6rZMQXEkT/keo1+MTwd/gQ==} dependencies: @@ -11731,7 +12656,7 @@ packages: '@layerzerolabs/lz-definitions': 3.0.148 '@layerzerolabs/lz-foundation': 3.0.138(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3) '@layerzerolabs/lz-serdes': 3.0.138(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3) - '@layerzerolabs/lz-utilities': 3.0.138(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3) + '@layerzerolabs/lz-utilities': 3.0.138(@swc/core@1.4.0)(@types/node@18.18.14)(chai@4.5.0)(typescript@5.5.3) '@layerzerolabs/lz-v2-utilities': 3.0.148 '@metaplex-foundation/beet': 0.7.2 '@metaplex-foundation/beet-solana': 0.4.1 @@ -11802,6 +12727,30 @@ packages: - utf-8-validate dev: false + /@layerzerolabs/lz-sui-oft-sdk-v2@3.0.156(typescript@5.5.3): + resolution: {integrity: sha512-zOvWGOD9HT1WdnY2nvVaG5Zw4Cqx3XeSQqxJBobt6TP1rLVlFN226BE8LVxEws8IdoomLD2Yz3BkR0BJS7l8bw==} + dependencies: + '@layerzerolabs/lz-definitions': 3.0.156 + '@layerzerolabs/lz-sui-sdk-v2': 3.0.156(typescript@5.5.3) + '@mysten/sui': 1.45.2(typescript@5.5.3) + transitivePeerDependencies: + - '@gql.tada/svelte-support' + - '@gql.tada/vue-support' + - typescript + dev: true + + /@layerzerolabs/lz-sui-sdk-v2@3.0.156(typescript@5.5.3): + resolution: {integrity: sha512-pQIl91brRk274hSiNS2NqUZ9U+l8zqPzeJ/1kOKPXZdiQIaz+/H2nwb0UXayxyAwXy3kl94ju/ecdOiKvHqAag==} + dependencies: + '@layerzerolabs/lz-definitions': 3.0.156 + '@mysten/sui': 1.45.2(typescript@5.5.3) + js-sha3: 0.8.0 + transitivePeerDependencies: + - '@gql.tada/svelte-support' + - '@gql.tada/vue-support' + - typescript + dev: true + /@layerzerolabs/lz-ton-sdk-v2@3.0.27: resolution: {integrity: sha512-AU1uOzmLjWvyHdJGTo689bXLsCS/QAmfQSjvZ4544muLfpGVLl3l6lOl8DwmN1UQuwKKK94C5rEvoElVUYf0zQ==} dependencies: @@ -11825,7 +12774,7 @@ packages: '@solana/web3.js': 1.98.0 '@ton/core': 0.59.0(@ton/crypto@3.3.0) '@ton/crypto': 3.3.0 - '@ton/ton': /@layerzerolabs/ton@15.2.0-rc.3(@layerzerolabs/ton@15.2.0-rc.3)(@swc/core@1.4.0)(@ton/core@0.59.0)(@ton/crypto@3.3.0)(@types/node@18.18.14)(typescript@5.5.3) + '@ton/ton': /@layerzerolabs/ton@15.2.0-rc.3(@layerzerolabs/ton@15.2.0-rc.3)(@swc/core@1.4.0)(@ton/core@0.59.0)(@ton/crypto@3.3.0)(@types/node@18.18.14)(chai@4.5.0)(typescript@5.5.3) aptos: 1.21.0 bip39: 3.1.0 dayjs: 1.11.13 @@ -11886,7 +12835,7 @@ packages: '@ethersproject/bytes': 5.8.0 '@initia/initia.js': 1.0.4(typescript@5.5.3) '@layerzerolabs/lz-definitions': 3.0.148 - '@mysten/sui': 1.39.0(typescript@5.5.3) + '@mysten/sui': 1.45.2(typescript@5.5.3) '@solana/web3.js': 1.98.0 '@ton/core': 0.59.0(@ton/crypto@3.3.0) '@ton/crypto': 3.3.0 @@ -11915,17 +12864,17 @@ packages: - utf-8-validate dev: true - /@layerzerolabs/lz-utilities@3.0.138(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3): + /@layerzerolabs/lz-utilities@3.0.138(@swc/core@1.4.0)(@types/node@18.18.14)(chai@4.5.0)(typescript@5.5.3): resolution: {integrity: sha512-kTHG7scP1Tq6qiOnewr2TiX76/NfOsM1IP5++yG5T/NkObf2KC89Yxltc/fOsRR6LOdROjL4FmM73obAUkLgPQ==} dependencies: '@ethersproject/bytes': 5.8.0 '@initia/initia.js': 1.0.4(typescript@5.5.3) '@layerzerolabs/lz-definitions': 3.0.148 - '@mysten/sui': 1.39.0(typescript@5.5.3) + '@mysten/sui': 1.45.2(typescript@5.5.3) '@solana/web3.js': 1.98.0 '@ton/core': 0.59.0(@ton/crypto@3.3.0) '@ton/crypto': 3.3.0 - '@ton/ton': /@layerzerolabs/ton@15.2.0-rc.3(@layerzerolabs/ton@15.2.0-rc.3)(@swc/core@1.4.0)(@ton/core@0.59.0)(@ton/crypto@3.3.0)(@types/node@18.18.14)(typescript@5.5.3) + '@ton/ton': /@layerzerolabs/ton@15.2.0-rc.3(@layerzerolabs/ton@15.2.0-rc.3)(@swc/core@1.4.0)(@ton/core@0.59.0)(@ton/crypto@3.3.0)(@types/node@18.18.14)(chai@4.5.0)(typescript@5.5.3) aptos: 1.21.0 bip39: 3.1.0 dayjs: 1.11.13 @@ -11956,7 +12905,7 @@ packages: '@ethersproject/bytes': 5.8.0 '@initia/initia.js': 1.0.4(typescript@5.5.3) '@layerzerolabs/lz-definitions': 3.0.148 - '@mysten/sui': 1.39.0(typescript@5.5.3) + '@mysten/sui': 1.45.2(typescript@5.5.3) '@solana/web3.js': 1.98.0 '@ton/core': 0.59.0(@ton/crypto@3.3.0) '@ton/crypto': 3.3.0 @@ -11983,7 +12932,6 @@ packages: - supports-color - typescript - utf-8-validate - dev: false /@layerzerolabs/lz-utilities@3.0.66(@jest/globals@29.7.0)(@types/node@18.18.14)(chai@4.5.0)(typescript@5.5.3): resolution: {integrity: sha512-PDc3YAdUcNCnFGbQ7oDg1Pja/wt0O+FyRbhwoyTBQdqjNT/hG35KI7sz1yZgAQG0IItzgqKGI/5n4LKMvjZH/Q==} @@ -12114,6 +13062,14 @@ packages: '@layerzerolabs/lz-definitions': 3.0.148 dev: true + /@layerzerolabs/oft-mint-burn-starknet@0.2.19(@layerzerolabs/protocol-starknet-v2@0.2.19): + resolution: {integrity: sha512-rBpFWOY74HDAGwtYI440BjU3RuCuQ8kVWvYlIqd+Kb2EnPLteaM6rI4CTSkDxJEH35kHvzD7HD3zLV562N0Ygw==} + peerDependencies: + '@layerzerolabs/protocol-starknet-v2': '>=0.2.0' + dependencies: + '@layerzerolabs/protocol-starknet-v2': 0.2.19 + dev: true + /@layerzerolabs/oft-v2-solana-sdk@3.0.138(@swc/core@1.4.0)(@types/node@18.18.14)(chai@4.4.1)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.3): resolution: {integrity: sha512-q2+OALy4F3cZE3Q2UGdmyiBLFROCfSo7X7rfbA8xPScdiIy6IP6p0nsDQeTGUbbMIbXzTOTrAaIPOiR+pfS4OA==} dependencies: @@ -12147,6 +13103,39 @@ packages: - utf-8-validate dev: true + /@layerzerolabs/oft-v2-solana-sdk@3.0.138(@swc/core@1.4.0)(@types/node@18.18.14)(chai@4.5.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.3): + resolution: {integrity: sha512-q2+OALy4F3cZE3Q2UGdmyiBLFROCfSo7X7rfbA8xPScdiIy6IP6p0nsDQeTGUbbMIbXzTOTrAaIPOiR+pfS4OA==} + dependencies: + '@ethersproject/bytes': 5.8.0 + '@layerzerolabs/lz-foundation': 3.0.138(@swc/core@1.4.0)(@types/node@18.18.14)(chai@4.5.0)(typescript@5.5.3) + '@layerzerolabs/lz-solana-sdk-v2': 3.0.138(@swc/core@1.4.0)(@types/node@18.18.14)(chai@4.5.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.3) + '@layerzerolabs/lz-v2-utilities': 3.0.148 + '@metaplex-foundation/beet': 0.7.2 + '@metaplex-foundation/beet-solana': 0.4.1 + '@metaplex-foundation/umi': 0.9.2 + '@metaplex-foundation/umi-eddsa-web3js': 0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.98.0) + '@metaplex-foundation/umi-program-repository': 0.9.2(@metaplex-foundation/umi@0.9.2) + '@metaplex-foundation/umi-web3js-adapters': 0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.98.0) + '@solana/web3.js': 1.98.0 + bn.js: 5.2.1 + dotenv: 16.4.7 + transitivePeerDependencies: + - '@gql.tada/svelte-support' + - '@gql.tada/vue-support' + - '@jest/globals' + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - bufferutil + - chai + - debug + - encoding + - fastestsmallesttextencoderdecoder + - supports-color + - typescript + - utf-8-validate + dev: true + /@layerzerolabs/oft-v2-solana-sdk@3.0.138(@types/node@18.18.14)(chai@4.5.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.3): resolution: {integrity: sha512-q2+OALy4F3cZE3Q2UGdmyiBLFROCfSo7X7rfbA8xPScdiIy6IP6p0nsDQeTGUbbMIbXzTOTrAaIPOiR+pfS4OA==} dependencies: @@ -12268,6 +13257,10 @@ packages: zod: 3.22.4 dev: true + /@layerzerolabs/protocol-starknet-v2@0.2.19: + resolution: {integrity: sha512-CXvSdRppVN6NbOak5BtHXz5rMfq3DENqZYYcaK0OqhyVTWTVLDizl+rM4/yyvIdAOeMVuc7vUXUTMIe2r4Uadw==} + dev: true + /@layerzerolabs/scan-client-v2@0.0.1(redaxios@0.5.1): resolution: {integrity: sha512-eugkDt4ajC5hqEHq23oTXMf28d5HrltapT7F5FIybluS8qAwJ5nc2Bbu9JRgUDdO8LQTQpi8AoVqnMbRumD4lA==} peerDependencies: @@ -12372,7 +13365,7 @@ packages: - typescript dev: true - /@layerzerolabs/ton@15.2.0-rc.3(@layerzerolabs/ton@15.2.0-rc.3)(@swc/core@1.4.0)(@ton/core@0.59.0)(@ton/crypto@3.3.0)(@types/node@18.18.14)(typescript@5.5.3): + /@layerzerolabs/ton@15.2.0-rc.3(@layerzerolabs/ton@15.2.0-rc.3)(@swc/core@1.4.0)(@ton/core@0.59.0)(@ton/crypto@3.3.0)(@types/node@18.18.14)(chai@4.5.0)(typescript@5.5.3): resolution: {integrity: sha512-Aq7htcWn31DxSYs8l0sJcQ76uAJRPy50lg6M2G+qNLSXpO01sPcUSb8oK/TmCKo+S+rDIFWUNKFjT0B/rll1YQ==} peerDependencies: '@ton/core': '>=0.59.0' @@ -12432,10 +13425,12 @@ packages: /@layerzerolabs/tron-utilities@3.0.120(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3): resolution: {integrity: sha512-HjqvDhLQtYc4fA0Wll7p+WNDtzG5oDkJn0QQaEQzByUkrO3482+eU3BJlNzfEUg80SHLR0Ni8DLsp6LklNpZiw==} dependencies: - '@layerzerolabs/lz-utilities': 3.0.120(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3) + '@layerzerolabs/lz-utilities': 3.0.138(@swc/core@1.4.0)(@types/node@18.18.14)(chai@4.5.0)(typescript@5.5.3) ethers: 5.7.2 tronweb: 5.3.3 transitivePeerDependencies: + - '@gql.tada/svelte-support' + - '@gql.tada/vue-support' - '@jest/globals' - '@swc/core' - '@swc/wasm' @@ -12452,10 +13447,12 @@ packages: /@layerzerolabs/tron-utilities@3.0.120(@types/node@18.18.14)(chai@4.5.0)(typescript@5.5.3): resolution: {integrity: sha512-HjqvDhLQtYc4fA0Wll7p+WNDtzG5oDkJn0QQaEQzByUkrO3482+eU3BJlNzfEUg80SHLR0Ni8DLsp6LklNpZiw==} dependencies: - '@layerzerolabs/lz-utilities': 3.0.120(@types/node@18.18.14)(chai@4.5.0)(typescript@5.5.3) + '@layerzerolabs/lz-utilities': 3.0.138(@types/node@18.18.14)(chai@4.5.0)(typescript@5.5.3) ethers: 5.7.2 tronweb: 5.3.3 transitivePeerDependencies: + - '@gql.tada/svelte-support' + - '@gql.tada/vue-support' - '@jest/globals' - '@swc/core' - '@swc/wasm' @@ -12491,10 +13488,32 @@ packages: - utf-8-validate dev: true + /@layerzerolabs/tron-utilities@3.0.138(@swc/core@1.4.0)(@types/node@18.18.14)(chai@4.5.0)(typescript@5.5.3): + resolution: {integrity: sha512-uvpA8wjnOS8a2HGshdAw0yAAx6AtN9UkadjbUkYVh+CazzL3JPjCcy6CDVBS7yxB7NFaCT7uLj7SpHv/CVEYyA==} + dependencies: + '@layerzerolabs/lz-utilities': 3.0.138(@swc/core@1.4.0)(@types/node@18.18.14)(chai@4.5.0)(typescript@5.5.3) + ethers: 5.7.2 + tronweb: 5.3.3 + transitivePeerDependencies: + - '@gql.tada/svelte-support' + - '@gql.tada/vue-support' + - '@jest/globals' + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - bufferutil + - chai + - debug + - encoding + - supports-color + - typescript + - utf-8-validate + dev: true + /@layerzerolabs/tron-utilities@3.0.138(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3): resolution: {integrity: sha512-uvpA8wjnOS8a2HGshdAw0yAAx6AtN9UkadjbUkYVh+CazzL3JPjCcy6CDVBS7yxB7NFaCT7uLj7SpHv/CVEYyA==} dependencies: - '@layerzerolabs/lz-utilities': 3.0.138(@swc/core@1.4.0)(@types/node@18.18.14)(typescript@5.5.3) + '@layerzerolabs/lz-utilities': 3.0.138(@swc/core@1.4.0)(@types/node@18.18.14)(chai@4.5.0)(typescript@5.5.3) ethers: 5.7.2 tronweb: 5.3.3 transitivePeerDependencies: @@ -12559,7 +13578,7 @@ packages: '@ledgerhq/errors': 6.19.1 '@ledgerhq/logs': 6.12.0 rxjs: 7.8.1 - semver: 7.6.3 + semver: 7.7.3 /@ledgerhq/errors@6.19.1: resolution: {integrity: sha512-75yK7Nnit/Gp7gdrJAz0ipp31CCgncRp+evWt6QawQEtQKYEDfGo10QywgrrBBixeRxwnMy1DP6g2oCWRf1bjw==} @@ -12670,7 +13689,7 @@ packages: fs-extra: 11.2.0 hardhat: 2.22.12(ts-node@10.9.2)(typescript@5.5.3) proper-lockfile: 4.1.2 - semver: 7.6.3 + semver: 7.7.3 sinon: 18.0.1 sinon-chai: 3.7.0(chai@4.5.0)(sinon@18.0.1) undici: 6.20.1 @@ -12685,7 +13704,7 @@ packages: '@nomicfoundation/hardhat-verify': ^2.0.8 hardhat: ^2.22.5 dependencies: - '@ethersproject/abi': 5.7.0 + '@ethersproject/abi': 5.8.0 '@ethersproject/address': 5.7.0 '@matterlabs/hardhat-zksync-solc': 1.2.5(hardhat@2.22.12) '@nomicfoundation/hardhat-verify': 2.0.11(hardhat@2.22.12) @@ -12737,7 +13756,7 @@ packages: '@metaplex-foundation/beet': 0.7.2 '@solana/web3.js': 1.98.0 bs58: 5.0.0 - debug: 4.3.7 + debug: 4.4.0(supports-color@8.1.1) transitivePeerDependencies: - bufferutil - encoding @@ -12760,7 +13779,7 @@ packages: ansicolors: 0.3.2 assert: 2.1.0 bn.js: 5.2.1 - debug: 4.3.7 + debug: 4.4.0(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -12929,33 +13948,31 @@ packages: multiformats: 9.9.0 murmurhash3js-revisited: 3.0.0 - /@mysten/bcs@1.2.0: - resolution: {integrity: sha512-LuKonrGdGW7dq/EM6U2L9/as7dFwnhZnsnINzB/vu08Xfrj0qzWwpLOiXagAa5yZOPLK7anRZydMonczFkUPzA==} - dependencies: - bs58: 6.0.0 - - /@mysten/bcs@1.8.0: - resolution: {integrity: sha512-bDoLN1nN+XPONsvpNyNyqYHndM3PKWS419GLeRnbLoWyNm4bnyD1X4luEpJLLDq400hBuXiCan4RWjofvyTUIQ==} + /@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 - /@mysten/sui@1.39.0(typescript@5.5.3): - resolution: {integrity: sha512-tjH4oVAODO9JWPNvIBhAvorrwh7UfX5Lwf1oBjawnpk4sAIyajD8JYJUWXdI8o1H1519/5KEKaMT3ABAwTamQg==} + /@mysten/sui@1.45.2(typescript@5.5.3): + resolution: {integrity: sha512-gftf7fNpFSiXyfXpbtP2afVEnhc7p2m/MEYc/SO5pov92dacGKOpQIF7etZsGDI1Wvhv+dpph+ulRNpnYSs7Bg==} engines: {node: '>=18'} dependencies: '@graphql-typed-document-node/core': 3.2.0(graphql@16.11.0) - '@mysten/bcs': 1.8.0 + '@mysten/bcs': 1.9.2 '@mysten/utils': 0.2.0 - '@noble/curves': 1.9.6 + '@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.5.3) graphql: 16.11.0 poseidon-lite: 0.2.1 - valibot: 0.36.0 + valibot: 1.2.0(typescript@5.5.3) transitivePeerDependencies: - '@gql.tada/svelte-support' - '@gql.tada/vue-support' @@ -12992,12 +14009,25 @@ packages: dependencies: '@noble/hashes': 1.3.3 + /@noble/curves@1.7.0: + resolution: {integrity: sha512-UTMhXK9SeDhFJVrHeUJ5uZlI6ajXg10O6Ddocf9S6GjbSBVZsJo88HzKwXznNfGpMTRDyJkqMjNDPYgf0qFWnw==} + engines: {node: ^14.21.3 || >=16} + dependencies: + '@noble/hashes': 1.6.0 + dev: true + /@noble/curves@1.8.1: resolution: {integrity: sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ==} engines: {node: ^14.21.3 || >=16} dependencies: '@noble/hashes': 1.7.1 + /@noble/curves@1.9.4: + resolution: {integrity: sha512-2bKONnuM53lINoDrSmK8qP8W271ms7pygDhZt4SiLOoLwBtoHqeCFi6RG42V8zd3mLHuJFhU/Bmaqo4nX0/kBw==} + engines: {node: ^14.21.3 || >=16} + dependencies: + '@noble/hashes': 1.8.0 + /@noble/curves@1.9.6: resolution: {integrity: sha512-GIKz/j99FRthB8icyJQA51E8Uk5hXmdyThjgQXRKiv9h0zeRlzSCLIzFw6K1LotZ3XuB7yzlf76qk7uBmTdFqA==} engines: {node: ^14.21.3 || >=16} @@ -13019,6 +14049,16 @@ packages: resolution: {integrity: sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==} engines: {node: '>= 16'} + /@noble/hashes@1.6.0: + resolution: {integrity: sha512-YUULf0Uk4/mAA89w+k3+yUYh6NrEvxZa5T6SY3wlMvE2chHkxFUUIDI8/XW1QSC357iA5pSnqt7XEhvFOqmDyQ==} + engines: {node: ^14.21.3 || >=16} + dev: true + + /@noble/hashes@1.6.1: + resolution: {integrity: sha512-pq5D8h10hHBjyqX+cfBm0i8JUXJ0UhczFc4r74zbuT9XgewFo2E3J1cOaGtdZynILNmQ685YWGzGE1Zv6io50w==} + engines: {node: ^14.21.3 || >=16} + dev: true + /@noble/hashes@1.7.1: resolution: {integrity: sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ==} engines: {node: ^14.21.3 || >=16} @@ -13147,7 +14187,7 @@ packages: peerDependencies: hardhat: ^2.0.4 dependencies: - '@ethersproject/abi': 5.7.0 + '@ethersproject/abi': 5.8.0 '@ethersproject/address': 5.7.0 cbor: 8.1.0 chalk: 2.4.2 @@ -13357,7 +14397,7 @@ packages: dependencies: '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.7.2)(hardhat@2.22.12) '@types/sinon-chai': 3.2.12 - ethereum-waffle: 4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typescript@5.5.3) + 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.7.2)(typescript@5.5.3) ethers: 5.7.2 hardhat: 2.22.12(ts-node@10.9.2)(typescript@5.5.3) dev: true @@ -13450,7 +14490,7 @@ packages: resolution: {integrity: sha512-POx3AsnKwKSV/ZLOU/gheksj0Lq7Is1q2F3pKmcFjGZiibf+4kjGxr4eSMrT+2qgKYZQH1ZLQZ+SkbguD8fTvA==} deprecated: '@openzeppelin/platform-deploy-client is deprecated. Please use @openzeppelin/defender-sdk-deploy-client' dependencies: - '@ethersproject/abi': 5.7.0 + '@ethersproject/abi': 5.8.0 '@openzeppelin/defender-base-client': 1.54.6(debug@4.3.5) axios: 0.21.4(debug@4.3.5) lodash: 4.17.21 @@ -13523,6 +14563,20 @@ packages: 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 + + /@protobuf-ts/runtime-rpc@2.11.1: + resolution: {integrity: sha512-4CqqUmNA+/uMz00+d3CYKgElXO9VrEbucjnBFEjqI4GuDrEQ32MaI3q+9qPBvIGOlL4PmHXrzM32vBPWRhQKWQ==} + dependencies: + '@protobuf-ts/runtime': 2.11.1 + + /@protobuf-ts/runtime@2.11.1: + resolution: {integrity: sha512-KuDaT1IfHkugM2pyz+FwiY80ejWrkH1pAtOBOZFuR6SXEFTsnb/jiQWQ1rCIrcKx2BtyxnxW6BWwsVSA/Ie+WQ==} + /@protobufjs/aspromise@1.1.2: resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} @@ -13946,7 +15000,7 @@ packages: /@safe-global/safe-deployments@1.33.0: resolution: {integrity: sha512-G9qGMsha6idMnDuk98dE//inQL09w97hcQ5ZTdSWIHCzJ9mFdN0K4DH2afjZOwdt+Y4g8gZmY3z+kR38MPEToQ==} dependencies: - semver: 7.6.2 + semver: 7.7.3 /@safe-global/safe-deployments@1.37.48: resolution: {integrity: sha512-SeRkHlKDwtRarhpU2Ow7dFebJRppIGoYCMMeiTcW/MPovswvQGkPlki2/VoYKKKkRupTRXJ2VyRygdeKYz6VeQ==} @@ -13969,12 +15023,9 @@ packages: /@scure/base@1.1.5: resolution: {integrity: sha512-Brj9FiG2W1MRQSTB212YVPRrcbjkv48FoZi/u4l/zds/ieRrqsh7aUf6CLwkAq61oKXr/ZlTzlY66gLIj3TFTQ==} - /@scure/base@1.2.1: - resolution: {integrity: sha512-DGmGtC8Tt63J5GfHgfl5CuAXh96VF/LD8K9Hr/Gv0J2lAoRGlPOMpqMpMbCTOoOJMZCk2Xt+DskdDyn6dEFdzQ==} - dev: true - /@scure/base@1.2.4: resolution: {integrity: sha512-5Yy9czTO47mqz+/J8GM6GIId4umdCk1wc1q8rKERQulIoc8VP9pzDcghv10Tl2E7R96ZUx/PhND3ESYUQX8NuQ==} + dev: true /@scure/base@1.2.6: resolution: {integrity: sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==} @@ -14039,6 +15090,13 @@ packages: '@noble/hashes': 1.8.0 '@scure/base': 1.2.6 + /@scure/starknet@1.1.0: + resolution: {integrity: sha512-83g3M6Ix2qRsPN4wqLDqiRZ2GBNbjVWfboJE/9UjfG+MHr6oDSu/CWgy8hsBSJejr09DkkL+l0Ze4KVrlCIdtQ==} + dependencies: + '@noble/curves': 1.7.0 + '@noble/hashes': 1.6.1 + dev: true + /@sentry/core@5.30.0: resolution: {integrity: sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==} engines: {node: '>=6'} @@ -14617,8 +15675,8 @@ packages: resolution: {integrity: sha512-nz3Q5OeyGFpFCR+erX2f6JPt3sKhzhYcSycBCSPkWjzSVDh/Rr1FqTVMRe58FKO16/ivTUcuJjeS5MyBvpkbzA==} dependencies: '@babel/runtime': 7.25.6 - '@noble/curves': 1.8.1 - '@noble/hashes': 1.7.1 + '@noble/curves': 1.9.6 + '@noble/hashes': 1.8.0 '@solana/buffer-layout': 4.0.1 agentkeepalive: 4.5.0 bigint-buffer: 1.1.5 @@ -14687,6 +15745,14 @@ packages: - utf-8-validate dev: true + /@starknet-io/types-js@0.8.4: + resolution: {integrity: sha512-0RZ3TZHcLsUTQaq1JhDSCM8chnzO4/XNsSCozwDET64JK5bjFDIf2ZUkta+tl5Nlbf4usoU7uZiDI/Q57kt2SQ==} + dev: true + + /@starknet-io/types-js@0.9.2: + resolution: {integrity: sha512-vWOc0FVSn+RmabozIEWcEny1I73nDGTvOrLYJsR1x7LGA3AZmqt4i/aW69o/3i2NN5CVP8Ok6G1ayRQJKye3Wg==} + dev: true + /@swc/core-darwin-arm64@1.4.0: resolution: {integrity: sha512-UTJ/Vz+s7Pagef6HmufWt6Rs0aUu+EJF4Pzuwvr7JQQ5b1DZeAAUeUtkUTFx/PvCbM8Xfw4XdKBUZfrIKCfW8A==} engines: {node: '>=10'} @@ -14885,7 +15951,7 @@ packages: '@ton/core': 0.59.0(@ton/crypto@3.3.0) '@ton/crypto': 3.3.0 '@ton/tolk-js': 0.6.0 - '@ton/ton': /@layerzerolabs/ton@15.2.0-rc.3(@layerzerolabs/ton@15.2.0-rc.3)(@swc/core@1.4.0)(@ton/core@0.59.0)(@ton/crypto@3.3.0)(@types/node@18.18.14)(typescript@5.5.3) + '@ton/ton': /@layerzerolabs/ton@15.2.0-rc.3(@layerzerolabs/ton@15.2.0-rc.3)(@swc/core@1.4.0)(@ton/core@0.59.0)(@ton/crypto@3.3.0)(@types/node@18.18.14)(chai@4.5.0)(typescript@5.5.3) '@tonconnect/sdk': 2.2.0 arg: 5.0.2 axios: 1.8.4 @@ -15112,7 +16178,7 @@ packages: dev: true optional: true - /@typechain/ethers-v5@10.2.1(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typechain@8.3.2)(typescript@5.5.3): + /@typechain/ethers-v5@10.2.1(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0)(ethers@5.7.2)(typechain@8.3.2)(typescript@5.5.3): resolution: {integrity: sha512-n3tQmCZjRE6IU4h6lqUGiQ1j866n5MTCBJreNEHHVWXa2u9GJTaeYyU1/k+1qLutkyw+sS6VAN+AbeiTqsxd/A==} peerDependencies: '@ethersproject/abi': ^5.0.0 @@ -15121,8 +16187,8 @@ packages: typechain: ^8.1.1 typescript: '>=4.3.0' dependencies: - '@ethersproject/abi': 5.7.0 - '@ethersproject/providers': 5.7.2 + '@ethersproject/abi': 5.8.0 + '@ethersproject/providers': 5.8.0 ethers: 5.7.2 lodash: 4.17.21 ts-essentials: 7.0.3(typescript@5.5.3) @@ -15142,7 +16208,7 @@ packages: resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} dependencies: '@babel/parser': 7.26.8 - '@babel/types': 7.26.8 + '@babel/types': 7.28.5 '@types/babel__generator': 7.6.8 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.20.5 @@ -15150,18 +16216,18 @@ packages: /@types/babel__generator@7.6.8: resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} dependencies: - '@babel/types': 7.26.8 + '@babel/types': 7.28.5 /@types/babel__template@7.4.4: resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} dependencies: - '@babel/parser': 7.26.8 - '@babel/types': 7.26.8 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 /@types/babel__traverse@7.20.5: resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==} dependencies: - '@babel/types': 7.26.8 + '@babel/types': 7.28.5 /@types/bn.js@4.11.6: resolution: {integrity: sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==} @@ -15952,6 +17018,16 @@ packages: web3-utils: 1.10.4 dev: true + /abi-wan-kanabi@2.2.4: + resolution: {integrity: sha512-0aA81FScmJCPX+8UvkXLki3X1+yPQuWxEkqXBVKltgPAK79J+NB+Lp5DouMXa7L6f+zcRlIA/6XO7BN/q9fnvg==} + hasBin: true + dependencies: + ansicolors: 0.3.2 + cardinal: 2.1.1 + fs-extra: 10.1.0 + yargs: 17.7.2 + dev: true + /abitype@1.0.8(typescript@5.5.3)(zod@3.22.4): resolution: {integrity: sha512-ZeiI6h3GnW06uYDLx0etQtX/p8E24UaHHBj57RSjK7YBFe7iuVn07EDpOeP451D06sF27VOz9JJPlIKJmXgkEg==} peerDependencies: @@ -16483,6 +17559,24 @@ packages: transitivePeerDependencies: - supports-color + /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-jest@30.2.0(@babel/core@7.28.5): resolution: {integrity: sha512-0YiBEOxWqKkSQWL9nNGGEgndoeL0ZpWrbLMNL5u/Kaxrli3Eaxlt3ZtIDktEvXt4L/R9r3ODr2zKwGM/2BjxVw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -16530,8 +17624,8 @@ packages: resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/template': 7.23.9 - '@babel/types': 7.26.8 + '@babel/template': 7.27.2 + '@babel/types': 7.28.5 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.20.5 @@ -16561,6 +17655,28 @@ packages: '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.9) '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.9) + /babel-preset-current-node-syntax@1.2.0(@babel/core@7.23.9): + resolution: {integrity: sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==} + peerDependencies: + '@babel/core': ^7.0.0 || ^8.0.0-0 + dependencies: + '@babel/core': 7.23.9 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.9) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.23.9) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.9) + '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.23.9) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.23.9) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.9) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.9) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.9) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.9) + /babel-preset-current-node-syntax@1.2.0(@babel/core@7.28.5): resolution: {integrity: sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==} peerDependencies: @@ -16592,7 +17708,18 @@ packages: dependencies: '@babel/core': 7.23.9 babel-plugin-jest-hoist: 29.6.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.9) + babel-preset-current-node-syntax: 1.2.0(@babel/core@7.23.9) + + /babel-preset-jest@29.6.3(@babel/core@7.28.5): + resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.28.5 + babel-plugin-jest-hoist: 29.6.3 + babel-preset-current-node-syntax: 1.2.0(@babel/core@7.28.5) + dev: true /babel-preset-jest@30.2.0(@babel/core@7.28.5): resolution: {integrity: sha512-US4Z3NOieAQumwFnYdUWKvUKh8+YSnS/gB3t6YBiz0bskpu7Pine8pPCheNxlPEW4wnUkma2a94YuW2q3guvCQ==} @@ -16672,8 +17799,8 @@ packages: resolution: {integrity: sha512-5hVFGrdCnF8GB1Lj2eEo4PRE7+jp+3xBLnfNjydivOkMvKmUKeJ9GG8uOy8prmWl3Oh154uzgfudR1FRkNBudA==} engines: {node: '>=18.0.0'} dependencies: - '@noble/hashes': 1.7.1 - '@scure/base': 1.2.4 + '@noble/hashes': 1.8.0 + '@scure/base': 1.2.6 uint8array-tools: 0.0.8 valibot: 0.37.0(typescript@5.5.3) wif: 5.0.0 @@ -16692,7 +17819,7 @@ packages: /bip39@3.1.0: resolution: {integrity: sha512-c9kiwdk45Do5GL0vJMe7tS95VjCii65mYAH7DfWl3uW8AVzXKQVUm64i3hzVybBDMp9r7j9iNxR85+ul8MdN/A==} dependencies: - '@noble/hashes': 1.7.1 + '@noble/hashes': 1.8.0 /bl@1.2.3: resolution: {integrity: sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==} @@ -16896,7 +18023,7 @@ packages: /bs58check@4.0.0: resolution: {integrity: sha512-FsGDOnFg9aVI9erdriULkd/JjEWONV/lQE5aYziB5PoBsXRind56lh8doIZIc9X4HoxT5x4bLjMWN1/NB8Zp5g==} dependencies: - '@noble/hashes': 1.7.1 + '@noble/hashes': 1.8.0 bs58: 6.0.0 /bser@2.1.1: @@ -17146,6 +18273,14 @@ packages: tslib: 2.6.3 upper-case-first: 2.0.2 + /cardinal@2.1.1: + resolution: {integrity: sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==} + hasBin: true + dependencies: + ansicolors: 0.3.2 + redeyed: 2.1.1 + dev: true + /caseless@0.12.0: resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} @@ -17720,6 +18855,25 @@ packages: safe-buffer: 5.2.1 sha.js: 2.4.11 + /create-jest@29.7.0(@types/node@18.18.14): + 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) + jest-util: 29.7.0 + prompts: 2.4.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + 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} @@ -19080,7 +20234,7 @@ packages: '@humanwhocodes/config-array': 0.13.0 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 - '@ungap/structured-clone': 1.2.0 + '@ungap/structured-clone': 1.3.0 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.5 @@ -19224,7 +20378,7 @@ packages: resolution: {integrity: sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==} dependencies: bn.js: 4.12.0 - elliptic: 6.5.4 + elliptic: 6.6.1 xhr-request-promise: 0.1.3 /ethereum-bloom-filters@1.0.10: @@ -19267,7 +20421,7 @@ packages: '@scure/bip32': 1.3.3 '@scure/bip39': 1.2.2 - /ethereum-waffle@4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typescript@5.5.3): + /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.7.2)(typescript@5.5.3): resolution: {integrity: sha512-iw9z1otq7qNkGDNcMoeNeLIATF9yKl1M8AIeu42ElfNBplq0e+5PeasQmm8ybY/elkZ1XyRO0JBQxQdVRb8bqQ==} engines: {node: '>=10.0'} hasBin: true @@ -19275,7 +20429,7 @@ packages: ethers: ^5.7.2 dependencies: '@ethereum-waffle/chai': 4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(ethers@5.7.2) - '@ethereum-waffle/compiler': 4.0.3(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(solc@0.8.15)(typechain@8.3.2)(typescript@5.5.3) + '@ethereum-waffle/compiler': 4.0.3(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0)(ethers@5.7.2)(solc@0.8.15)(typechain@8.3.2)(typescript@5.5.3) '@ethereum-waffle/mock-contract': 4.0.4(ethers@5.7.2) '@ethereum-waffle/provider': 4.0.5(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(ethers@5.7.2) ethers: 5.7.2 @@ -19324,7 +20478,7 @@ packages: resolution: {integrity: sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==} engines: {node: '>=10.0.0'} dependencies: - '@types/bn.js': 5.1.5 + '@types/bn.js': 5.1.6 bn.js: 5.2.1 create-hash: 1.2.0 ethereum-cryptography: 0.1.3 @@ -20492,14 +21646,14 @@ packages: /hardhat-deploy@0.12.2: resolution: {integrity: sha512-Xp/4Lb5lC/j3kvitaWW5IZN5Meqv5D3kTIifc3ZwBoQtFLN26/fDfRV6MWAAcRO9gH64hZVokvtcDdl/fd7w3A==} dependencies: - '@ethersproject/abi': 5.7.0 - '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/abi': 5.8.0 + '@ethersproject/abstract-signer': 5.8.0 '@ethersproject/address': 5.7.0 '@ethersproject/bignumber': 5.7.0 '@ethersproject/bytes': 5.7.0 '@ethersproject/constants': 5.7.0 '@ethersproject/contracts': 5.7.0 - '@ethersproject/providers': 5.7.2 + '@ethersproject/providers': 5.8.0 '@ethersproject/solidity': 5.7.0 '@ethersproject/transactions': 5.7.0 '@ethersproject/wallet': 5.7.0 @@ -20812,7 +21966,7 @@ packages: engines: {node: '>= 6'} dependencies: agent-base: 6.0.2 - debug: 4.3.7 + debug: 4.4.0(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -21480,7 +22634,7 @@ packages: peerDependencies: ws: '*' dependencies: - ws: 8.18.3 + ws: 8.18.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) dev: false /isstream@0.1.2: @@ -21510,7 +22664,7 @@ packages: '@babel/parser': 7.26.8 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 - semver: 7.6.3 + semver: 7.7.3 transitivePeerDependencies: - supports-color @@ -21727,6 +22881,34 @@ packages: - supports-color dev: true + /jest-cli@29.7.0(@types/node@18.18.14): + 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 + '@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) + exit: 0.1.2 + import-local: 3.2.0 + jest-config: 29.7.0(@types/node@18.18.14) + 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-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} @@ -21770,7 +22952,7 @@ packages: chalk: 4.1.2 create-jest: 29.7.0(@types/node@22.15.3)(ts-node@10.9.2) exit: 0.1.2 - import-local: 3.1.0 + import-local: 3.2.0 jest-config: 29.7.0(@types/node@22.15.3)(ts-node@10.9.2) jest-util: 29.7.0 jest-validate: 29.7.0 @@ -21810,6 +22992,46 @@ packages: - ts-node dev: true + /jest-config@29.7.0(@types/node@18.18.14): + 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 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + 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} @@ -21862,11 +23084,11 @@ packages: ts-node: optional: true dependencies: - '@babel/core': 7.23.9 + '@babel/core': 7.28.5 '@jest/test-sequencer': 29.7.0 '@jest/types': 29.6.3 '@types/node': 22.15.3 - babel-jest: 29.7.0(@babel/core@7.23.9) + babel-jest: 29.7.0(@babel/core@7.28.5) chalk: 4.1.2 ci-info: 3.9.0 deepmerge: 4.3.1 @@ -22493,6 +23715,27 @@ packages: supports-color: 8.1.1 dev: true + /jest@29.7.0(@types/node@18.18.14): + resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 29.7.0 + '@jest/types': 29.6.3 + import-local: 3.2.0 + jest-cli: 29.7.0(@types/node@18.18.14) + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + dev: true + /jest@29.7.0(@types/node@18.18.14)(ts-node@10.9.2): resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -22525,7 +23768,7 @@ packages: dependencies: '@jest/core': 29.7.0(ts-node@10.9.2) '@jest/types': 29.6.3 - import-local: 3.1.0 + import-local: 3.2.0 jest-cli: 29.7.0(@types/node@22.15.3)(ts-node@10.9.2) transitivePeerDependencies: - '@types/node' @@ -23043,6 +24286,10 @@ packages: dependencies: js-tokens: 4.0.0 + /lossless-json@4.3.0: + resolution: {integrity: sha512-ToxOC+SsduRmdSuoLZLYAr5zy1Qu7l5XhmPWM3zefCZ5IcrzW/h108qbJUKfOlDlhvhjUK84+8PSVX0kxnit0g==} + dev: true + /loupe@2.3.7: resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} dependencies: @@ -23107,7 +24354,7 @@ packages: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} engines: {node: '>=10'} dependencies: - semver: 7.6.3 + semver: 7.7.3 /make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} @@ -24205,7 +25452,6 @@ packages: /picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - dev: true /picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} @@ -24799,6 +26045,12 @@ packages: resolution: {integrity: sha512-FSD2AmfdbkYwl7KDExYQlVvIrFz6Yd83pGfaGjBzM9F6rpq8g652Q4Yq5QD4c+nf4g2AgeElv1y+8ajUPiOYMg==} dev: false + /redeyed@2.1.1: + resolution: {integrity: sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ==} + dependencies: + esprima: 4.0.1 + dev: true + /reduce-flatten@2.0.0: resolution: {integrity: sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==} engines: {node: '>=6'} @@ -25126,7 +26378,7 @@ packages: buffer: 6.0.3 eventemitter3: 5.0.1 uuid: 8.3.2 - ws: 8.18.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + ws: 8.18.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) optionalDependencies: bufferutil: 4.0.8 utf-8-validate: 5.0.10 @@ -25253,6 +26505,7 @@ packages: resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==} engines: {node: '>=10'} hasBin: true + dev: true /semver@7.6.3: resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} @@ -25605,7 +26858,7 @@ packages: latest-version: 7.0.0 lodash: 4.17.21 pluralize: 8.0.0 - semver: 7.6.3 + semver: 7.7.3 strip-ansi: 6.0.1 table: 6.8.2 text-table: 0.2.0 @@ -25764,6 +27017,22 @@ packages: dependencies: type-fest: 0.7.1 + /starknet@8.9.2: + resolution: {integrity: sha512-+dp+o2w67fV6JyVOVkYeM1Ec71aORHc/JrF4VHLlfeGee0nLilooCQLE2u6hUcSGQG2x2/fvzkxYpIN+k1JBvA==} + engines: {node: '>=22'} + dependencies: + '@noble/curves': 1.7.0 + '@noble/hashes': 1.6.1 + '@scure/base': 1.2.6 + '@scure/starknet': 1.1.0 + '@starknet-io/starknet-types-08': /@starknet-io/types-js@0.8.4 + '@starknet-io/starknet-types-09': /@starknet-io/types-js@0.9.2 + abi-wan-kanabi: 2.2.4 + lossless-json: 4.3.0 + pako: 2.1.0 + ts-mixer: 6.0.4 + dev: true + /statuses@2.0.1: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} @@ -26505,6 +27774,10 @@ packages: yargs-parser: 21.1.1 dev: true + /ts-mixer@6.0.4: + resolution: {integrity: sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA==} + dev: true + /ts-mocha@11.1.0(mocha@11.7.1)(ts-node@10.9.2): resolution: {integrity: sha512-yT7FfzNRCu8ZKkYvAOiH01xNma/vLq6Vit7yINKYFNVP8e5UyrYXSOMIipERTpzVKJQ4Qcos5bQo1tNERNZevQ==} engines: {node: '>= 6.X.X'} @@ -27215,9 +28488,6 @@ packages: '@types/istanbul-lib-coverage': 2.0.6 convert-source-map: 2.0.0 - /valibot@0.36.0: - resolution: {integrity: sha512-CjF1XN4sUce8sBK9TixrDqFM7RwNkuXdJu174/AwmQUB62QbCQADg5lLe8ldBalFgtj1uKj+pKwDJiNo4Mn+eQ==} - /valibot@0.37.0(typescript@5.5.3): resolution: {integrity: sha512-FQz52I8RXgFgOHym3XHYSREbNtkgSjF9prvMFH1nBsRyfL6SfCzoT1GuSDTlbsuPubM7/6Kbw0ZMQb8A+V+VsQ==} peerDependencies: @@ -27228,6 +28498,16 @@ packages: dependencies: typescript: 5.5.3 + /valibot@1.2.0(typescript@5.5.3): + resolution: {integrity: sha512-mm1rxUsmOxzrwnX5arGS+U4T25RdvpPjPN4yR0u9pUBov9+zGVtO84tif1eY4r6zWxVxu3KzIyknJy3rxfRZZg==} + peerDependencies: + typescript: '>=5' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + typescript: 5.5.3 + /validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} dependencies: @@ -27270,7 +28550,7 @@ packages: isows: 1.0.7(ws@8.18.3) ox: 0.9.1(typescript@5.5.3)(zod@3.22.4) typescript: 5.5.3 - ws: 8.18.3 + ws: 8.18.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - utf-8-validate @@ -27362,7 +28642,7 @@ packages: resolution: {integrity: sha512-cZ0q65eJIkd/jyOlQPDjr8X4fU6CRL1eWgdLwbWEpo++MPU/2P4PFk5ZLAdye9T5Sdp+MomePPJ/gHjLMj2VfQ==} engines: {node: '>=8.0.0'} dependencies: - '@ethersproject/abi': 5.7.0 + '@ethersproject/abi': 5.8.0 web3-utils: 1.10.4 /web3-eth-accounts@1.10.4: @@ -27387,7 +28667,7 @@ packages: resolution: {integrity: sha512-Q8PfolOJ4eV9TvnTj1TGdZ4RarpSLmHnUnzVxZ/6/NiTfe4maJz99R0ISgwZkntLhLRtw0C7LRJuklzGYCNN3A==} engines: {node: '>=8.0.0'} dependencies: - '@types/bn.js': 5.1.5 + '@types/bn.js': 5.1.6 web3-core: 1.10.4 web3-core-helpers: 1.10.4 web3-core-method: 1.10.4 @@ -27834,7 +29114,7 @@ packages: optional: true dev: true - /ws@8.18.0(bufferutil@4.0.8)(utf-8-validate@5.0.10): + /ws@8.18.0: resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} engines: {node: '>=10.0.0'} peerDependencies: @@ -27845,11 +29125,8 @@ packages: optional: true utf-8-validate: optional: true - dependencies: - bufferutil: 4.0.8 - utf-8-validate: 5.0.10 - /ws@8.18.3: + /ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@5.0.10): resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} engines: {node: '>=10.0.0'} peerDependencies: @@ -27860,7 +29137,9 @@ packages: optional: true utf-8-validate: optional: true - dev: false + dependencies: + bufferutil: 4.0.8 + utf-8-validate: 5.0.10 /xhr-request-promise@0.1.3: resolution: {integrity: sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg==}