diff --git a/.changeset/oft-solana-test-updates.md b/.changeset/oft-solana-test-updates.md new file mode 100644 index 0000000000..89ce348acb --- /dev/null +++ b/.changeset/oft-solana-test-updates.md @@ -0,0 +1,5 @@ +--- +"@layerzerolabs/oft-solana-example": patch +--- + +Add OFT Solana test coverage for peer/config validation and fee withdrawal guards, plus a got shim for test runs. diff --git a/examples/oft-solana/.gitignore b/examples/oft-solana/.gitignore index 0f7da464c7..e8b91c15af 100644 --- a/examples/oft-solana/.gitignore +++ b/examples/oft-solana/.gitignore @@ -4,6 +4,7 @@ node_modules coverage coverage.json target +test-ledger typechain typechain-types diff --git a/examples/oft-solana/Anchor.toml b/examples/oft-solana/Anchor.toml index dfd19e5a98..93c29c93dc 100644 --- a/examples/oft-solana/Anchor.toml +++ b/examples/oft-solana/Anchor.toml @@ -17,4 +17,4 @@ cluster = "Localnet" wallet = "./junk-id.json" [scripts] -test = "npx jest test/anchor" +test = "pnpm test:anchor" diff --git a/examples/oft-solana/README.md b/examples/oft-solana/README.md index ee250f32c1..a1f49faa31 100644 --- a/examples/oft-solana/README.md +++ b/examples/oft-solana/README.md @@ -47,6 +47,7 @@ - Rust `1.84.1` - Anchor `0.31.1` - Solana CLI `2.2.20` +- Surfpool CLI (required for `pnpm test:anchor`) - Docker `28.3.0` - Node.js `>=20.19.5` - `pnpm` (recommended) - or another package manager of your choice (npm, yarn) @@ -360,6 +361,24 @@ Before deploying, ensure the following: pnpm test ``` +To run the Surfpool-backed Solana tests: + +```bash +pnpm test:anchor +``` + +`pnpm test:anchor` starts a Surfnet forked from mainnet-beta by default. If mainnet-beta state blocks initialization (pre-existing PDAs), set a devnet upstream instead: + +```bash +SURFPOOL_RPC_URL=https://api.devnet.solana.com pnpm test:anchor +``` + +To avoid upstream state entirely, deploy local LayerZero program binaries into Surfnet: + +```bash +SURFPOOL_USE_LOCAL_PROGRAMS=1 pnpm test:anchor +``` + ### Adding other chains To add additional chains to your OFT deployment: diff --git a/examples/oft-solana/package.json b/examples/oft-solana/package.json index 0fcdd9ac64..4a519d57b5 100644 --- a/examples/oft-solana/package.json +++ b/examples/oft-solana/package.json @@ -13,7 +13,7 @@ "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:anchor": "OFT_ID=$(node scripts/resolve-oft-id.js) anchor build --no-idl && $npm_execpath exec ts-mocha -b -p ./tsconfig.json -t 10000000 test/anchor/index.test.ts", "test:forge": "forge test", "test:hardhat": "hardhat test", "test:scripts": "jest --config jest.config.ts --runInBand --testMatch \"**/*.script.test.ts\"" @@ -69,6 +69,7 @@ "@metaplex-foundation/umi-eddsa-web3js": "^0.9.2", "@metaplex-foundation/umi-public-keys": "^0.8.9", "@metaplex-foundation/umi-web3js-adapters": "^0.9.2", + "@noble/secp256k1": "^1.7.1", "@nomicfoundation/hardhat-ethers": "^3.0.5", "@nomiclabs/hardhat-ethers": "^2.2.3", "@nomiclabs/hardhat-waffle": "^2.0.6", @@ -86,6 +87,7 @@ "@types/jest": "^29.5.12", "@types/mocha": "^10.0.6", "@types/node": "~18.18.14", + "axios": "^1.6.2", "bs58": "^6.0.0", "chai": "^4.4.1", "concurrently": "~9.1.0", @@ -105,6 +107,7 @@ "prettier": "^3.2.5", "solhint": "^4.1.1", "solidity-bytes-utils": "^0.8.2", + "ts-mocha": "^10.0.0", "ts-node": "^10.9.2", "typescript": "^5.4.4" }, diff --git a/examples/oft-solana/pnpm-lock.yaml b/examples/oft-solana/pnpm-lock.yaml index 4cc12608d5..427acdf456 100644 --- a/examples/oft-solana/pnpm-lock.yaml +++ b/examples/oft-solana/pnpm-lock.yaml @@ -35,91 +35,91 @@ devDependencies: version: 5.8.0 '@layerzerolabs/devtools': specifier: ~2.0.3 - version: 2.0.3(@ethersproject/bytes@5.8.0)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(zod@3.25.76) + version: 2.0.5(@ethersproject/bytes@5.8.0)(@layerzerolabs/io-devtools@0.3.2)(@layerzerolabs/lz-definitions@3.0.159)(zod@3.25.76) '@layerzerolabs/devtools-evm': specifier: ~3.0.0 - version: 3.0.0(@ethersproject/abi@5.8.0)(@ethersproject/abstract-provider@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@ethersproject/address@5.7.0)(@ethersproject/bignumber@5.8.0)(@ethersproject/constants@5.8.0)(@ethersproject/contracts@5.8.0)(@ethersproject/providers@5.8.0)(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(fp-ts@2.16.11)(zod@3.25.76) + version: 3.0.2(@ethersproject/abi@5.8.0)(@ethersproject/abstract-provider@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@ethersproject/address@5.7.0)(@ethersproject/bignumber@5.8.0)(@ethersproject/constants@5.8.0)(@ethersproject/contracts@5.8.0)(@ethersproject/providers@5.8.0)(@layerzerolabs/devtools@2.0.5)(@layerzerolabs/io-devtools@0.3.2)(@layerzerolabs/lz-definitions@3.0.159)(fp-ts@2.16.11)(typescript@5.9.3)(zod@3.25.76) '@layerzerolabs/devtools-evm-hardhat': specifier: ^4.0.0 - version: 4.0.1(@ethersproject/abi@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@ethersproject/contracts@5.8.0)(@ethersproject/providers@5.8.0)(@layerzerolabs/devtools-evm@3.0.0)(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(@nomiclabs/hardhat-ethers@2.2.3)(ethers@5.8.0)(fp-ts@2.16.11)(hardhat-deploy@0.12.4)(hardhat@2.26.4) + version: 4.0.4(@ethersproject/abi@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@ethersproject/contracts@5.8.0)(@ethersproject/providers@5.8.0)(@layerzerolabs/devtools-evm@3.0.2)(@layerzerolabs/devtools@2.0.5)(@layerzerolabs/io-devtools@0.3.2)(@layerzerolabs/lz-definitions@3.0.159)(@nomiclabs/hardhat-ethers@2.2.3)(ethers@5.8.0)(fp-ts@2.16.11)(hardhat-deploy@0.12.4)(hardhat@2.28.5) '@layerzerolabs/devtools-solana': specifier: ~3.0.6 - version: 3.0.6(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(@solana/web3.js@1.98.4)(bn.js@5.2.2)(fastestsmallesttextencoderdecoder@1.0.22)(fp-ts@2.16.11)(typescript@5.9.3)(zod@3.25.76) + version: 3.0.7(@layerzerolabs/devtools@2.0.5)(@layerzerolabs/io-devtools@0.3.2)(@layerzerolabs/lz-definitions@3.0.159)(@solana/web3.js@1.98.4)(bn.js@5.2.2)(fastestsmallesttextencoderdecoder@1.0.22)(fp-ts@2.16.11)(typescript@5.9.3)(zod@3.25.76) '@layerzerolabs/eslint-config-next': specifier: ~2.3.39 version: 2.3.44(typescript@5.9.3) '@layerzerolabs/io-devtools': specifier: ~0.3.0 - version: 0.3.1(ink-gradient@2.0.0)(ink-table@3.1.0)(ink@3.2.0)(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76) + version: 0.3.2(ink-gradient@2.0.0)(ink-table@3.1.0)(ink@3.2.0)(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76) '@layerzerolabs/lz-definitions': specifier: ^3.0.86 - version: 3.0.142 + version: 3.0.159 '@layerzerolabs/lz-evm-messagelib-v2': specifier: ^3.0.86 - version: 3.0.142(@axelar-network/axelar-gmp-sdk-solidity@5.10.0)(@chainlink/contracts-ccip@0.7.6)(@eth-optimism/contracts@0.6.0)(@layerzerolabs/lz-evm-protocol-v2@3.0.142)(@layerzerolabs/lz-evm-v1-0.7@3.0.142)(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4)(solidity-bytes-utils@0.8.4) + version: 3.0.159(@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.159)(@layerzerolabs/lz-evm-v1-0.7@3.0.159)(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4)(solidity-bytes-utils@0.8.4) '@layerzerolabs/lz-evm-protocol-v2': specifier: ^3.0.86 - version: 3.0.142(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4)(solidity-bytes-utils@0.8.4) + version: 3.0.159(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4)(solidity-bytes-utils@0.8.4) '@layerzerolabs/lz-evm-v1-0.7': specifier: ^3.0.86 - version: 3.0.142(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4) + version: 3.0.159(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4) '@layerzerolabs/lz-solana-sdk-v2': specifier: ^3.0.136 - version: 3.0.142(fastestsmallesttextencoderdecoder@1.0.22)(got@11.8.6)(typescript@5.9.3) + version: 3.0.159(fastestsmallesttextencoderdecoder@1.0.22)(got@11.8.6)(typescript@5.9.3) '@layerzerolabs/lz-v2-utilities': specifier: ^3.0.86 - version: 3.0.142 + version: 3.0.159 '@layerzerolabs/metadata-tools': specifier: ^3.0.0 - version: 3.0.2(@layerzerolabs/devtools-evm-hardhat@4.0.1)(@layerzerolabs/ua-devtools@5.0.1) + version: 3.0.3(@layerzerolabs/devtools-evm-hardhat@4.0.4)(@layerzerolabs/ua-devtools@5.0.2) '@layerzerolabs/oapp-evm': specifier: ^0.4.0 - version: 0.4.0(@layerzerolabs/lz-evm-messagelib-v2@3.0.142)(@layerzerolabs/lz-evm-protocol-v2@3.0.142)(@layerzerolabs/lz-evm-v1-0.7@3.0.142)(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0) + version: 0.4.1(@layerzerolabs/lz-evm-messagelib-v2@3.0.159)(@layerzerolabs/lz-evm-protocol-v2@3.0.159)(@layerzerolabs/lz-evm-v1-0.7@3.0.159)(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0) '@layerzerolabs/oft-evm': specifier: ^4.0.0 - version: 4.0.0(@layerzerolabs/lz-evm-messagelib-v2@3.0.142)(@layerzerolabs/lz-evm-protocol-v2@3.0.142)(@layerzerolabs/lz-evm-v1-0.7@3.0.142)(@layerzerolabs/oapp-evm@0.4.0)(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0) + version: 4.0.1(@layerzerolabs/lz-evm-messagelib-v2@3.0.159)(@layerzerolabs/lz-evm-protocol-v2@3.0.159)(@layerzerolabs/lz-evm-v1-0.7@3.0.159)(@layerzerolabs/oapp-evm@0.4.1)(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0) '@layerzerolabs/oft-v2-solana-sdk': specifier: ^3.0.136 - version: 3.0.142(fastestsmallesttextencoderdecoder@1.0.22)(got@11.8.6)(typescript@5.9.3) + version: 3.0.159(fastestsmallesttextencoderdecoder@1.0.22)(got@11.8.6)(typescript@5.9.3) '@layerzerolabs/prettier-config-next': specifier: ^2.3.39 version: 2.3.44 '@layerzerolabs/protocol-devtools': specifier: ^3.0.0 - version: 3.0.1(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(zod@3.25.76) + version: 3.0.2(@layerzerolabs/devtools@2.0.5)(@layerzerolabs/io-devtools@0.3.2)(@layerzerolabs/lz-definitions@3.0.159)(zod@3.25.76) '@layerzerolabs/protocol-devtools-evm': specifier: ~5.0.0 - version: 5.0.1(@ethersproject/abstract-provider@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@ethersproject/bignumber@5.8.0)(@ethersproject/constants@5.8.0)(@ethersproject/contracts@5.8.0)(@ethersproject/providers@5.8.0)(@layerzerolabs/devtools-evm@3.0.0)(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(@layerzerolabs/protocol-devtools@3.0.1)(zod@3.25.76) + version: 5.0.2(@ethersproject/abstract-provider@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@ethersproject/bignumber@5.8.0)(@ethersproject/constants@5.8.0)(@ethersproject/contracts@5.8.0)(@ethersproject/providers@5.8.0)(@layerzerolabs/devtools-evm@3.0.2)(@layerzerolabs/devtools@2.0.5)(@layerzerolabs/io-devtools@0.3.2)(@layerzerolabs/lz-definitions@3.0.159)(@layerzerolabs/protocol-devtools@3.0.2)(zod@3.25.76) '@layerzerolabs/protocol-devtools-solana': specifier: ^8.0.3 - version: 8.0.3(@layerzerolabs/devtools-solana@3.0.6)(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(@layerzerolabs/lz-solana-sdk-v2@3.0.142)(@layerzerolabs/lz-v2-utilities@3.0.142)(@layerzerolabs/protocol-devtools@3.0.1)(@layerzerolabs/ua-devtools@5.0.1)(@solana/web3.js@1.98.4)(fp-ts@2.16.11)(zod@3.25.76) + version: 8.0.6(@layerzerolabs/devtools-solana@3.0.7)(@layerzerolabs/devtools@2.0.5)(@layerzerolabs/io-devtools@0.3.2)(@layerzerolabs/lz-definitions@3.0.159)(@layerzerolabs/lz-solana-sdk-v2@3.0.159)(@layerzerolabs/lz-v2-utilities@3.0.159)(@layerzerolabs/protocol-devtools@3.0.2)(@layerzerolabs/ua-devtools@5.0.2)(@solana/web3.js@1.98.4)(fp-ts@2.16.11)(zod@3.25.76) '@layerzerolabs/solhint-config': specifier: ^3.0.12 - version: 3.0.142(typescript@5.9.3) + version: 3.0.159(typescript@5.9.3) '@layerzerolabs/test-devtools-evm-foundry': specifier: ~8.0.0 - version: 8.0.0(@layerzerolabs/lz-evm-messagelib-v2@3.0.142)(@layerzerolabs/lz-evm-protocol-v2@3.0.142)(@layerzerolabs/lz-evm-v1-0.7@3.0.142)(@layerzerolabs/oapp-evm@0.4.0)(@layerzerolabs/oft-evm@4.0.0)(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0) + version: 8.0.1(@layerzerolabs/lz-evm-messagelib-v2@3.0.159)(@layerzerolabs/lz-evm-protocol-v2@3.0.159)(@layerzerolabs/lz-evm-v1-0.7@3.0.159)(@layerzerolabs/oapp-evm@0.4.1)(@layerzerolabs/oft-evm@4.0.1)(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0) '@layerzerolabs/test-devtools-evm-hardhat': specifier: ~0.5.2 - version: 0.5.2(hardhat@2.26.4)(solidity-bytes-utils@0.8.4) + version: 0.5.3(hardhat@2.28.5)(solidity-bytes-utils@0.8.4) '@layerzerolabs/toolbox-foundry': specifier: ~0.1.12 version: 0.1.13 '@layerzerolabs/toolbox-hardhat': specifier: ~0.6.12 - version: 0.6.12(@ethersproject/abstract-provider@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@ethersproject/bignumber@5.8.0)(@ethersproject/constants@5.8.0)(@ethersproject/providers@5.8.0)(@nomicfoundation/hardhat-ethers@3.1.1)(@nomiclabs/hardhat-ethers@2.2.3)(ethers@5.8.0)(hardhat-deploy@0.12.4)(hardhat@2.26.4)(solidity-bytes-utils@0.8.4) + version: 0.6.13(@ethersproject/abstract-provider@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@ethersproject/bignumber@5.8.0)(@ethersproject/constants@5.8.0)(@ethersproject/providers@5.8.0)(@nomicfoundation/hardhat-ethers@3.1.3)(@nomiclabs/hardhat-ethers@2.2.3)(ethers@5.8.0)(hardhat-deploy@0.12.4)(hardhat@2.28.5)(solidity-bytes-utils@0.8.4)(typescript@5.9.3) '@layerzerolabs/ua-devtools': specifier: ~5.0.0 - version: 5.0.1(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(@layerzerolabs/lz-v2-utilities@3.0.142)(@layerzerolabs/protocol-devtools@3.0.1)(zod@3.25.76) + version: 5.0.2(@layerzerolabs/devtools@2.0.5)(@layerzerolabs/io-devtools@0.3.2)(@layerzerolabs/lz-definitions@3.0.159)(@layerzerolabs/lz-v2-utilities@3.0.159)(@layerzerolabs/protocol-devtools@3.0.2)(zod@3.25.76) '@layerzerolabs/ua-devtools-evm': specifier: ~7.0.0 - version: 7.0.0(@ethersproject/constants@5.8.0)(@ethersproject/contracts@5.8.0)(@layerzerolabs/devtools-evm@3.0.0)(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(@layerzerolabs/lz-v2-utilities@3.0.142)(@layerzerolabs/protocol-devtools-evm@5.0.1)(@layerzerolabs/protocol-devtools@3.0.1)(@layerzerolabs/ua-devtools@5.0.1)(zod@3.25.76) + version: 7.0.1(@ethersproject/constants@5.8.0)(@ethersproject/contracts@5.8.0)(@layerzerolabs/devtools-evm@3.0.2)(@layerzerolabs/devtools@2.0.5)(@layerzerolabs/io-devtools@0.3.2)(@layerzerolabs/lz-definitions@3.0.159)(@layerzerolabs/lz-v2-utilities@3.0.159)(@layerzerolabs/protocol-devtools-evm@5.0.2)(@layerzerolabs/protocol-devtools@3.0.2)(@layerzerolabs/ua-devtools@5.0.2)(zod@3.25.76) '@layerzerolabs/ua-devtools-evm-hardhat': specifier: ~9.0.0 - version: 9.0.0(@ethersproject/abi@5.8.0)(@ethersproject/bytes@5.8.0)(@ethersproject/contracts@5.8.0)(@ethersproject/hash@5.8.0)(@layerzerolabs/devtools-evm-hardhat@4.0.1)(@layerzerolabs/devtools-evm@3.0.0)(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(@layerzerolabs/protocol-devtools-evm@5.0.1)(@layerzerolabs/protocol-devtools@3.0.1)(@layerzerolabs/ua-devtools-evm@7.0.0)(@layerzerolabs/ua-devtools@5.0.1)(ethers@5.8.0)(hardhat-deploy@0.12.4)(hardhat@2.26.4) + version: 9.0.2(@ethersproject/abi@5.8.0)(@ethersproject/bytes@5.8.0)(@ethersproject/contracts@5.8.0)(@ethersproject/hash@5.8.0)(@layerzerolabs/devtools-evm-hardhat@4.0.4)(@layerzerolabs/devtools-evm@3.0.2)(@layerzerolabs/devtools@2.0.5)(@layerzerolabs/io-devtools@0.3.2)(@layerzerolabs/lz-definitions@3.0.159)(@layerzerolabs/protocol-devtools-evm@5.0.2)(@layerzerolabs/protocol-devtools@3.0.2)(@layerzerolabs/ua-devtools-evm@7.0.1)(@layerzerolabs/ua-devtools@5.0.2)(ethers@5.8.0)(hardhat-deploy@0.12.4)(hardhat@2.28.5) '@layerzerolabs/ua-devtools-solana': specifier: ~8.0.2 - version: 8.0.2(@layerzerolabs/devtools-solana@3.0.6)(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(@layerzerolabs/lz-solana-sdk-v2@3.0.142)(@layerzerolabs/lz-v2-utilities@3.0.142)(@layerzerolabs/oft-v2-solana-sdk@3.0.142)(@layerzerolabs/protocol-devtools-solana@8.0.3)(@layerzerolabs/protocol-devtools@3.0.1)(@layerzerolabs/ua-devtools@5.0.1)(@solana/web3.js@1.98.4)(fp-ts@2.16.11)(zod@3.25.76) + version: 8.0.7(@layerzerolabs/devtools-solana@3.0.7)(@layerzerolabs/devtools@2.0.5)(@layerzerolabs/io-devtools@0.3.2)(@layerzerolabs/lz-definitions@3.0.159)(@layerzerolabs/lz-solana-sdk-v2@3.0.159)(@layerzerolabs/lz-v2-utilities@3.0.159)(@layerzerolabs/oft-v2-solana-sdk@3.0.159)(@layerzerolabs/protocol-devtools-solana@8.0.6)(@layerzerolabs/protocol-devtools@3.0.2)(@layerzerolabs/ua-devtools@5.0.2)(@solana/web3.js@1.98.4)(fp-ts@2.16.11)(zod@3.25.76) '@metaplex-foundation/mpl-token-metadata': specifier: ^3.2.1 version: 3.4.0(@metaplex-foundation/umi@0.9.2) @@ -141,15 +141,18 @@ devDependencies: '@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) + '@noble/secp256k1': + specifier: ^1.7.1 + version: 1.7.2 '@nomicfoundation/hardhat-ethers': specifier: ^3.0.5 - version: 3.1.1(ethers@5.8.0)(hardhat@2.26.4) + version: 3.1.3(ethers@5.8.0)(hardhat@2.28.5) '@nomiclabs/hardhat-ethers': specifier: ^2.2.3 - version: 2.2.3(ethers@5.8.0)(hardhat@2.26.4) + version: 2.2.3(ethers@5.8.0)(hardhat@2.28.5) '@nomiclabs/hardhat-waffle': specifier: ^2.0.6 - version: 2.0.6(@nomiclabs/hardhat-ethers@2.2.3)(@types/sinon-chai@3.2.12)(ethereum-waffle@4.0.10)(ethers@5.8.0)(hardhat@2.26.4) + version: 2.0.6(@nomiclabs/hardhat-ethers@2.2.3)(@types/sinon-chai@3.2.12)(ethereum-waffle@4.0.10)(ethers@5.8.0)(hardhat@2.28.5) '@openzeppelin/contracts': specifier: ^5.0.2 version: 5.4.0 @@ -158,7 +161,7 @@ devDependencies: version: 5.4.0(@openzeppelin/contracts@5.4.0) '@rushstack/eslint-patch': specifier: ^1.7.0 - version: 1.14.1 + version: 1.15.0 '@safe-global/safe-core-sdk-types': specifier: ^2.3.0 version: 2.3.0 @@ -176,10 +179,10 @@ devDependencies: version: 2.0.4(typescript@5.9.3) '@swc/core': specifier: ^1.4.0 - version: 1.14.0 + version: 1.15.11 '@swc/jest': specifier: ^0.2.36 - version: 0.2.39(@swc/core@1.14.0) + version: 0.2.39(@swc/core@1.15.11) '@types/chai': specifier: ^4.3.11 version: 4.3.20 @@ -192,6 +195,9 @@ devDependencies: '@types/node': specifier: ~18.18.14 version: 18.18.14 + axios: + specifier: ^1.6.2 + version: 1.13.5 bs58: specifier: ^6.0.0 version: 6.0.0 @@ -224,16 +230,16 @@ devDependencies: version: 2.16.11 hardhat: specifier: ^2.22.10 - version: 2.26.4(ts-node@10.9.2)(typescript@5.9.3) + version: 2.28.5(ts-node@10.9.2)(typescript@5.9.3) hardhat-contract-sizer: specifier: ^2.10.0 - version: 2.10.1(hardhat@2.26.4) + version: 2.10.1(hardhat@2.28.5) hardhat-deploy: specifier: ^0.12.1 version: 0.12.4 hardhat-deploy-ethers: specifier: ^0.4.2 - version: 0.4.2(@nomicfoundation/hardhat-ethers@3.1.1)(hardhat-deploy@0.12.4)(hardhat@2.26.4) + version: 0.4.2(@nomicfoundation/hardhat-ethers@3.1.3)(hardhat-deploy@0.12.4)(hardhat@2.28.5) jest: specifier: ^29.7.0 version: 29.7.0(@types/node@18.18.14)(ts-node@10.9.2) @@ -242,23 +248,26 @@ devDependencies: version: 10.8.2 prettier: specifier: ^3.2.5 - version: 3.6.2 + 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 + ts-mocha: + specifier: ^10.0.0 + version: 10.1.0(mocha@10.8.2) ts-node: specifier: ^10.9.2 - version: 10.9.2(@swc/core@1.14.0)(@types/node@18.18.14)(typescript@5.9.3) + version: 10.9.2(@swc/core@1.15.11)(@types/node@18.18.14)(typescript@5.9.3) typescript: specifier: ^5.4.4 version: 5.9.3 packages: - /@0no-co/graphql.web@1.2.0(graphql@16.11.0): + /@0no-co/graphql.web@1.2.0(graphql@16.12.0): resolution: {integrity: sha512-/1iHy9TTr63gE1YcR5idjx8UREz1s0kFhydf3bBLCXyqjhkIc6igAzTOx3zPifCwFR87tsh/4Pa9cNts6d2otw==} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 @@ -266,22 +275,26 @@ packages: graphql: optional: true dependencies: - graphql: 16.11.0 + graphql: 16.12.0 dev: true - /@0no-co/graphqlsp@1.15.0(graphql@16.11.0)(typescript@5.9.3): - resolution: {integrity: sha512-SReJAGmOeXrHGod+9Odqrz4s43liK0b2DFUetb/jmYvxFpWmeNfFYo0seCh0jz8vG3p1pnYMav0+Tm7XwWtOJw==} + /@0no-co/graphqlsp@1.15.2(graphql@16.12.0)(typescript@5.9.3): + resolution: {integrity: sha512-Ys031WnS3sTQQBtRTkQsYnw372OlW72ais4sp0oh2UMPRNyxxnq85zRfU4PIdoy9kWriysPT5BYAkgIxhbonFA==} peerDependencies: graphql: ^15.5.0 || ^16.0.0 || ^17.0.0 typescript: ^5.0.0 dependencies: - '@gql.tada/internal': 1.0.8(graphql@16.11.0)(typescript@5.9.3) - graphql: 16.11.0 + '@gql.tada/internal': 1.0.8(graphql@16.12.0)(typescript@5.9.3) + graphql: 16.12.0 typescript: 5.9.3 dev: true - /@aptos-labs/aptos-client@2.0.0(got@11.8.6): - resolution: {integrity: sha512-A23T3zTCRXEKURodp00dkadVtIrhWjC9uo08dRDBkh69OhCnBAxkENmUy/rcBarfLoFr60nRWt7cBkc8wxr1mg==} + /@adraffy/ens-normalize@1.11.1: + resolution: {integrity: sha512-nhCBV3quEgesuf7c7KYfperqSS14T8bYuvJ8PcLJp6znkZpFc0AuW4qBtr8eKVyPPe/8RSr7sglCWPU5eaxwKQ==} + dev: true + + /@aptos-labs/aptos-client@2.1.0(got@11.8.6): + resolution: {integrity: sha512-ttdY0qclRvbYAAwzijkFeipuqTfLFJnoXlNIm58tIw3DKhIlfYdR6iLqTeCpI23oOPghnO99FZecej/0MTrtuA==} engines: {node: '>=20.0.0'} peerDependencies: got: ^11.8.6 @@ -294,8 +307,8 @@ packages: engines: {node: '>=18'} dev: true - /@babel/code-frame@7.27.1: - resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + /@babel/code-frame@7.29.0: + resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} engines: {node: '>=6.9.0'} dependencies: '@babel/helper-validator-identifier': 7.28.5 @@ -303,24 +316,24 @@ packages: picocolors: 1.1.1 dev: true - /@babel/compat-data@7.28.5: - resolution: {integrity: sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==} + /@babel/compat-data@7.29.0: + resolution: {integrity: sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==} engines: {node: '>=6.9.0'} dev: true - /@babel/core@7.28.5: - resolution: {integrity: sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==} + /@babel/core@7.29.0: + resolution: {integrity: sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.5 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5) - '@babel/helpers': 7.28.4 - '@babel/parser': 7.28.5 - '@babel/template': 7.27.2 - '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 + '@babel/code-frame': 7.29.0 + '@babel/generator': 7.29.1 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) + '@babel/helpers': 7.28.6 + '@babel/parser': 7.29.0 + '@babel/template': 7.28.6 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 debug: 4.4.3(supports-color@8.1.1) @@ -331,24 +344,24 @@ packages: - supports-color dev: true - /@babel/generator@7.28.5: - resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==} + /@babel/generator@7.29.1: + resolution: {integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/parser': 7.28.5 - '@babel/types': 7.28.5 + '@babel/parser': 7.29.0 + '@babel/types': 7.29.0 '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 dev: true - /@babel/helper-compilation-targets@7.27.2: - resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} + /@babel/helper-compilation-targets@7.28.6: + resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/compat-data': 7.28.5 + '@babel/compat-data': 7.29.0 '@babel/helper-validator-option': 7.27.1 - browserslist: 4.27.0 + browserslist: 4.28.1 lru-cache: 5.1.1 semver: 6.3.1 dev: true @@ -358,32 +371,32 @@ packages: engines: {node: '>=6.9.0'} dev: true - /@babel/helper-module-imports@7.27.1: - resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} + /@babel/helper-module-imports@7.28.6: + resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 transitivePeerDependencies: - supports-color dev: true - /@babel/helper-module-transforms@7.28.3(@babel/core@7.28.5): - resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} + /@babel/helper-module-transforms@7.28.6(@babel/core@7.29.0): + resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.28.5 - '@babel/helper-module-imports': 7.27.1 + '@babel/core': 7.29.0 + '@babel/helper-module-imports': 7.28.6 '@babel/helper-validator-identifier': 7.28.5 - '@babel/traverse': 7.28.5 + '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color dev: true - /@babel/helper-plugin-utils@7.27.1: - resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} + /@babel/helper-plugin-utils@7.28.6: + resolution: {integrity: sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==} engines: {node: '>=6.9.0'} dev: true @@ -402,211 +415,211 @@ packages: engines: {node: '>=6.9.0'} dev: true - /@babel/helpers@7.28.4: - resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==} + /@babel/helpers@7.28.6: + resolution: {integrity: sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.27.2 - '@babel/types': 7.28.5 + '@babel/template': 7.28.6 + '@babel/types': 7.29.0 dev: true - /@babel/parser@7.28.5: - resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} + /@babel/parser@7.29.0: + resolution: {integrity: sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==} engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.28.5 + '@babel/types': 7.29.0 dev: true - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.28.5): + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.29.0): resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 dev: true - /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.28.5): + /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.29.0): resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 dev: true - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.28.5): + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.29.0): resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 dev: true - /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.28.5): + /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.29.0): resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 dev: true - /@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.28.5): - resolution: {integrity: sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==} + /@babel/plugin-syntax-import-attributes@7.28.6(@babel/core@7.29.0): + resolution: {integrity: sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 dev: true - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.28.5): + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.29.0): resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 dev: true - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.28.5): + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.29.0): resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 dev: true - /@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.5): - resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} + /@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0): + resolution: {integrity: sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 dev: true - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.28.5): + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.29.0): resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 dev: true - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.28.5): + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.29.0): resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 dev: true - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.28.5): + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.29.0): resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 dev: true - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.28.5): + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.29.0): resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 dev: true - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.28.5): + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.29.0): resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 dev: true - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.28.5): + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.29.0): resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 dev: true - /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.28.5): + /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.29.0): resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 dev: true - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.28.5): + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.29.0): resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 dev: true - /@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.5): - resolution: {integrity: sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==} + /@babel/plugin-syntax-typescript@7.28.6(@babel/core@7.29.0): + resolution: {integrity: sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 dev: true - /@babel/runtime@7.28.4: - resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==} + /@babel/runtime@7.28.6: + resolution: {integrity: sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==} engines: {node: '>=6.9.0'} - /@babel/template@7.27.2: - resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} + /@babel/template@7.28.6: + resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.27.1 - '@babel/parser': 7.28.5 - '@babel/types': 7.28.5 + '@babel/code-frame': 7.29.0 + '@babel/parser': 7.29.0 + '@babel/types': 7.29.0 dev: true - /@babel/traverse@7.28.5: - resolution: {integrity: sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==} + /@babel/traverse@7.29.0: + resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.5 + '@babel/code-frame': 7.29.0 + '@babel/generator': 7.29.1 '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.28.5 - '@babel/template': 7.27.2 - '@babel/types': 7.28.5 + '@babel/parser': 7.29.0 + '@babel/template': 7.28.6 + '@babel/types': 7.29.0 debug: 4.4.3(supports-color@8.1.1) transitivePeerDependencies: - supports-color dev: true - /@babel/types@7.28.5: - resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} + /@babel/types@7.29.0: + resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} engines: {node: '>=6.9.0'} dependencies: '@babel/helper-string-parser': 7.27.1 @@ -818,8 +831,8 @@ packages: kuler: 2.0.0 dev: true - /@emnapi/core@1.6.0: - resolution: {integrity: sha512-zq/ay+9fNIJJtJiZxdTnXS20PllcYMX3OE23ESc4HK/bdYu3cOWYVhsOhVnXALfU/uqJIxn5NBPd9z4v+SfoSg==} + /@emnapi/core@1.8.1: + resolution: {integrity: sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==} requiresBuild: true dependencies: '@emnapi/wasi-threads': 1.1.0 @@ -827,8 +840,8 @@ packages: dev: true optional: true - /@emnapi/runtime@1.6.0: - resolution: {integrity: sha512-obtUmAHTMjll499P+D9A3axeJFlhdjOWdKUNs/U6QIGT7V5RjcUW1xToAzjvmgTSQhDbYn/NwfTRoJcQ2rNBxA==} + /@emnapi/runtime@1.8.1: + resolution: {integrity: sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==} requiresBuild: true dependencies: tslib: 2.8.1 @@ -859,8 +872,8 @@ packages: deprecated: Please use @ensdomains/ens-contracts dev: true - /@eslint-community/eslint-utils@4.9.0(eslint@8.57.1): - resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} + /@eslint-community/eslint-utils@4.9.1(eslint@8.57.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 @@ -884,7 +897,7 @@ packages: globals: 13.24.0 ignore: 5.3.2 import-fresh: 3.3.1 - js-yaml: 4.1.0 + js-yaml: 4.1.1 minimatch: 3.1.2 strip-json-comments: 3.1.1 transitivePeerDependencies: @@ -1128,7 +1141,7 @@ packages: '@ethereumjs/common': 2.6.5 '@ethereumjs/tx': 3.5.2 async-eventemitter: 0.2.4 - core-js-pure: 3.46.0 + core-js-pure: 3.48.0 debug: 2.6.9 ethereumjs-util: 7.1.5 functional-red-black-tree: 1.0.1 @@ -1529,8 +1542,8 @@ packages: '@trufflesuite/bigint-buffer': 1.1.9 dev: true - /@gql.tada/cli-utils@1.7.1(@0no-co/graphqlsp@1.15.0)(graphql@16.11.0)(typescript@5.9.3): - resolution: {integrity: sha512-wg5ysZNQxtNQm67T3laVWmZzLpGb7QfyYWZdaUD2r1OjDj5Bgftq7eQlplmH+hsdffjuUyhJw/b5XAjeE2mJtg==} + /@gql.tada/cli-utils@1.7.2(@0no-co/graphqlsp@1.15.2)(graphql@16.12.0)(typescript@5.9.3): + resolution: {integrity: sha512-Qbc7hbLvCz6IliIJpJuKJa9p05b2Jona7ov7+qofCsMRxHRZE1kpAmZMvL8JCI4c0IagpIlWNaMizXEQUe8XjQ==} peerDependencies: '@0no-co/graphqlsp': ^1.12.13 '@gql.tada/svelte-support': 1.0.1 @@ -1543,29 +1556,29 @@ packages: '@gql.tada/vue-support': optional: true dependencies: - '@0no-co/graphqlsp': 1.15.0(graphql@16.11.0)(typescript@5.9.3) - '@gql.tada/internal': 1.0.8(graphql@16.11.0)(typescript@5.9.3) - graphql: 16.11.0 + '@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 dev: true - /@gql.tada/internal@1.0.8(graphql@16.11.0)(typescript@5.9.3): + /@gql.tada/internal@1.0.8(graphql@16.12.0)(typescript@5.9.3): resolution: {integrity: sha512-XYdxJhtHC5WtZfdDqtKjcQ4d7R1s0d1rnlSs3OcBEUbYiPoJJfZU7tWsVXuv047Z6msvmr4ompJ7eLSK5Km57g==} peerDependencies: graphql: ^15.5.0 || ^16.0.0 || ^17.0.0 typescript: ^5.0.0 dependencies: - '@0no-co/graphql.web': 1.2.0(graphql@16.11.0) - graphql: 16.11.0 + '@0no-co/graphql.web': 1.2.0(graphql@16.12.0) + graphql: 16.12.0 typescript: 5.9.3 dev: true - /@graphql-typed-document-node/core@3.2.0(graphql@16.11.0): + /@graphql-typed-document-node/core@3.2.0(graphql@16.12.0): resolution: {integrity: sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==} peerDependencies: graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: - graphql: 16.11.0 + graphql: 16.12.0 dev: true /@humanwhocodes/config-array@0.13.0: @@ -1606,11 +1619,11 @@ packages: '@bitcoinerlab/secp256k1': 1.2.0 '@initia/initia.proto': 0.2.6 '@initia/opinit.proto': 0.0.11 - '@ledgerhq/hw-transport': 6.31.12 - '@ledgerhq/hw-transport-webhid': 6.30.8 - '@ledgerhq/hw-transport-webusb': 6.29.12 + '@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.1 + axios: 1.13.5 bech32: 2.0.0 bignumber.js: 9.3.1 bip32: 5.0.0(typescript@5.9.3) @@ -1619,8 +1632,8 @@ packages: keccak256: 1.0.6 ripemd160: 2.0.3 secp256k1: 5.0.1 - semver: 7.7.3 - ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + semver: 7.7.4 + ws: 8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - debug @@ -1646,18 +1659,18 @@ packages: protobufjs: 7.5.4 dev: true - /@iota/bcs@1.2.0: - resolution: {integrity: sha512-QdRSR0KpJ87tdjVNmM/j0+0DvE0aTxHIa02337iluaOsMqtJ8OdgUCfSyLduC/3qS+8tJE+UB1KOw55tF+sN2w==} + /@iota/bcs@1.4.0: + resolution: {integrity: sha512-Bpg8uPB3UTweJyFS3G+aycGcTCxaJQi2a9bEy2QXWMBM8a/tLN1KCg4IzKWkAJ4FyMNrZZrdXiBqAzmNK6xdVQ==} dependencies: bs58: 6.0.0 dev: true - /@iota/iota-sdk@1.6.1(typescript@5.9.3): - resolution: {integrity: sha512-V7rx7m9erCn9lr4hNZVMtwmka2NsoTZ9EFSE4ZqEDO44cWdheM61+i/y5HJhvvmYAb/kkDfSmfdmzLaGTbVVYg==} + /@iota/iota-sdk@1.10.1(typescript@5.9.3): + resolution: {integrity: sha512-q0GxOCFzPqIcaw1lFuFljmMDj1ajIK6UZFzOYnnPqfs/nufOZrJQ9Bg/hLj23xbMno/tdND+aIjDWY6GG8MAXw==} engines: {node: '>=20'} dependencies: - '@graphql-typed-document-node/core': 3.2.0(graphql@16.11.0) - '@iota/bcs': 1.2.0 + '@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 @@ -1665,10 +1678,10 @@ packages: '@suchipi/femver': 1.0.0 bech32: 2.0.0 bignumber.js: 9.3.1 - gql.tada: 1.8.13(graphql@16.11.0)(typescript@5.9.3) - graphql: 16.11.0 + gql.tada: 1.9.0(graphql@16.12.0)(typescript@5.9.3) + graphql: 16.12.0 tweetnacl: 1.0.3 - valibot: 0.36.0 + valibot: 1.2.0(typescript@5.9.3) transitivePeerDependencies: - '@gql.tada/svelte-support' - '@gql.tada/vue-support' @@ -1682,7 +1695,7 @@ packages: camelcase: 5.3.1 find-up: 4.1.0 get-package-type: 0.1.0 - js-yaml: 3.14.1 + js-yaml: 3.14.2 resolve-from: 5.0.0 dev: true @@ -1853,14 +1866,14 @@ packages: resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@sinclair/typebox': 0.27.8 + '@sinclair/typebox': 0.27.10 dev: true /@jest/schemas@30.0.5: resolution: {integrity: sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} dependencies: - '@sinclair/typebox': 0.34.41 + '@sinclair/typebox': 0.34.48 dev: true /@jest/source-map@29.6.3: @@ -1896,7 +1909,7 @@ packages: resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/core': 7.28.5 + '@babel/core': 7.29.0 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.31 babel-plugin-istanbul: 6.1.1 @@ -1923,7 +1936,7 @@ packages: '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 '@types/node': 18.18.14 - '@types/yargs': 17.0.34 + '@types/yargs': 17.0.35 chalk: 4.1.2 dev: true @@ -1936,7 +1949,7 @@ packages: '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 '@types/node': 18.18.14 - '@types/yargs': 17.0.34 + '@types/yargs': 17.0.35 chalk: 4.1.2 dev: true @@ -1977,17 +1990,17 @@ packages: '@jridgewell/sourcemap-codec': 1.5.5 dev: true - /@layerzerolabs/devtools-evm-hardhat@4.0.1(@ethersproject/abi@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@ethersproject/contracts@5.8.0)(@ethersproject/providers@5.8.0)(@layerzerolabs/devtools-evm@3.0.0)(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(@nomiclabs/hardhat-ethers@2.2.3)(ethers@5.8.0)(fp-ts@2.16.11)(hardhat-deploy@0.12.4)(hardhat@2.26.4): - resolution: {integrity: sha512-RqF6hrVhkJ/O83cYXi744TPOaqBzi4W4+daVHpZsp1W32hDbojYNcXwHi7jldt7BOL0KT/t4A5lBVIcGzCh0YQ==} + /@layerzerolabs/devtools-evm-hardhat@4.0.4(@ethersproject/abi@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@ethersproject/contracts@5.8.0)(@ethersproject/providers@5.8.0)(@layerzerolabs/devtools-evm@3.0.2)(@layerzerolabs/devtools@2.0.5)(@layerzerolabs/io-devtools@0.3.2)(@layerzerolabs/lz-definitions@3.0.159)(@nomiclabs/hardhat-ethers@2.2.3)(ethers@5.8.0)(fp-ts@2.16.11)(hardhat-deploy@0.12.4)(hardhat@2.28.5): + 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.0 - '@layerzerolabs/devtools-evm': ~3.0.0 - '@layerzerolabs/io-devtools': ~0.3.0 - '@layerzerolabs/lz-definitions': ^3.0.75 + '@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 @@ -1997,15 +2010,15 @@ packages: '@ethersproject/abstract-signer': 5.8.0 '@ethersproject/contracts': 5.8.0 '@ethersproject/providers': 5.8.0 - '@layerzerolabs/devtools': 2.0.3(@ethersproject/bytes@5.8.0)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(zod@3.25.76) - '@layerzerolabs/devtools-evm': 3.0.0(@ethersproject/abi@5.8.0)(@ethersproject/abstract-provider@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@ethersproject/address@5.7.0)(@ethersproject/bignumber@5.8.0)(@ethersproject/constants@5.8.0)(@ethersproject/contracts@5.8.0)(@ethersproject/providers@5.8.0)(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(fp-ts@2.16.11)(zod@3.25.76) + '@layerzerolabs/devtools': 2.0.5(@ethersproject/bytes@5.8.0)(@layerzerolabs/io-devtools@0.3.2)(@layerzerolabs/lz-definitions@3.0.159)(zod@3.25.76) + '@layerzerolabs/devtools-evm': 3.0.2(@ethersproject/abi@5.8.0)(@ethersproject/abstract-provider@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@ethersproject/address@5.7.0)(@ethersproject/bignumber@5.8.0)(@ethersproject/constants@5.8.0)(@ethersproject/contracts@5.8.0)(@ethersproject/providers@5.8.0)(@layerzerolabs/devtools@2.0.5)(@layerzerolabs/io-devtools@0.3.2)(@layerzerolabs/lz-definitions@3.0.159)(fp-ts@2.16.11)(typescript@5.9.3)(zod@3.25.76) '@layerzerolabs/export-deployments': 0.0.16 - '@layerzerolabs/io-devtools': 0.3.1(ink-gradient@2.0.0)(ink-table@3.1.0)(ink@3.2.0)(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76) - '@layerzerolabs/lz-definitions': 3.0.142 - '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.8.0)(hardhat@2.26.4) + '@layerzerolabs/io-devtools': 0.3.2(ink-gradient@2.0.0)(ink-table@3.1.0)(ink@3.2.0)(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76) + '@layerzerolabs/lz-definitions': 3.0.159 + '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.8.0)(hardhat@2.28.5) '@safe-global/protocol-kit': 1.3.0(ethers@5.8.0) fp-ts: 2.16.11 - hardhat: 2.26.4(ts-node@10.9.2)(typescript@5.9.3) + hardhat: 2.28.5(ts-node@10.9.2)(typescript@5.9.3) hardhat-deploy: 0.12.4 micro-memoize: 4.1.3 p-memoize: 4.0.4 @@ -2018,8 +2031,8 @@ packages: - utf-8-validate dev: true - /@layerzerolabs/devtools-evm@3.0.0(@ethersproject/abi@5.8.0)(@ethersproject/abstract-provider@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@ethersproject/address@5.7.0)(@ethersproject/bignumber@5.8.0)(@ethersproject/constants@5.8.0)(@ethersproject/contracts@5.8.0)(@ethersproject/providers@5.8.0)(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(fp-ts@2.16.11)(zod@3.25.76): - resolution: {integrity: sha512-k3oqoB8f4eQf111WtrFQOhzLaxsjEZn/N3o7Bbyn8HlNPPWCyockAfXZfTiJ5p5YXRBDJVO2RkwxsqE00wHnOw==} + /@layerzerolabs/devtools-evm@3.0.2(@ethersproject/abi@5.8.0)(@ethersproject/abstract-provider@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@ethersproject/address@5.7.0)(@ethersproject/bignumber@5.8.0)(@ethersproject/constants@5.8.0)(@ethersproject/contracts@5.8.0)(@ethersproject/providers@5.8.0)(@layerzerolabs/devtools@2.0.5)(@layerzerolabs/io-devtools@0.3.2)(@layerzerolabs/lz-definitions@3.0.159)(fp-ts@2.16.11)(typescript@5.9.3)(zod@3.25.76): + resolution: {integrity: sha512-3GukwiJQ1HYI5MwFQUVH7cK0z1AqKjnAyO/e8McUE9TFNjcwvRinFklrFlAy1euy6DTy1vf6BwNA49mK3N6EkA==} peerDependencies: '@ethersproject/abi': ^5.7.0 '@ethersproject/abstract-provider': ^5.7.0 @@ -2029,9 +2042,9 @@ packages: '@ethersproject/constants': ^5.7.0 '@ethersproject/contracts': ^5.7.0 '@ethersproject/providers': ^5.7.0 - '@layerzerolabs/devtools': ~2.0.0 - '@layerzerolabs/io-devtools': ~0.3.0 - '@layerzerolabs/lz-definitions': ^3.0.75 + '@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 dependencies: @@ -2043,10 +2056,10 @@ packages: '@ethersproject/constants': 5.8.0 '@ethersproject/contracts': 5.8.0 '@ethersproject/providers': 5.8.0 - '@layerzerolabs/devtools': 2.0.3(@ethersproject/bytes@5.8.0)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(zod@3.25.76) - '@layerzerolabs/io-devtools': 0.3.1(ink-gradient@2.0.0)(ink-table@3.1.0)(ink@3.2.0)(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76) - '@layerzerolabs/lz-definitions': 3.0.142 - '@safe-global/api-kit': 1.3.1 + '@layerzerolabs/devtools': 2.0.5(@ethersproject/bytes@5.8.0)(@layerzerolabs/io-devtools@0.3.2)(@layerzerolabs/lz-definitions@3.0.159)(zod@3.25.76) + '@layerzerolabs/io-devtools': 0.3.2(ink-gradient@2.0.0)(ink-table@3.1.0)(ink@3.2.0)(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76) + '@layerzerolabs/lz-definitions': 3.0.159 + '@safe-global/api-kit': 4.0.1(typescript@5.9.3)(zod@3.25.76) '@safe-global/protocol-kit': 1.3.0(ethers@5.8.0) ethers: 5.8.0 fp-ts: 2.16.11 @@ -2056,11 +2069,12 @@ packages: - bufferutil - encoding - supports-color + - typescript - utf-8-validate dev: true - /@layerzerolabs/devtools-solana@3.0.6(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(@solana/web3.js@1.98.4)(bn.js@5.2.2)(fastestsmallesttextencoderdecoder@1.0.22)(fp-ts@2.16.11)(typescript@5.9.3)(zod@3.25.76): - resolution: {integrity: sha512-QOcEIkof5BfAsRM3HiBlqieELA7rbQg5K+wDQJp6uk0OBkJtxWMBNDBYh58fwVMxILjKT1gKf49ElZYI7Sty8A==} + /@layerzerolabs/devtools-solana@3.0.7(@layerzerolabs/devtools@2.0.5)(@layerzerolabs/io-devtools@0.3.2)(@layerzerolabs/lz-definitions@3.0.159)(@solana/web3.js@1.98.4)(bn.js@5.2.2)(fastestsmallesttextencoderdecoder@1.0.22)(fp-ts@2.16.11)(typescript@5.9.3)(zod@3.25.76): + resolution: {integrity: sha512-GJy6LFwKRPFewecRYfeq1svZa9WNzXG3oXK17Z7TcbJoDzjCR7Y7LXr7XsTdgjXXc37qvWwLrxJEK6C0IMOG1g==} peerDependencies: '@layerzerolabs/devtools': ~2.0.4 '@layerzerolabs/io-devtools': ~0.3.2 @@ -2070,9 +2084,9 @@ packages: fp-ts: ^2.16.2 zod: ^3.22.4 dependencies: - '@layerzerolabs/devtools': 2.0.3(@ethersproject/bytes@5.8.0)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(zod@3.25.76) - '@layerzerolabs/io-devtools': 0.3.1(ink-gradient@2.0.0)(ink-table@3.1.0)(ink@3.2.0)(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76) - '@layerzerolabs/lz-definitions': 3.0.142 + '@layerzerolabs/devtools': 2.0.5(@ethersproject/bytes@5.8.0)(@layerzerolabs/io-devtools@0.3.2)(@layerzerolabs/lz-definitions@3.0.159)(zod@3.25.76) + '@layerzerolabs/io-devtools': 0.3.2(ink-gradient@2.0.0)(ink-table@3.1.0)(ink@3.2.0)(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76) + '@layerzerolabs/lz-definitions': 3.0.159 '@solana-developers/helpers': 2.8.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) '@solana/web3.js': 1.98.4(typescript@5.9.3) bn.js: 5.2.2 @@ -2087,20 +2101,20 @@ packages: - utf-8-validate dev: true - /@layerzerolabs/devtools@2.0.3(@ethersproject/bytes@5.8.0)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(zod@3.25.76): - resolution: {integrity: sha512-kpMQerGyDDQw9B9HdN/yqToZR1oDtFNHmfDQu069hiz8699cu/hUqevHmDPOdEKX+3HsRY3Gn/BZ5JW8WQbFmA==} + /@layerzerolabs/devtools@2.0.5(@ethersproject/bytes@5.8.0)(@layerzerolabs/io-devtools@0.3.2)(@layerzerolabs/lz-definitions@3.0.159)(zod@3.25.76): + resolution: {integrity: sha512-NwujsVyduYnY5R5qNA4xnA8Dwxs88oX0Kk/GpotkTII+F6z6PnGqHjiBzo/42plAxOmktGYo21BigxSXjCnEaw==} peerDependencies: '@ethersproject/bytes': ~5.7.0 - '@layerzerolabs/io-devtools': ~0.3.1 - '@layerzerolabs/lz-definitions': ^3.0.75 + '@layerzerolabs/io-devtools': ~0.3.2 + '@layerzerolabs/lz-definitions': ^3.0.148 zod: ^3.22.4 dependencies: '@ethersproject/bytes': 5.8.0 - '@layerzerolabs/io-devtools': 0.3.1(ink-gradient@2.0.0)(ink-table@3.1.0)(ink@3.2.0)(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76) - '@layerzerolabs/lz-definitions': 3.0.142 + '@layerzerolabs/io-devtools': 0.3.2(ink-gradient@2.0.0)(ink-table@3.1.0)(ink@3.2.0)(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76) + '@layerzerolabs/lz-definitions': 3.0.159 bs58: 6.0.0 exponential-backoff: 3.1.3 - js-yaml: 4.1.0 + js-yaml: 4.1.1 zod: 3.25.76 dev: true @@ -2115,9 +2129,9 @@ packages: eslint-plugin-autofix: 2.2.0(eslint@8.57.1) eslint-plugin-compat: 4.2.0(eslint@8.57.1) eslint-plugin-import: 2.32.0(@typescript-eslint/parser@7.18.0)(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) - eslint-plugin-prettier: 5.5.4(eslint-config-prettier@9.1.2)(eslint@8.57.1)(prettier@3.6.2) + eslint-plugin-prettier: 5.5.5(eslint-config-prettier@9.1.2)(eslint@8.57.1)(prettier@3.8.1) eslint-plugin-unused-imports: 3.2.0(@typescript-eslint/eslint-plugin@7.18.0)(eslint@8.57.1) - prettier: 3.6.2 + prettier: 3.8.1 transitivePeerDependencies: - '@types/eslint' - eslint-import-resolver-webpack @@ -2126,8 +2140,8 @@ packages: - typescript dev: true - /@layerzerolabs/evm-sdks-core@3.0.142: - resolution: {integrity: sha512-F+02Gytj4pzrw/JcyZN9btBUkT4rtXy5QTCv6YRB8Hb7zD1XfUHGG3QkwR00BqDe35nc7lg0ppGclpRdI7PMGg==} + /@layerzerolabs/evm-sdks-core@3.0.159: + resolution: {integrity: sha512-XGNDr1ngIAYSl6qKrkUKbtbHM0XYiNTKgh+fpSrC4L4gvnDcKHGTnvbFWc6z9cLPa4Vu9WbJxDDjoQQYYycQEg==} dependencies: ethers: 5.8.0 transitivePeerDependencies: @@ -2142,8 +2156,8 @@ packages: typescript: 5.9.3 dev: true - /@layerzerolabs/io-devtools@0.3.1(ink-gradient@2.0.0)(ink-table@3.1.0)(ink@3.2.0)(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76): - resolution: {integrity: sha512-sP65pO9Op7vLJV2nd5us3ip30S+ylOvT1JiISZineP6Bj1PaPWlXRmjbbznue1VYnF629l+VJ1nYN7a3f1UOTQ==} + /@layerzerolabs/io-devtools@0.3.2(ink-gradient@2.0.0)(ink-table@3.1.0)(ink@3.2.0)(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76): + resolution: {integrity: sha512-BQzf1enHz2Inflycr52s6C+sjh8d90OpjLgO9EL9aKGfc1TYa786H+21MZBY5djX/nghkp69C/KwsWzhHIc65g==} peerDependencies: ink: ^3.2.0 ink-gradient: ^2.0.0 @@ -2171,20 +2185,20 @@ packages: prompts: 2.4.2 react: 17.0.2 table: 6.8.2 - winston: 3.18.3 + winston: 3.19.0 yoga-layout-prebuilt: 1.10.0 zod: 3.25.76 dev: true - /@layerzerolabs/lz-core@3.0.142: - resolution: {integrity: sha512-ufIjJD2E0p4FLtNXHqxQ2wuK+CHvDfl4TUp5DgJdw6rFzRroLmX3YF9NdhPKbDUyCIcaGzWekJhc7miWftOF1Q==} + /@layerzerolabs/lz-core@3.0.159: + resolution: {integrity: sha512-VQsMFT4PYpVdj8KhfiYWTv77hLZnEW3LWLR06me5GxRw/sGjWsw4QqSmRgWWEt2rxP/LAjObNUt+l/yaej60Gg==} dev: true - /@layerzerolabs/lz-corekit-solana@3.0.142(got@11.8.6)(typescript@5.9.3): - resolution: {integrity: sha512-0U5j572qAN8Q5fzZI0hzRytSYBnHcB5roKXJrczrgBt9zq7n59GMsEE9fDCQ8SDazqyn6pXeeVYJOk1Q6zSBTw==} + /@layerzerolabs/lz-corekit-solana@3.0.159(got@11.8.6)(typescript@5.9.3): + resolution: {integrity: sha512-R1H2nndXEp4KAKgjdCPH0ZvAqdMD39Wn+AiKA0ywB9xt9sDfVX7fqk03IzB1trYBQ4+IltIwmIax706UlTgtrg==} dependencies: - '@layerzerolabs/lz-core': 3.0.142 - '@layerzerolabs/lz-utilities': 3.0.142(got@11.8.6)(typescript@5.9.3) + '@layerzerolabs/lz-core': 3.0.159 + '@layerzerolabs/lz-utilities': 3.0.159(got@11.8.6)(typescript@5.9.3) '@metaplex-foundation/umi': 0.9.2 '@metaplex-foundation/umi-eddsa-web3js': 0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.98.4) '@metaplex-foundation/umi-program-repository': 0.9.2(@metaplex-foundation/umi@0.9.2) @@ -2207,21 +2221,21 @@ packages: - utf-8-validate dev: true - /@layerzerolabs/lz-definitions@3.0.142: - resolution: {integrity: sha512-Sxr/Kyg6wGCzrH9zPuPQAAMnc6e/iRC4pXvdTRYaN6OtUZGAJ/mO9s7+NpSJ05unqS8wn+dabahLl5ogt1rYqg==} + /@layerzerolabs/lz-definitions@3.0.159: + resolution: {integrity: sha512-eTqBSiywdwNhk/Wq2PR0AbR9G+Eku2K2XlVHk11UfWha4gPfHLScHSoSl4PB4i1hcv6/83XqLzgcoggeA0ODxQ==} dependencies: tiny-invariant: 1.3.3 dev: true - /@layerzerolabs/lz-evm-messagelib-v2@3.0.142(@axelar-network/axelar-gmp-sdk-solidity@5.10.0)(@chainlink/contracts-ccip@0.7.6)(@eth-optimism/contracts@0.6.0)(@layerzerolabs/lz-evm-protocol-v2@3.0.142)(@layerzerolabs/lz-evm-v1-0.7@3.0.142)(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4)(solidity-bytes-utils@0.8.4): - resolution: {integrity: sha512-yjR2DVRQD3eD4kEMvBpIfHSSgKGn6SNVTpRBfQNoRe5qs/pmc2M6+pneAb+W7lKCHXEwqQOFnuXRyvmNbSoufA==} + /@layerzerolabs/lz-evm-messagelib-v2@3.0.159(@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.159)(@layerzerolabs/lz-evm-v1-0.7@3.0.159)(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4)(solidity-bytes-utils@0.8.4): + resolution: {integrity: sha512-BOt7cfbrDmEI3aQDYBh83+UubJJpPLqYcpdj42sNiVB3SkemxTvPvcXKz3Hp3E4hgRxYDJhqhglHlymw/H4Zpw==} peerDependencies: '@arbitrum/nitro-contracts': ^1.1.0 '@axelar-network/axelar-gmp-sdk-solidity': ^5.6.4 '@chainlink/contracts-ccip': ^0.7.6 '@eth-optimism/contracts': ^0.6.0 - '@layerzerolabs/lz-evm-protocol-v2': ^3.0.142 - '@layerzerolabs/lz-evm-v1-0.7': ^3.0.142 + '@layerzerolabs/lz-evm-protocol-v2': ^3.0.159 + '@layerzerolabs/lz-evm-v1-0.7': ^3.0.159 '@openzeppelin/contracts': ^4.8.1 || ^5.0.0 '@openzeppelin/contracts-upgradeable': ^4.8.1 || ^5.0.0 hardhat-deploy: ^0.12.1 @@ -2233,16 +2247,16 @@ packages: '@axelar-network/axelar-gmp-sdk-solidity': 5.10.0 '@chainlink/contracts-ccip': 0.7.6(ethers@5.8.0) '@eth-optimism/contracts': 0.6.0(ethers@5.8.0) - '@layerzerolabs/lz-evm-protocol-v2': 3.0.142(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4)(solidity-bytes-utils@0.8.4) - '@layerzerolabs/lz-evm-v1-0.7': 3.0.142(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4) + '@layerzerolabs/lz-evm-protocol-v2': 3.0.159(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4)(solidity-bytes-utils@0.8.4) + '@layerzerolabs/lz-evm-v1-0.7': 3.0.159(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4) '@openzeppelin/contracts': 5.4.0 '@openzeppelin/contracts-upgradeable': 5.4.0(@openzeppelin/contracts@5.4.0) hardhat-deploy: 0.12.4 solidity-bytes-utils: 0.8.4 dev: true - /@layerzerolabs/lz-evm-protocol-v2@3.0.142(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4)(solidity-bytes-utils@0.8.4): - resolution: {integrity: sha512-pbNX6/+ssLpwfWrdDCrROnp5LJ5Gc16iKAMKAg7CQwX7P6iMMHeXmshaItFqp0La69njiXBP4pTpS3gqNHaj4Q==} + /@layerzerolabs/lz-evm-protocol-v2@3.0.159(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4)(solidity-bytes-utils@0.8.4): + resolution: {integrity: sha512-uC8Q+xRhVteis3wHyUtjcrmXsPmQ7I+OnUgyEi5xEf+PBxS5NfTAAaT7b4fIn6pMmjkdZgfF6AioULsLspzPGg==} peerDependencies: '@openzeppelin/contracts': ^4.8.1 || ^5.0.0 '@openzeppelin/contracts-upgradeable': ^4.8.1 || ^5.0.0 @@ -2255,30 +2269,30 @@ packages: solidity-bytes-utils: 0.8.4 dev: true - /@layerzerolabs/lz-evm-sdk-v1@3.0.142: - resolution: {integrity: sha512-5p5JUMq9amqZxt14hvKTb1hlNe0beX1ISPOroJggtQMcBLfm+yLHSUYMCbxuECKAI7kccqF0ACOZtp8FiBxLOw==} + /@layerzerolabs/lz-evm-sdk-v1@3.0.159: + resolution: {integrity: sha512-XrmBLfPqD+NQwbtic8oxZs4atiy/wk4jj74Nsxm+yg4iQaRENmSMhI5hG1agXi1v1izFkr6nVkTrGf4wTnQaiw==} dependencies: '@ethersproject/abi': 5.8.0 '@ethersproject/providers': 5.8.0 - '@layerzerolabs/evm-sdks-core': 3.0.142 + '@layerzerolabs/evm-sdks-core': 3.0.159 ethers: 5.8.0 transitivePeerDependencies: - bufferutil - utf-8-validate dev: true - /@layerzerolabs/lz-evm-sdk-v2@3.0.142: - resolution: {integrity: sha512-P5Fi2NyYmeKzQFmsDGKziyEcWI9TX/k0LPT5E+zb8zakg2s+pIlp0o68Q+oMdJdgkv5bh2K2hVdoWpuQdTB7wA==} + /@layerzerolabs/lz-evm-sdk-v2@3.0.159: + resolution: {integrity: sha512-bs4JqkOO+YxhN56a6VkVS3qUoSSz8rHJAvjuh/3euAlWMJJ/ABXRUMrcUSP6oWeVKLvDOx65tCcX2pk1wfPB0g==} dependencies: - '@layerzerolabs/evm-sdks-core': 3.0.142 + '@layerzerolabs/evm-sdks-core': 3.0.159 ethers: 5.8.0 transitivePeerDependencies: - bufferutil - utf-8-validate dev: true - /@layerzerolabs/lz-evm-v1-0.7@3.0.142(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4): - resolution: {integrity: sha512-dTYl7MCjeKNtfzF9zkm/E6zCro3/66k1fzQbgioHNK9gSZhjZfgpuQD10zXAVFjBoDI2LGh/SFlBet5mmSWD7g==} + /@layerzerolabs/lz-evm-v1-0.7@3.0.159(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4): + resolution: {integrity: sha512-hleOCJZ+Y02//Q9RYFAijUmQNYWOtuYFRUO+yLENP6SvPVaz3Fm2WUKOsqXOfKhCjfhLbxDIWqvqt01SyZE/Ug==} 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 @@ -2289,11 +2303,11 @@ packages: hardhat-deploy: 0.12.4 dev: true - /@layerzerolabs/lz-foundation@3.0.142(got@11.8.6)(typescript@5.9.3): - resolution: {integrity: sha512-pkxpZ3WnvsSS5thxmXAjJqNBrsxRp2nUfHsfALUzINMu1YYap3VDjxKveYX28ekS4vrwcR400t4MhAgi4RGevA==} + /@layerzerolabs/lz-foundation@3.0.159(got@11.8.6)(typescript@5.9.3): + resolution: {integrity: sha512-jdkWdAxu6hJMLqqDRIlUqP6Lt5YBkpGTlXrFyEhU/hxOZdWbb2vcF8F59hoU/7idILx3O1inX1zh4Ag39D2dEA==} dependencies: - '@layerzerolabs/lz-definitions': 3.0.142 - '@layerzerolabs/lz-utilities': 3.0.142(got@11.8.6)(typescript@5.9.3) + '@layerzerolabs/lz-definitions': 3.0.159 + '@layerzerolabs/lz-utilities': 3.0.159(got@11.8.6)(typescript@5.9.3) '@noble/ed25519': 1.7.5 '@noble/hashes': 1.8.0 '@noble/secp256k1': 1.7.2 @@ -2311,13 +2325,13 @@ packages: - utf-8-validate dev: true - /@layerzerolabs/lz-serdes@3.0.142(got@11.8.6)(typescript@5.9.3): - resolution: {integrity: sha512-rWhF+qvvwQjFW3HAzsW+6SaeDaccxWhT/+Y/wA2vti6yyE53Ges2nTfDtDyTwM9AVqXersd1r5tlr+fVk1hP0w==} + /@layerzerolabs/lz-serdes@3.0.159(got@11.8.6)(typescript@5.9.3): + resolution: {integrity: sha512-R4cEH7ZkprMgEnVTnF2FPFSWaz5wC0g/xXqn0hJbGqvoinHN6rHt2OIWrofeCQ30kVXY6PxEaEE0RuiDK/OOXA==} dependencies: '@coral-xyz/anchor': 0.29.0(typescript@5.9.3) - '@layerzerolabs/lz-core': 3.0.142 - '@layerzerolabs/lz-utilities': 3.0.142(got@11.8.6)(typescript@5.9.3) - '@layerzerolabs/tron-utilities': 3.0.142(got@11.8.6)(typescript@5.9.3) + '@layerzerolabs/lz-core': 3.0.159 + '@layerzerolabs/lz-utilities': 3.0.159(got@11.8.6)(typescript@5.9.3) + '@layerzerolabs/tron-utilities': 3.0.159(got@11.8.6)(typescript@5.9.3) aptos: 1.22.1(got@11.8.6) bip39: 3.1.0 ed25519-hd-key: 1.3.0 @@ -2335,15 +2349,15 @@ packages: - utf-8-validate dev: true - /@layerzerolabs/lz-solana-sdk-v2@3.0.142(fastestsmallesttextencoderdecoder@1.0.22)(got@11.8.6)(typescript@5.9.3): - resolution: {integrity: sha512-2mew2i37qZ1F27T7JwDCGfUIVrhYyqxD8KhLpxxn3YkekYsBize1LwzW5X+zJB1Ghua5ufdZFb4k6pDVMpFkWA==} + /@layerzerolabs/lz-solana-sdk-v2@3.0.159(fastestsmallesttextencoderdecoder@1.0.22)(got@11.8.6)(typescript@5.9.3): + resolution: {integrity: sha512-s/JseU+pcyqzQg23o3ubxBClqDfya6erwgZqSHiZx8I56jmpU372rbShcW44qoUvKQn00Oe0Sj1yUdmGxRAQpw==} dependencies: - '@layerzerolabs/lz-corekit-solana': 3.0.142(got@11.8.6)(typescript@5.9.3) - '@layerzerolabs/lz-definitions': 3.0.142 - '@layerzerolabs/lz-foundation': 3.0.142(got@11.8.6)(typescript@5.9.3) - '@layerzerolabs/lz-serdes': 3.0.142(got@11.8.6)(typescript@5.9.3) - '@layerzerolabs/lz-utilities': 3.0.142(got@11.8.6)(typescript@5.9.3) - '@layerzerolabs/lz-v2-utilities': 3.0.142 + '@layerzerolabs/lz-corekit-solana': 3.0.159(got@11.8.6)(typescript@5.9.3) + '@layerzerolabs/lz-definitions': 3.0.159 + '@layerzerolabs/lz-foundation': 3.0.159(got@11.8.6)(typescript@5.9.3) + '@layerzerolabs/lz-serdes': 3.0.159(got@11.8.6)(typescript@5.9.3) + '@layerzerolabs/lz-utilities': 3.0.159(got@11.8.6)(typescript@5.9.3) + '@layerzerolabs/lz-v2-utilities': 3.0.159 '@metaplex-foundation/beet': 0.7.2 '@metaplex-foundation/beet-solana': 0.4.1(typescript@5.9.3) '@metaplex-foundation/mpl-toolbox': 0.9.4(@metaplex-foundation/umi@0.9.2) @@ -2370,21 +2384,21 @@ packages: - utf-8-validate dev: true - /@layerzerolabs/lz-utilities@3.0.142(got@11.8.6)(typescript@5.9.3): - resolution: {integrity: sha512-5hRog7grjnsIg+IuP2vBP1IYrXmF4y1xZKUNZ23vNbS3/di2Jj3Hbh5BU5o0z+hBATkKdM6KVsPGIwWts0h8Yw==} + /@layerzerolabs/lz-utilities@3.0.159(got@11.8.6)(typescript@5.9.3): + resolution: {integrity: sha512-5yFeOfScQ4vJ86Xx8fLkQzWKPvU5toIKC+yiwXUjG9qB6gWNEvSihT7724NogMxTx2a9GsZW0DINXerGNzd92Q==} dependencies: '@ethersproject/bytes': 5.8.0 '@initia/initia.js': 1.0.4(typescript@5.9.3) - '@iota/iota-sdk': 1.6.1(typescript@5.9.3) - '@layerzerolabs/lz-definitions': 3.0.142 - '@mysten/sui': 1.43.2(typescript@5.9.3) + '@iota/iota-sdk': 1.10.1(typescript@5.9.3) + '@layerzerolabs/lz-definitions': 3.0.159 + '@mysten/sui': 1.45.2(typescript@5.9.3) '@solana/web3.js': 1.98.4(typescript@5.9.3) '@ton/core': 0.59.1(@ton/crypto@3.3.0) '@ton/crypto': 3.3.0 '@ton/ton': 15.1.0(@ton/core@0.59.1)(@ton/crypto@3.3.0) aptos: 1.22.1(got@11.8.6) bip39: 3.1.0 - dayjs: 1.11.18 + dayjs: 1.11.19 ed25519-hd-key: 1.3.0 ethers: 5.8.0 memoizee: 0.4.17 @@ -2401,8 +2415,8 @@ packages: - utf-8-validate dev: true - /@layerzerolabs/lz-v2-utilities@3.0.142: - resolution: {integrity: sha512-VAa03YAm7Hr9a2Kjj/UGJw5m2pkFSjbo3C5Fh3VumXbKM32vOogDdPurcBoWNRUxD08k8NylX2whse1qfDlZ9g==} + /@layerzerolabs/lz-v2-utilities@3.0.159: + resolution: {integrity: sha512-aBTdtF7cBl9TDsnA4eBmswe+O52LspD0iGYna6BhvZTX3d/MTRwzqTRViYr03BtGz3nXUXfi1DJVLy+CRmAJEw==} dependencies: '@ethersproject/abi': 5.8.0 '@ethersproject/address': 5.8.0 @@ -2414,28 +2428,28 @@ packages: tiny-invariant: 1.3.3 dev: true - /@layerzerolabs/metadata-tools@3.0.2(@layerzerolabs/devtools-evm-hardhat@4.0.1)(@layerzerolabs/ua-devtools@5.0.1): - resolution: {integrity: sha512-C+LcNFMDXcanDlCOaXm7UGeOObN947BbOCP5mfGkdnKGso1I3+Tak/1QpCRMWvcz1zfa4jikF5KQsfY5bJQD4Q==} + /@layerzerolabs/metadata-tools@3.0.3(@layerzerolabs/devtools-evm-hardhat@4.0.4)(@layerzerolabs/ua-devtools@5.0.2): + resolution: {integrity: sha512-h78EwbgN84Zo0Wr5n7gQL5Zp1lkSUFTP+56BLF+H0ZaH9CLqHMjypVMtKu9oNMpTas4P072v7O6P3XdiS6VOLw==} peerDependencies: '@layerzerolabs/devtools-evm-hardhat': ~4.0.0 '@layerzerolabs/ua-devtools': ~5.0.1 dependencies: - '@layerzerolabs/devtools-evm-hardhat': 4.0.1(@ethersproject/abi@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@ethersproject/contracts@5.8.0)(@ethersproject/providers@5.8.0)(@layerzerolabs/devtools-evm@3.0.0)(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(@nomiclabs/hardhat-ethers@2.2.3)(ethers@5.8.0)(fp-ts@2.16.11)(hardhat-deploy@0.12.4)(hardhat@2.26.4) - '@layerzerolabs/ua-devtools': 5.0.1(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(@layerzerolabs/lz-v2-utilities@3.0.142)(@layerzerolabs/protocol-devtools@3.0.1)(zod@3.25.76) + '@layerzerolabs/devtools-evm-hardhat': 4.0.4(@ethersproject/abi@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@ethersproject/contracts@5.8.0)(@ethersproject/providers@5.8.0)(@layerzerolabs/devtools-evm@3.0.2)(@layerzerolabs/devtools@2.0.5)(@layerzerolabs/io-devtools@0.3.2)(@layerzerolabs/lz-definitions@3.0.159)(@nomiclabs/hardhat-ethers@2.2.3)(ethers@5.8.0)(fp-ts@2.16.11)(hardhat-deploy@0.12.4)(hardhat@2.28.5) + '@layerzerolabs/ua-devtools': 5.0.2(@layerzerolabs/devtools@2.0.5)(@layerzerolabs/io-devtools@0.3.2)(@layerzerolabs/lz-definitions@3.0.159)(@layerzerolabs/lz-v2-utilities@3.0.159)(@layerzerolabs/protocol-devtools@3.0.2)(zod@3.25.76) dev: true - /@layerzerolabs/oapp-evm@0.4.0(@layerzerolabs/lz-evm-messagelib-v2@3.0.142)(@layerzerolabs/lz-evm-protocol-v2@3.0.142)(@layerzerolabs/lz-evm-v1-0.7@3.0.142)(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0): - resolution: {integrity: sha512-/AixOWiirp4GH5SGL/LmsMwHKLN8BiOd46u13LSVM0UyLkrwN5ulN6kt76Ed9Z20hafbmq7mt83yZiDxHeG+XA==} + /@layerzerolabs/oapp-evm@0.4.1(@layerzerolabs/lz-evm-messagelib-v2@3.0.159)(@layerzerolabs/lz-evm-protocol-v2@3.0.159)(@layerzerolabs/lz-evm-v1-0.7@3.0.159)(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0): + resolution: {integrity: sha512-eOoDepVSrUlVNIlnkH0Vd5Vt4lXBkSBh6Bb16vsLbaN9AryBjy4GDpsE7K4c8iWTFL9BiBXGsV7nJTkgqi+xRQ==} peerDependencies: - '@layerzerolabs/lz-evm-messagelib-v2': ^3.0.75 - '@layerzerolabs/lz-evm-protocol-v2': ^3.0.75 - '@layerzerolabs/lz-evm-v1-0.7': ^3.0.75 + '@layerzerolabs/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 dependencies: - '@layerzerolabs/lz-evm-messagelib-v2': 3.0.142(@axelar-network/axelar-gmp-sdk-solidity@5.10.0)(@chainlink/contracts-ccip@0.7.6)(@eth-optimism/contracts@0.6.0)(@layerzerolabs/lz-evm-protocol-v2@3.0.142)(@layerzerolabs/lz-evm-v1-0.7@3.0.142)(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4)(solidity-bytes-utils@0.8.4) - '@layerzerolabs/lz-evm-protocol-v2': 3.0.142(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4)(solidity-bytes-utils@0.8.4) - '@layerzerolabs/lz-evm-v1-0.7': 3.0.142(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4) + '@layerzerolabs/lz-evm-messagelib-v2': 3.0.159(@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.159)(@layerzerolabs/lz-evm-v1-0.7@3.0.159)(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4)(solidity-bytes-utils@0.8.4) + '@layerzerolabs/lz-evm-protocol-v2': 3.0.159(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4)(solidity-bytes-utils@0.8.4) + '@layerzerolabs/lz-evm-v1-0.7': 3.0.159(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4) '@openzeppelin/contracts': 5.4.0 '@openzeppelin/contracts-upgradeable': 5.4.0(@openzeppelin/contracts@5.4.0) ethers: 5.8.0 @@ -2444,31 +2458,31 @@ packages: - utf-8-validate dev: true - /@layerzerolabs/oft-evm@4.0.0(@layerzerolabs/lz-evm-messagelib-v2@3.0.142)(@layerzerolabs/lz-evm-protocol-v2@3.0.142)(@layerzerolabs/lz-evm-v1-0.7@3.0.142)(@layerzerolabs/oapp-evm@0.4.0)(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0): - resolution: {integrity: sha512-9GTLg/q+XcZHkNOh3gEw60QJWen/TeJOoqHGwEfJfB1csUx+fIPjYmjepwKUbAwU2+tMUQqcfdt7ajhZmbKWdw==} + /@layerzerolabs/oft-evm@4.0.1(@layerzerolabs/lz-evm-messagelib-v2@3.0.159)(@layerzerolabs/lz-evm-protocol-v2@3.0.159)(@layerzerolabs/lz-evm-v1-0.7@3.0.159)(@layerzerolabs/oapp-evm@0.4.1)(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0): + resolution: {integrity: sha512-GjjfnUbx77TnFFKALVRXJYb1bt1jvarcyyx/AQo6sZfJng5DIqzI9wDxEGlUz03tEnsS6ZOOLBsH+e/hYsruiA==} peerDependencies: - '@layerzerolabs/lz-evm-messagelib-v2': ^3.0.75 - '@layerzerolabs/lz-evm-protocol-v2': ^3.0.75 - '@layerzerolabs/lz-evm-v1-0.7': ^3.0.75 - '@layerzerolabs/oapp-evm': ^0.4.0 + '@layerzerolabs/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 dependencies: - '@layerzerolabs/lz-evm-messagelib-v2': 3.0.142(@axelar-network/axelar-gmp-sdk-solidity@5.10.0)(@chainlink/contracts-ccip@0.7.6)(@eth-optimism/contracts@0.6.0)(@layerzerolabs/lz-evm-protocol-v2@3.0.142)(@layerzerolabs/lz-evm-v1-0.7@3.0.142)(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4)(solidity-bytes-utils@0.8.4) - '@layerzerolabs/lz-evm-protocol-v2': 3.0.142(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4)(solidity-bytes-utils@0.8.4) - '@layerzerolabs/lz-evm-v1-0.7': 3.0.142(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4) - '@layerzerolabs/oapp-evm': 0.4.0(@layerzerolabs/lz-evm-messagelib-v2@3.0.142)(@layerzerolabs/lz-evm-protocol-v2@3.0.142)(@layerzerolabs/lz-evm-v1-0.7@3.0.142)(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0) + '@layerzerolabs/lz-evm-messagelib-v2': 3.0.159(@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.159)(@layerzerolabs/lz-evm-v1-0.7@3.0.159)(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4)(solidity-bytes-utils@0.8.4) + '@layerzerolabs/lz-evm-protocol-v2': 3.0.159(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4)(solidity-bytes-utils@0.8.4) + '@layerzerolabs/lz-evm-v1-0.7': 3.0.159(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4) + '@layerzerolabs/oapp-evm': 0.4.1(@layerzerolabs/lz-evm-messagelib-v2@3.0.159)(@layerzerolabs/lz-evm-protocol-v2@3.0.159)(@layerzerolabs/lz-evm-v1-0.7@3.0.159)(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0) '@openzeppelin/contracts': 5.4.0 '@openzeppelin/contracts-upgradeable': 5.4.0(@openzeppelin/contracts@5.4.0) dev: true - /@layerzerolabs/oft-v2-solana-sdk@3.0.142(fastestsmallesttextencoderdecoder@1.0.22)(got@11.8.6)(typescript@5.9.3): - resolution: {integrity: sha512-5FqrCM/5xto21mg10ZgQT9x3PvvHxPq7xlocI9izl0w6Qc6CQTwAZobiZGDeSFM77MsRruDwzQIal5ZuzPokww==} + /@layerzerolabs/oft-v2-solana-sdk@3.0.159(fastestsmallesttextencoderdecoder@1.0.22)(got@11.8.6)(typescript@5.9.3): + resolution: {integrity: sha512-y8XITofUto+NGo217y64+YhqM5+0uUaK4MXnXAP9eaPxkWMXPRMUF9QSAk4F+uTxeJ7wZeG5hGuudgmA47ZO6A==} dependencies: '@ethersproject/bytes': 5.8.0 - '@layerzerolabs/lz-foundation': 3.0.142(got@11.8.6)(typescript@5.9.3) - '@layerzerolabs/lz-solana-sdk-v2': 3.0.142(fastestsmallesttextencoderdecoder@1.0.22)(got@11.8.6)(typescript@5.9.3) - '@layerzerolabs/lz-v2-utilities': 3.0.142 + '@layerzerolabs/lz-foundation': 3.0.159(got@11.8.6)(typescript@5.9.3) + '@layerzerolabs/lz-solana-sdk-v2': 3.0.159(fastestsmallesttextencoderdecoder@1.0.22)(got@11.8.6)(typescript@5.9.3) + '@layerzerolabs/lz-v2-utilities': 3.0.159 '@metaplex-foundation/beet': 0.7.2 '@metaplex-foundation/beet-solana': 0.4.1(typescript@5.9.3) '@metaplex-foundation/umi': 0.9.2 @@ -2494,13 +2508,13 @@ packages: /@layerzerolabs/prettier-config-next@2.3.44: resolution: {integrity: sha512-mIsxKLaelXHXXXvMEAE6Jc8IVydra0PesHquHYwvxFKwDhMhzfrnoRLLzbgCX/Zi1q0GGET/oMAKJTs6OWFPxQ==} dependencies: - prettier: 3.6.2 - prettier-plugin-packagejson: 2.5.19(prettier@3.6.2) - prettier-plugin-solidity: 1.4.3(prettier@3.6.2) + prettier: 3.8.1 + prettier-plugin-packagejson: 2.5.22(prettier@3.8.1) + prettier-plugin-solidity: 1.4.3(prettier@3.8.1) dev: true - /@layerzerolabs/protocol-devtools-evm@5.0.1(@ethersproject/abstract-provider@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@ethersproject/bignumber@5.8.0)(@ethersproject/constants@5.8.0)(@ethersproject/contracts@5.8.0)(@ethersproject/providers@5.8.0)(@layerzerolabs/devtools-evm@3.0.0)(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(@layerzerolabs/protocol-devtools@3.0.1)(zod@3.25.76): - resolution: {integrity: sha512-g2RwxOWJITuEKU/j04UscEc57OcU03+vEsS7i3jyz+AKKq2vjXFMf6s9rbeQmu548/8LppnHg/t5QH5R33TPkQ==} + /@layerzerolabs/protocol-devtools-evm@5.0.2(@ethersproject/abstract-provider@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@ethersproject/bignumber@5.8.0)(@ethersproject/constants@5.8.0)(@ethersproject/contracts@5.8.0)(@ethersproject/providers@5.8.0)(@layerzerolabs/devtools-evm@3.0.2)(@layerzerolabs/devtools@2.0.5)(@layerzerolabs/io-devtools@0.3.2)(@layerzerolabs/lz-definitions@3.0.159)(@layerzerolabs/protocol-devtools@3.0.2)(zod@3.25.76): + resolution: {integrity: sha512-KeBBqxupuJ2CchmjctHSs6IcGd4iWSgIvVnQ9EI662ScwMmESz3JMFMkUhsQQqDa/a4Hvf8rLYW+e7E7D1TuVw==} peerDependencies: '@ethersproject/abstract-provider': ^5.7.0 '@ethersproject/abstract-signer': ^5.7.0 @@ -2508,11 +2522,11 @@ packages: '@ethersproject/constants': ^5.7.0 '@ethersproject/contracts': ^5.7.0 '@ethersproject/providers': ^5.7.0 - '@layerzerolabs/devtools': ~2.0.0 - '@layerzerolabs/devtools-evm': ~3.0.0 - '@layerzerolabs/io-devtools': ~0.3.0 - '@layerzerolabs/lz-definitions': ^3.0.75 - '@layerzerolabs/protocol-devtools': ~3.0.1 + '@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 dependencies: '@ethersproject/abstract-provider': 5.8.0 @@ -2521,101 +2535,92 @@ packages: '@ethersproject/constants': 5.8.0 '@ethersproject/contracts': 5.8.0 '@ethersproject/providers': 5.8.0 - '@layerzerolabs/devtools': 2.0.3(@ethersproject/bytes@5.8.0)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(zod@3.25.76) - '@layerzerolabs/devtools-evm': 3.0.0(@ethersproject/abi@5.8.0)(@ethersproject/abstract-provider@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@ethersproject/address@5.7.0)(@ethersproject/bignumber@5.8.0)(@ethersproject/constants@5.8.0)(@ethersproject/contracts@5.8.0)(@ethersproject/providers@5.8.0)(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(fp-ts@2.16.11)(zod@3.25.76) - '@layerzerolabs/io-devtools': 0.3.1(ink-gradient@2.0.0)(ink-table@3.1.0)(ink@3.2.0)(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76) - '@layerzerolabs/lz-definitions': 3.0.142 - '@layerzerolabs/protocol-devtools': 3.0.1(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(zod@3.25.76) + '@layerzerolabs/devtools': 2.0.5(@ethersproject/bytes@5.8.0)(@layerzerolabs/io-devtools@0.3.2)(@layerzerolabs/lz-definitions@3.0.159)(zod@3.25.76) + '@layerzerolabs/devtools-evm': 3.0.2(@ethersproject/abi@5.8.0)(@ethersproject/abstract-provider@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@ethersproject/address@5.7.0)(@ethersproject/bignumber@5.8.0)(@ethersproject/constants@5.8.0)(@ethersproject/contracts@5.8.0)(@ethersproject/providers@5.8.0)(@layerzerolabs/devtools@2.0.5)(@layerzerolabs/io-devtools@0.3.2)(@layerzerolabs/lz-definitions@3.0.159)(fp-ts@2.16.11)(typescript@5.9.3)(zod@3.25.76) + '@layerzerolabs/io-devtools': 0.3.2(ink-gradient@2.0.0)(ink-table@3.1.0)(ink@3.2.0)(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76) + '@layerzerolabs/lz-definitions': 3.0.159 + '@layerzerolabs/protocol-devtools': 3.0.2(@layerzerolabs/devtools@2.0.5)(@layerzerolabs/io-devtools@0.3.2)(@layerzerolabs/lz-definitions@3.0.159)(zod@3.25.76) p-memoize: 4.0.4 zod: 3.25.76 dev: true - /@layerzerolabs/protocol-devtools-solana@8.0.3(@layerzerolabs/devtools-solana@3.0.6)(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(@layerzerolabs/lz-solana-sdk-v2@3.0.142)(@layerzerolabs/lz-v2-utilities@3.0.142)(@layerzerolabs/protocol-devtools@3.0.1)(@layerzerolabs/ua-devtools@5.0.1)(@solana/web3.js@1.98.4)(fp-ts@2.16.11)(zod@3.25.76): - resolution: {integrity: sha512-zeor10qzjlVgmGDmlbb/s2JMo8pPGHmRcsnDgorunGwAop3BfZkSZI8RbpedXSNVPTfDAdC0VXykpHsXHyrCKg==} + /@layerzerolabs/protocol-devtools-solana@8.0.6(@layerzerolabs/devtools-solana@3.0.7)(@layerzerolabs/devtools@2.0.5)(@layerzerolabs/io-devtools@0.3.2)(@layerzerolabs/lz-definitions@3.0.159)(@layerzerolabs/lz-solana-sdk-v2@3.0.159)(@layerzerolabs/lz-v2-utilities@3.0.159)(@layerzerolabs/protocol-devtools@3.0.2)(@layerzerolabs/ua-devtools@5.0.2)(@solana/web3.js@1.98.4)(fp-ts@2.16.11)(zod@3.25.76): + resolution: {integrity: sha512-ovtpI8zfzs05p86lOZFsfb4BHq5SVO6tTDm52tloiGjLNYxOwvHwMea8y74LuPEf7CPw0sROqCOHZst8dN9Q7g==} peerDependencies: - '@layerzerolabs/devtools': ~2.0.0 - '@layerzerolabs/devtools-solana': ~3.0.0 - '@layerzerolabs/io-devtools': ~0.3.0 - '@layerzerolabs/lz-definitions': ^3.0.75 + '@layerzerolabs/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.75 - '@layerzerolabs/protocol-devtools': ^3.0.1 - '@layerzerolabs/ua-devtools': ^5.0.1 + '@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 dependencies: - '@layerzerolabs/devtools': 2.0.3(@ethersproject/bytes@5.8.0)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(zod@3.25.76) - '@layerzerolabs/devtools-solana': 3.0.6(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(@solana/web3.js@1.98.4)(bn.js@5.2.2)(fastestsmallesttextencoderdecoder@1.0.22)(fp-ts@2.16.11)(typescript@5.9.3)(zod@3.25.76) - '@layerzerolabs/io-devtools': 0.3.1(ink-gradient@2.0.0)(ink-table@3.1.0)(ink@3.2.0)(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76) - '@layerzerolabs/lz-definitions': 3.0.142 - '@layerzerolabs/lz-solana-sdk-v2': 3.0.142(fastestsmallesttextencoderdecoder@1.0.22)(got@11.8.6)(typescript@5.9.3) - '@layerzerolabs/lz-v2-utilities': 3.0.142 - '@layerzerolabs/protocol-devtools': 3.0.1(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(zod@3.25.76) - '@layerzerolabs/ua-devtools': 5.0.1(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(@layerzerolabs/lz-v2-utilities@3.0.142)(@layerzerolabs/protocol-devtools@3.0.1)(zod@3.25.76) - '@safe-global/api-kit': 1.3.1 - '@safe-global/protocol-kit': 1.3.0(ethers@5.8.0) + '@layerzerolabs/devtools': 2.0.5(@ethersproject/bytes@5.8.0)(@layerzerolabs/io-devtools@0.3.2)(@layerzerolabs/lz-definitions@3.0.159)(zod@3.25.76) + '@layerzerolabs/devtools-solana': 3.0.7(@layerzerolabs/devtools@2.0.5)(@layerzerolabs/io-devtools@0.3.2)(@layerzerolabs/lz-definitions@3.0.159)(@solana/web3.js@1.98.4)(bn.js@5.2.2)(fastestsmallesttextencoderdecoder@1.0.22)(fp-ts@2.16.11)(typescript@5.9.3)(zod@3.25.76) + '@layerzerolabs/io-devtools': 0.3.2(ink-gradient@2.0.0)(ink-table@3.1.0)(ink@3.2.0)(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76) + '@layerzerolabs/lz-definitions': 3.0.159 + '@layerzerolabs/lz-solana-sdk-v2': 3.0.159(fastestsmallesttextencoderdecoder@1.0.22)(got@11.8.6)(typescript@5.9.3) + '@layerzerolabs/lz-v2-utilities': 3.0.159 + '@layerzerolabs/protocol-devtools': 3.0.2(@layerzerolabs/devtools@2.0.5)(@layerzerolabs/io-devtools@0.3.2)(@layerzerolabs/lz-definitions@3.0.159)(zod@3.25.76) + '@layerzerolabs/ua-devtools': 5.0.2(@layerzerolabs/devtools@2.0.5)(@layerzerolabs/io-devtools@0.3.2)(@layerzerolabs/lz-definitions@3.0.159)(@layerzerolabs/lz-v2-utilities@3.0.159)(@layerzerolabs/protocol-devtools@3.0.2)(zod@3.25.76) '@solana/web3.js': 1.98.4(typescript@5.9.3) - ethers: 5.8.0 fp-ts: 2.16.11 - p-memoize: 4.0.4 zod: 3.25.76 - transitivePeerDependencies: - - bufferutil - - encoding - - supports-color - - utf-8-validate dev: true - /@layerzerolabs/protocol-devtools@3.0.1(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(zod@3.25.76): - resolution: {integrity: sha512-5LndY2OD0PdodEv5IuhSP3RzbThxmE2B8twcrMGuPixrD1PjiIYqLvm2wznUMV/2NLiQrDdY1bOpd+5q9weibw==} + /@layerzerolabs/protocol-devtools@3.0.2(@layerzerolabs/devtools@2.0.5)(@layerzerolabs/io-devtools@0.3.2)(@layerzerolabs/lz-definitions@3.0.159)(zod@3.25.76): + resolution: {integrity: sha512-HFlsMQJTEH7aSxeKtokp4h1bu7u/GkFHy4smBPgcY/OsRQSdtOxXJQzopFcEsikvnfPkpXplnf8IUwJi7YGyNg==} peerDependencies: - '@layerzerolabs/devtools': ~2.0.0 - '@layerzerolabs/io-devtools': ~0.3.0 - '@layerzerolabs/lz-definitions': ^3.0.75 + '@layerzerolabs/devtools': ~2.0.4 + '@layerzerolabs/io-devtools': ~0.3.2 + '@layerzerolabs/lz-definitions': ^3.0.148 zod: ^3.22.4 dependencies: - '@layerzerolabs/devtools': 2.0.3(@ethersproject/bytes@5.8.0)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(zod@3.25.76) - '@layerzerolabs/io-devtools': 0.3.1(ink-gradient@2.0.0)(ink-table@3.1.0)(ink@3.2.0)(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76) - '@layerzerolabs/lz-definitions': 3.0.142 + '@layerzerolabs/devtools': 2.0.5(@ethersproject/bytes@5.8.0)(@layerzerolabs/io-devtools@0.3.2)(@layerzerolabs/lz-definitions@3.0.159)(zod@3.25.76) + '@layerzerolabs/io-devtools': 0.3.2(ink-gradient@2.0.0)(ink-table@3.1.0)(ink@3.2.0)(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76) + '@layerzerolabs/lz-definitions': 3.0.159 zod: 3.25.76 dev: true - /@layerzerolabs/solhint-config@3.0.142(typescript@5.9.3): - resolution: {integrity: sha512-+qqhrFhKPr3MzDKX2mlbp+CL4pE5qqKBxed6SLA9Vow2QX7uEOz8DOAOqRomrS5/R3YNimYCn0nxYWjy5bywlQ==} + /@layerzerolabs/solhint-config@3.0.159(typescript@5.9.3): + resolution: {integrity: sha512-i/eMbax3lsBJe1vjhl9HoexZixZYNeQndDmFCmhp/rhq+5kom54mso/nM5l6QWq8Bj8sgV3HD0WZFiVH4D3YGw==} dependencies: solhint: 4.5.4(typescript@5.9.3) transitivePeerDependencies: - typescript dev: true - /@layerzerolabs/test-devtools-evm-foundry@8.0.0(@layerzerolabs/lz-evm-messagelib-v2@3.0.142)(@layerzerolabs/lz-evm-protocol-v2@3.0.142)(@layerzerolabs/lz-evm-v1-0.7@3.0.142)(@layerzerolabs/oapp-evm@0.4.0)(@layerzerolabs/oft-evm@4.0.0)(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0): - resolution: {integrity: sha512-L32qaCai+mcnz6oSbgkb17kBqvR9HdtvUFIB8dkMnNUTEUfzXC7llqS6cfdtriO9zl7m5JH9q5SQUS1GJ/D4Ig==} + /@layerzerolabs/test-devtools-evm-foundry@8.0.1(@layerzerolabs/lz-evm-messagelib-v2@3.0.159)(@layerzerolabs/lz-evm-protocol-v2@3.0.159)(@layerzerolabs/lz-evm-v1-0.7@3.0.159)(@layerzerolabs/oapp-evm@0.4.1)(@layerzerolabs/oft-evm@4.0.1)(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0): + resolution: {integrity: sha512-oih2mReJJsSjjxFyovcOefgMmHo22f9LocHPuHNV82aGI5Sw+RR+eP6bIOuKPt/8I5cMJfusMJzQJtuvDYQhDg==} peerDependencies: - '@layerzerolabs/lz-evm-messagelib-v2': ^3.0.75 - '@layerzerolabs/lz-evm-protocol-v2': ^3.0.75 - '@layerzerolabs/lz-evm-v1-0.7': ^3.0.75 - '@layerzerolabs/oapp-evm': ^0.4.0 - '@layerzerolabs/oft-evm': ^4.0.0 + '@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 dependencies: - '@layerzerolabs/lz-evm-messagelib-v2': 3.0.142(@axelar-network/axelar-gmp-sdk-solidity@5.10.0)(@chainlink/contracts-ccip@0.7.6)(@eth-optimism/contracts@0.6.0)(@layerzerolabs/lz-evm-protocol-v2@3.0.142)(@layerzerolabs/lz-evm-v1-0.7@3.0.142)(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4)(solidity-bytes-utils@0.8.4) - '@layerzerolabs/lz-evm-protocol-v2': 3.0.142(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4)(solidity-bytes-utils@0.8.4) - '@layerzerolabs/lz-evm-v1-0.7': 3.0.142(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4) - '@layerzerolabs/oapp-evm': 0.4.0(@layerzerolabs/lz-evm-messagelib-v2@3.0.142)(@layerzerolabs/lz-evm-protocol-v2@3.0.142)(@layerzerolabs/lz-evm-v1-0.7@3.0.142)(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0) - '@layerzerolabs/oft-evm': 4.0.0(@layerzerolabs/lz-evm-messagelib-v2@3.0.142)(@layerzerolabs/lz-evm-protocol-v2@3.0.142)(@layerzerolabs/lz-evm-v1-0.7@3.0.142)(@layerzerolabs/oapp-evm@0.4.0)(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0) + '@layerzerolabs/lz-evm-messagelib-v2': 3.0.159(@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.159)(@layerzerolabs/lz-evm-v1-0.7@3.0.159)(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4)(solidity-bytes-utils@0.8.4) + '@layerzerolabs/lz-evm-protocol-v2': 3.0.159(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4)(solidity-bytes-utils@0.8.4) + '@layerzerolabs/lz-evm-v1-0.7': 3.0.159(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0)(hardhat-deploy@0.12.4) + '@layerzerolabs/oapp-evm': 0.4.1(@layerzerolabs/lz-evm-messagelib-v2@3.0.159)(@layerzerolabs/lz-evm-protocol-v2@3.0.159)(@layerzerolabs/lz-evm-v1-0.7@3.0.159)(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0) + '@layerzerolabs/oft-evm': 4.0.1(@layerzerolabs/lz-evm-messagelib-v2@3.0.159)(@layerzerolabs/lz-evm-protocol-v2@3.0.159)(@layerzerolabs/lz-evm-v1-0.7@3.0.159)(@layerzerolabs/oapp-evm@0.4.1)(@openzeppelin/contracts-upgradeable@5.4.0)(@openzeppelin/contracts@5.4.0) '@openzeppelin/contracts': 5.4.0 '@openzeppelin/contracts-upgradeable': 5.4.0(@openzeppelin/contracts@5.4.0) dev: true - /@layerzerolabs/test-devtools-evm-hardhat@0.5.2(hardhat@2.26.4)(solidity-bytes-utils@0.8.4): - resolution: {integrity: sha512-mBZRczjNJdMSsHUjl2EQCCXutS4Yo6s6K0Bc32kSl3MNKIHZZMOEf6Hkj1guVSx/m3l3VZBr+3s0xc9FiyoQgQ==} + /@layerzerolabs/test-devtools-evm-hardhat@0.5.3(hardhat@2.28.5)(solidity-bytes-utils@0.8.4): + resolution: {integrity: sha512-hqtwUAnq3U5I1FPUp0YHLYjEXPjP+8uuLPjG1B6AKGwOWswXE/9mE6CbYTk24fKOQgmgnt33Mem7TiHsSbz4vw==} peerDependencies: hardhat: ^2.22.10 solidity-bytes-utils: ^0.8.2 dependencies: - hardhat: 2.26.4(ts-node@10.9.2)(typescript@5.9.3) + hardhat: 2.28.5(ts-node@10.9.2)(typescript@5.9.3) solidity-bytes-utils: 0.8.4 dev: true @@ -2623,8 +2628,8 @@ packages: resolution: {integrity: sha512-3rC+BVEPgcHLHPO4qn3KqYUG1vhDtr1m/gsaI1S635MK+19475U8HYATznAzHKwi09cf9uEv5C7fdtHXgIw8sQ==} dev: true - /@layerzerolabs/toolbox-hardhat@0.6.12(@ethersproject/abstract-provider@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@ethersproject/bignumber@5.8.0)(@ethersproject/constants@5.8.0)(@ethersproject/providers@5.8.0)(@nomicfoundation/hardhat-ethers@3.1.1)(@nomiclabs/hardhat-ethers@2.2.3)(ethers@5.8.0)(hardhat-deploy@0.12.4)(hardhat@2.26.4)(solidity-bytes-utils@0.8.4): - resolution: {integrity: sha512-vw1bfm8q12ZpQ+k0dB58FFWtHuYmPKPxIb9M6nKkLikgpFWeL3/tLg4sXzr/rNTSGrxR7Ut5IY0FTUVx5lI3HQ==} + /@layerzerolabs/toolbox-hardhat@0.6.13(@ethersproject/abstract-provider@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@ethersproject/bignumber@5.8.0)(@ethersproject/constants@5.8.0)(@ethersproject/providers@5.8.0)(@nomicfoundation/hardhat-ethers@3.1.3)(@nomiclabs/hardhat-ethers@2.2.3)(ethers@5.8.0)(hardhat-deploy@0.12.4)(hardhat@2.28.5)(solidity-bytes-utils@0.8.4)(typescript@5.9.3): + resolution: {integrity: sha512-RDpVqRbRPyDAlGsRVPpN0UdDVUfYkXq2qFIqkDxgIpNbWxwXPE0dJgC8D/O/gXxGMYUmljk2huNh9btWgU28bw==} peerDependencies: '@nomicfoundation/hardhat-ethers': ^3.0.2 ethers: ^5.7.2 @@ -2636,24 +2641,24 @@ packages: '@ethersproject/bytes': 5.8.0 '@ethersproject/contracts': 5.8.0 '@ethersproject/hash': 5.8.0 - '@layerzerolabs/devtools': 2.0.3(@ethersproject/bytes@5.8.0)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(zod@3.25.76) - '@layerzerolabs/devtools-evm': 3.0.0(@ethersproject/abi@5.8.0)(@ethersproject/abstract-provider@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@ethersproject/address@5.7.0)(@ethersproject/bignumber@5.8.0)(@ethersproject/constants@5.8.0)(@ethersproject/contracts@5.8.0)(@ethersproject/providers@5.8.0)(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(fp-ts@2.16.11)(zod@3.25.76) - '@layerzerolabs/devtools-evm-hardhat': 4.0.1(@ethersproject/abi@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@ethersproject/contracts@5.8.0)(@ethersproject/providers@5.8.0)(@layerzerolabs/devtools-evm@3.0.0)(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(@nomiclabs/hardhat-ethers@2.2.3)(ethers@5.8.0)(fp-ts@2.16.11)(hardhat-deploy@0.12.4)(hardhat@2.26.4) - '@layerzerolabs/io-devtools': 0.3.1(ink-gradient@2.0.0)(ink-table@3.1.0)(ink@3.2.0)(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76) - '@layerzerolabs/lz-definitions': 3.0.142 - '@layerzerolabs/lz-evm-sdk-v1': 3.0.142 - '@layerzerolabs/lz-evm-sdk-v2': 3.0.142 - '@layerzerolabs/lz-v2-utilities': 3.0.142 - '@layerzerolabs/protocol-devtools': 3.0.1(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(zod@3.25.76) - '@layerzerolabs/protocol-devtools-evm': 5.0.1(@ethersproject/abstract-provider@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@ethersproject/bignumber@5.8.0)(@ethersproject/constants@5.8.0)(@ethersproject/contracts@5.8.0)(@ethersproject/providers@5.8.0)(@layerzerolabs/devtools-evm@3.0.0)(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(@layerzerolabs/protocol-devtools@3.0.1)(zod@3.25.76) - '@layerzerolabs/test-devtools-evm-hardhat': 0.5.2(hardhat@2.26.4)(solidity-bytes-utils@0.8.4) - '@layerzerolabs/ua-devtools': 5.0.1(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(@layerzerolabs/lz-v2-utilities@3.0.142)(@layerzerolabs/protocol-devtools@3.0.1)(zod@3.25.76) - '@layerzerolabs/ua-devtools-evm': 7.0.0(@ethersproject/constants@5.8.0)(@ethersproject/contracts@5.8.0)(@layerzerolabs/devtools-evm@3.0.0)(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(@layerzerolabs/lz-v2-utilities@3.0.142)(@layerzerolabs/protocol-devtools-evm@5.0.1)(@layerzerolabs/protocol-devtools@3.0.1)(@layerzerolabs/ua-devtools@5.0.1)(zod@3.25.76) - '@layerzerolabs/ua-devtools-evm-hardhat': 9.0.0(@ethersproject/abi@5.8.0)(@ethersproject/bytes@5.8.0)(@ethersproject/contracts@5.8.0)(@ethersproject/hash@5.8.0)(@layerzerolabs/devtools-evm-hardhat@4.0.1)(@layerzerolabs/devtools-evm@3.0.0)(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(@layerzerolabs/protocol-devtools-evm@5.0.1)(@layerzerolabs/protocol-devtools@3.0.1)(@layerzerolabs/ua-devtools-evm@7.0.0)(@layerzerolabs/ua-devtools@5.0.1)(ethers@5.8.0)(hardhat-deploy@0.12.4)(hardhat@2.26.4) - '@nomicfoundation/hardhat-ethers': 3.1.1(ethers@5.8.0)(hardhat@2.26.4) + '@layerzerolabs/devtools': 2.0.5(@ethersproject/bytes@5.8.0)(@layerzerolabs/io-devtools@0.3.2)(@layerzerolabs/lz-definitions@3.0.159)(zod@3.25.76) + '@layerzerolabs/devtools-evm': 3.0.2(@ethersproject/abi@5.8.0)(@ethersproject/abstract-provider@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@ethersproject/address@5.7.0)(@ethersproject/bignumber@5.8.0)(@ethersproject/constants@5.8.0)(@ethersproject/contracts@5.8.0)(@ethersproject/providers@5.8.0)(@layerzerolabs/devtools@2.0.5)(@layerzerolabs/io-devtools@0.3.2)(@layerzerolabs/lz-definitions@3.0.159)(fp-ts@2.16.11)(typescript@5.9.3)(zod@3.25.76) + '@layerzerolabs/devtools-evm-hardhat': 4.0.4(@ethersproject/abi@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@ethersproject/contracts@5.8.0)(@ethersproject/providers@5.8.0)(@layerzerolabs/devtools-evm@3.0.2)(@layerzerolabs/devtools@2.0.5)(@layerzerolabs/io-devtools@0.3.2)(@layerzerolabs/lz-definitions@3.0.159)(@nomiclabs/hardhat-ethers@2.2.3)(ethers@5.8.0)(fp-ts@2.16.11)(hardhat-deploy@0.12.4)(hardhat@2.28.5) + '@layerzerolabs/io-devtools': 0.3.2(ink-gradient@2.0.0)(ink-table@3.1.0)(ink@3.2.0)(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76) + '@layerzerolabs/lz-definitions': 3.0.159 + '@layerzerolabs/lz-evm-sdk-v1': 3.0.159 + '@layerzerolabs/lz-evm-sdk-v2': 3.0.159 + '@layerzerolabs/lz-v2-utilities': 3.0.159 + '@layerzerolabs/protocol-devtools': 3.0.2(@layerzerolabs/devtools@2.0.5)(@layerzerolabs/io-devtools@0.3.2)(@layerzerolabs/lz-definitions@3.0.159)(zod@3.25.76) + '@layerzerolabs/protocol-devtools-evm': 5.0.2(@ethersproject/abstract-provider@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@ethersproject/bignumber@5.8.0)(@ethersproject/constants@5.8.0)(@ethersproject/contracts@5.8.0)(@ethersproject/providers@5.8.0)(@layerzerolabs/devtools-evm@3.0.2)(@layerzerolabs/devtools@2.0.5)(@layerzerolabs/io-devtools@0.3.2)(@layerzerolabs/lz-definitions@3.0.159)(@layerzerolabs/protocol-devtools@3.0.2)(zod@3.25.76) + '@layerzerolabs/test-devtools-evm-hardhat': 0.5.3(hardhat@2.28.5)(solidity-bytes-utils@0.8.4) + '@layerzerolabs/ua-devtools': 5.0.2(@layerzerolabs/devtools@2.0.5)(@layerzerolabs/io-devtools@0.3.2)(@layerzerolabs/lz-definitions@3.0.159)(@layerzerolabs/lz-v2-utilities@3.0.159)(@layerzerolabs/protocol-devtools@3.0.2)(zod@3.25.76) + '@layerzerolabs/ua-devtools-evm': 7.0.1(@ethersproject/constants@5.8.0)(@ethersproject/contracts@5.8.0)(@layerzerolabs/devtools-evm@3.0.2)(@layerzerolabs/devtools@2.0.5)(@layerzerolabs/io-devtools@0.3.2)(@layerzerolabs/lz-definitions@3.0.159)(@layerzerolabs/lz-v2-utilities@3.0.159)(@layerzerolabs/protocol-devtools-evm@5.0.2)(@layerzerolabs/protocol-devtools@3.0.2)(@layerzerolabs/ua-devtools@5.0.2)(zod@3.25.76) + '@layerzerolabs/ua-devtools-evm-hardhat': 9.0.2(@ethersproject/abi@5.8.0)(@ethersproject/bytes@5.8.0)(@ethersproject/contracts@5.8.0)(@ethersproject/hash@5.8.0)(@layerzerolabs/devtools-evm-hardhat@4.0.4)(@layerzerolabs/devtools-evm@3.0.2)(@layerzerolabs/devtools@2.0.5)(@layerzerolabs/io-devtools@0.3.2)(@layerzerolabs/lz-definitions@3.0.159)(@layerzerolabs/protocol-devtools-evm@5.0.2)(@layerzerolabs/protocol-devtools@3.0.2)(@layerzerolabs/ua-devtools-evm@7.0.1)(@layerzerolabs/ua-devtools@5.0.2)(ethers@5.8.0)(hardhat-deploy@0.12.4)(hardhat@2.28.5) + '@nomicfoundation/hardhat-ethers': 3.1.3(ethers@5.8.0)(hardhat@2.28.5) ethers: 5.8.0 fp-ts: 2.16.11 - hardhat: 2.26.4(ts-node@10.9.2)(typescript@5.9.3) + hardhat: 2.28.5(ts-node@10.9.2)(typescript@5.9.3) hardhat-deploy: 0.12.4 ink: 3.2.0(react@17.0.2) ink-gradient: 2.0.0(ink@3.2.0)(react@17.0.2) @@ -2673,13 +2678,14 @@ packages: - encoding - solidity-bytes-utils - supports-color + - typescript - utf-8-validate dev: true - /@layerzerolabs/tron-utilities@3.0.142(got@11.8.6)(typescript@5.9.3): - resolution: {integrity: sha512-Fk/8CKd6GNGS51XEYXmqvsmy3zSM/xyHLJ/MDrKKHj/YA3qEPlQa7fy0SSAEAVm8ukNj/4ITdFLRXPlIyA7idQ==} + /@layerzerolabs/tron-utilities@3.0.159(got@11.8.6)(typescript@5.9.3): + resolution: {integrity: sha512-1gSITRYdg2lBcCFrxjnEXyG8RSuwJl4SQ7TSlpiqfty/lbtg6czlPN2FW8juCiTlDZj7ny/MYB9t0Hljz2md2w==} dependencies: - '@layerzerolabs/lz-utilities': 3.0.142(got@11.8.6)(typescript@5.9.3) + '@layerzerolabs/lz-utilities': 3.0.159(got@11.8.6)(typescript@5.9.3) ethers: 5.8.0 tronweb: 5.3.4 transitivePeerDependencies: @@ -2693,22 +2699,22 @@ packages: - utf-8-validate dev: true - /@layerzerolabs/ua-devtools-evm-hardhat@9.0.0(@ethersproject/abi@5.8.0)(@ethersproject/bytes@5.8.0)(@ethersproject/contracts@5.8.0)(@ethersproject/hash@5.8.0)(@layerzerolabs/devtools-evm-hardhat@4.0.1)(@layerzerolabs/devtools-evm@3.0.0)(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(@layerzerolabs/protocol-devtools-evm@5.0.1)(@layerzerolabs/protocol-devtools@3.0.1)(@layerzerolabs/ua-devtools-evm@7.0.0)(@layerzerolabs/ua-devtools@5.0.1)(ethers@5.8.0)(hardhat-deploy@0.12.4)(hardhat@2.26.4): - resolution: {integrity: sha512-Wm/88JToOgFAJO0nKnpGMxQDD8mN37VFhz/ejE0DWbXsukp7IdX4ld4gQKM0MU7Yiajardhlvpa3Mwg+xHi8KQ==} + /@layerzerolabs/ua-devtools-evm-hardhat@9.0.2(@ethersproject/abi@5.8.0)(@ethersproject/bytes@5.8.0)(@ethersproject/contracts@5.8.0)(@ethersproject/hash@5.8.0)(@layerzerolabs/devtools-evm-hardhat@4.0.4)(@layerzerolabs/devtools-evm@3.0.2)(@layerzerolabs/devtools@2.0.5)(@layerzerolabs/io-devtools@0.3.2)(@layerzerolabs/lz-definitions@3.0.159)(@layerzerolabs/protocol-devtools-evm@5.0.2)(@layerzerolabs/protocol-devtools@3.0.2)(@layerzerolabs/ua-devtools-evm@7.0.1)(@layerzerolabs/ua-devtools@5.0.2)(ethers@5.8.0)(hardhat-deploy@0.12.4)(hardhat@2.28.5): + 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.0 - '@layerzerolabs/devtools-evm': ~3.0.0 - '@layerzerolabs/devtools-evm-hardhat': ~4.0.0 - '@layerzerolabs/io-devtools': ~0.3.0 - '@layerzerolabs/lz-definitions': ^3.0.75 - '@layerzerolabs/protocol-devtools': ~3.0.0 - '@layerzerolabs/protocol-devtools-evm': ~5.0.0 - '@layerzerolabs/ua-devtools': ~5.0.0 - '@layerzerolabs/ua-devtools-evm': ~7.0.0 + '@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 @@ -2717,152 +2723,144 @@ packages: '@ethersproject/bytes': 5.8.0 '@ethersproject/contracts': 5.8.0 '@ethersproject/hash': 5.8.0 - '@layerzerolabs/devtools': 2.0.3(@ethersproject/bytes@5.8.0)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(zod@3.25.76) - '@layerzerolabs/devtools-evm': 3.0.0(@ethersproject/abi@5.8.0)(@ethersproject/abstract-provider@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@ethersproject/address@5.7.0)(@ethersproject/bignumber@5.8.0)(@ethersproject/constants@5.8.0)(@ethersproject/contracts@5.8.0)(@ethersproject/providers@5.8.0)(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(fp-ts@2.16.11)(zod@3.25.76) - '@layerzerolabs/devtools-evm-hardhat': 4.0.1(@ethersproject/abi@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@ethersproject/contracts@5.8.0)(@ethersproject/providers@5.8.0)(@layerzerolabs/devtools-evm@3.0.0)(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(@nomiclabs/hardhat-ethers@2.2.3)(ethers@5.8.0)(fp-ts@2.16.11)(hardhat-deploy@0.12.4)(hardhat@2.26.4) - '@layerzerolabs/io-devtools': 0.3.1(ink-gradient@2.0.0)(ink-table@3.1.0)(ink@3.2.0)(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76) - '@layerzerolabs/lz-definitions': 3.0.142 - '@layerzerolabs/protocol-devtools': 3.0.1(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(zod@3.25.76) - '@layerzerolabs/protocol-devtools-evm': 5.0.1(@ethersproject/abstract-provider@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@ethersproject/bignumber@5.8.0)(@ethersproject/constants@5.8.0)(@ethersproject/contracts@5.8.0)(@ethersproject/providers@5.8.0)(@layerzerolabs/devtools-evm@3.0.0)(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(@layerzerolabs/protocol-devtools@3.0.1)(zod@3.25.76) - '@layerzerolabs/ua-devtools': 5.0.1(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(@layerzerolabs/lz-v2-utilities@3.0.142)(@layerzerolabs/protocol-devtools@3.0.1)(zod@3.25.76) - '@layerzerolabs/ua-devtools-evm': 7.0.0(@ethersproject/constants@5.8.0)(@ethersproject/contracts@5.8.0)(@layerzerolabs/devtools-evm@3.0.0)(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(@layerzerolabs/lz-v2-utilities@3.0.142)(@layerzerolabs/protocol-devtools-evm@5.0.1)(@layerzerolabs/protocol-devtools@3.0.1)(@layerzerolabs/ua-devtools@5.0.1)(zod@3.25.76) + '@layerzerolabs/devtools': 2.0.5(@ethersproject/bytes@5.8.0)(@layerzerolabs/io-devtools@0.3.2)(@layerzerolabs/lz-definitions@3.0.159)(zod@3.25.76) + '@layerzerolabs/devtools-evm': 3.0.2(@ethersproject/abi@5.8.0)(@ethersproject/abstract-provider@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@ethersproject/address@5.7.0)(@ethersproject/bignumber@5.8.0)(@ethersproject/constants@5.8.0)(@ethersproject/contracts@5.8.0)(@ethersproject/providers@5.8.0)(@layerzerolabs/devtools@2.0.5)(@layerzerolabs/io-devtools@0.3.2)(@layerzerolabs/lz-definitions@3.0.159)(fp-ts@2.16.11)(typescript@5.9.3)(zod@3.25.76) + '@layerzerolabs/devtools-evm-hardhat': 4.0.4(@ethersproject/abi@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@ethersproject/contracts@5.8.0)(@ethersproject/providers@5.8.0)(@layerzerolabs/devtools-evm@3.0.2)(@layerzerolabs/devtools@2.0.5)(@layerzerolabs/io-devtools@0.3.2)(@layerzerolabs/lz-definitions@3.0.159)(@nomiclabs/hardhat-ethers@2.2.3)(ethers@5.8.0)(fp-ts@2.16.11)(hardhat-deploy@0.12.4)(hardhat@2.28.5) + '@layerzerolabs/io-devtools': 0.3.2(ink-gradient@2.0.0)(ink-table@3.1.0)(ink@3.2.0)(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76) + '@layerzerolabs/lz-definitions': 3.0.159 + '@layerzerolabs/protocol-devtools': 3.0.2(@layerzerolabs/devtools@2.0.5)(@layerzerolabs/io-devtools@0.3.2)(@layerzerolabs/lz-definitions@3.0.159)(zod@3.25.76) + '@layerzerolabs/protocol-devtools-evm': 5.0.2(@ethersproject/abstract-provider@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@ethersproject/bignumber@5.8.0)(@ethersproject/constants@5.8.0)(@ethersproject/contracts@5.8.0)(@ethersproject/providers@5.8.0)(@layerzerolabs/devtools-evm@3.0.2)(@layerzerolabs/devtools@2.0.5)(@layerzerolabs/io-devtools@0.3.2)(@layerzerolabs/lz-definitions@3.0.159)(@layerzerolabs/protocol-devtools@3.0.2)(zod@3.25.76) + '@layerzerolabs/ua-devtools': 5.0.2(@layerzerolabs/devtools@2.0.5)(@layerzerolabs/io-devtools@0.3.2)(@layerzerolabs/lz-definitions@3.0.159)(@layerzerolabs/lz-v2-utilities@3.0.159)(@layerzerolabs/protocol-devtools@3.0.2)(zod@3.25.76) + '@layerzerolabs/ua-devtools-evm': 7.0.1(@ethersproject/constants@5.8.0)(@ethersproject/contracts@5.8.0)(@layerzerolabs/devtools-evm@3.0.2)(@layerzerolabs/devtools@2.0.5)(@layerzerolabs/io-devtools@0.3.2)(@layerzerolabs/lz-definitions@3.0.159)(@layerzerolabs/lz-v2-utilities@3.0.159)(@layerzerolabs/protocol-devtools-evm@5.0.2)(@layerzerolabs/protocol-devtools@3.0.2)(@layerzerolabs/ua-devtools@5.0.2)(zod@3.25.76) ethers: 5.8.0 - hardhat: 2.26.4(ts-node@10.9.2)(typescript@5.9.3) + hardhat: 2.28.5(ts-node@10.9.2)(typescript@5.9.3) hardhat-deploy: 0.12.4 p-memoize: 4.0.4 typescript: 5.9.3 dev: true - /@layerzerolabs/ua-devtools-evm@7.0.0(@ethersproject/constants@5.8.0)(@ethersproject/contracts@5.8.0)(@layerzerolabs/devtools-evm@3.0.0)(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(@layerzerolabs/lz-v2-utilities@3.0.142)(@layerzerolabs/protocol-devtools-evm@5.0.1)(@layerzerolabs/protocol-devtools@3.0.1)(@layerzerolabs/ua-devtools@5.0.1)(zod@3.25.76): - resolution: {integrity: sha512-FPm6ESqm2SBOJjCbRnkWCMg6o5zlkoeLUavD8v1hlZeiY4i33wIHccQPtxMz8Yz/ZD8leQ8TiKJJJ9sdVGk7tQ==} + /@layerzerolabs/ua-devtools-evm@7.0.1(@ethersproject/constants@5.8.0)(@ethersproject/contracts@5.8.0)(@layerzerolabs/devtools-evm@3.0.2)(@layerzerolabs/devtools@2.0.5)(@layerzerolabs/io-devtools@0.3.2)(@layerzerolabs/lz-definitions@3.0.159)(@layerzerolabs/lz-v2-utilities@3.0.159)(@layerzerolabs/protocol-devtools-evm@5.0.2)(@layerzerolabs/protocol-devtools@3.0.2)(@layerzerolabs/ua-devtools@5.0.2)(zod@3.25.76): + resolution: {integrity: sha512-YOZ2E2NCJrn/+wFXVPEb77US6OQ+gL3hThQK0xj+CFeATlXlPyDtMVg6dq5EHrY9luCClbf1WE2Iz/I0Tt2EvA==} peerDependencies: '@ethersproject/constants': ^5.7.0 '@ethersproject/contracts': ^5.7.0 - '@layerzerolabs/devtools': ~2.0.0 - '@layerzerolabs/devtools-evm': ~3.0.0 - '@layerzerolabs/io-devtools': ~0.3.0 - '@layerzerolabs/lz-definitions': ^3.0.75 - '@layerzerolabs/lz-v2-utilities': ^3.0.75 - '@layerzerolabs/protocol-devtools': ~3.0.0 - '@layerzerolabs/protocol-devtools-evm': ~5.0.0 - '@layerzerolabs/ua-devtools': ~5.0.0 + '@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 dependencies: '@ethersproject/constants': 5.8.0 '@ethersproject/contracts': 5.8.0 - '@layerzerolabs/devtools': 2.0.3(@ethersproject/bytes@5.8.0)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(zod@3.25.76) - '@layerzerolabs/devtools-evm': 3.0.0(@ethersproject/abi@5.8.0)(@ethersproject/abstract-provider@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@ethersproject/address@5.7.0)(@ethersproject/bignumber@5.8.0)(@ethersproject/constants@5.8.0)(@ethersproject/contracts@5.8.0)(@ethersproject/providers@5.8.0)(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(fp-ts@2.16.11)(zod@3.25.76) - '@layerzerolabs/io-devtools': 0.3.1(ink-gradient@2.0.0)(ink-table@3.1.0)(ink@3.2.0)(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76) - '@layerzerolabs/lz-definitions': 3.0.142 - '@layerzerolabs/lz-v2-utilities': 3.0.142 - '@layerzerolabs/protocol-devtools': 3.0.1(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(zod@3.25.76) - '@layerzerolabs/protocol-devtools-evm': 5.0.1(@ethersproject/abstract-provider@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@ethersproject/bignumber@5.8.0)(@ethersproject/constants@5.8.0)(@ethersproject/contracts@5.8.0)(@ethersproject/providers@5.8.0)(@layerzerolabs/devtools-evm@3.0.0)(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(@layerzerolabs/protocol-devtools@3.0.1)(zod@3.25.76) - '@layerzerolabs/ua-devtools': 5.0.1(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(@layerzerolabs/lz-v2-utilities@3.0.142)(@layerzerolabs/protocol-devtools@3.0.1)(zod@3.25.76) + '@layerzerolabs/devtools': 2.0.5(@ethersproject/bytes@5.8.0)(@layerzerolabs/io-devtools@0.3.2)(@layerzerolabs/lz-definitions@3.0.159)(zod@3.25.76) + '@layerzerolabs/devtools-evm': 3.0.2(@ethersproject/abi@5.8.0)(@ethersproject/abstract-provider@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@ethersproject/address@5.7.0)(@ethersproject/bignumber@5.8.0)(@ethersproject/constants@5.8.0)(@ethersproject/contracts@5.8.0)(@ethersproject/providers@5.8.0)(@layerzerolabs/devtools@2.0.5)(@layerzerolabs/io-devtools@0.3.2)(@layerzerolabs/lz-definitions@3.0.159)(fp-ts@2.16.11)(typescript@5.9.3)(zod@3.25.76) + '@layerzerolabs/io-devtools': 0.3.2(ink-gradient@2.0.0)(ink-table@3.1.0)(ink@3.2.0)(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76) + '@layerzerolabs/lz-definitions': 3.0.159 + '@layerzerolabs/lz-v2-utilities': 3.0.159 + '@layerzerolabs/protocol-devtools': 3.0.2(@layerzerolabs/devtools@2.0.5)(@layerzerolabs/io-devtools@0.3.2)(@layerzerolabs/lz-definitions@3.0.159)(zod@3.25.76) + '@layerzerolabs/protocol-devtools-evm': 5.0.2(@ethersproject/abstract-provider@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@ethersproject/bignumber@5.8.0)(@ethersproject/constants@5.8.0)(@ethersproject/contracts@5.8.0)(@ethersproject/providers@5.8.0)(@layerzerolabs/devtools-evm@3.0.2)(@layerzerolabs/devtools@2.0.5)(@layerzerolabs/io-devtools@0.3.2)(@layerzerolabs/lz-definitions@3.0.159)(@layerzerolabs/protocol-devtools@3.0.2)(zod@3.25.76) + '@layerzerolabs/ua-devtools': 5.0.2(@layerzerolabs/devtools@2.0.5)(@layerzerolabs/io-devtools@0.3.2)(@layerzerolabs/lz-definitions@3.0.159)(@layerzerolabs/lz-v2-utilities@3.0.159)(@layerzerolabs/protocol-devtools@3.0.2)(zod@3.25.76) p-memoize: 4.0.4 zod: 3.25.76 dev: true - /@layerzerolabs/ua-devtools-solana@8.0.2(@layerzerolabs/devtools-solana@3.0.6)(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(@layerzerolabs/lz-solana-sdk-v2@3.0.142)(@layerzerolabs/lz-v2-utilities@3.0.142)(@layerzerolabs/oft-v2-solana-sdk@3.0.142)(@layerzerolabs/protocol-devtools-solana@8.0.3)(@layerzerolabs/protocol-devtools@3.0.1)(@layerzerolabs/ua-devtools@5.0.1)(@solana/web3.js@1.98.4)(fp-ts@2.16.11)(zod@3.25.76): - resolution: {integrity: sha512-S1uiwLKJZQ87h9V51w1gTDgnMXtq45zHxO5xJ7XUIM7B+NoOX2arZB3cWerwocjAwloKHYBUxmWp8/vhJODkeg==} + /@layerzerolabs/ua-devtools-solana@8.0.7(@layerzerolabs/devtools-solana@3.0.7)(@layerzerolabs/devtools@2.0.5)(@layerzerolabs/io-devtools@0.3.2)(@layerzerolabs/lz-definitions@3.0.159)(@layerzerolabs/lz-solana-sdk-v2@3.0.159)(@layerzerolabs/lz-v2-utilities@3.0.159)(@layerzerolabs/oft-v2-solana-sdk@3.0.159)(@layerzerolabs/protocol-devtools-solana@8.0.6)(@layerzerolabs/protocol-devtools@3.0.2)(@layerzerolabs/ua-devtools@5.0.2)(@solana/web3.js@1.98.4)(fp-ts@2.16.11)(zod@3.25.76): + resolution: {integrity: sha512-3qdsZhzX9Kf6WlxcJvlCFbh6Lh90ucL4kYUvsDYtGgiHR/DyZ/DXO1sJY2dPwvarBFD0SN90xd+y4OdOcXlaHQ==} peerDependencies: - '@layerzerolabs/devtools': ~2.0.0 - '@layerzerolabs/devtools-solana': ~3.0.1 - '@layerzerolabs/io-devtools': ~0.3.0 - '@layerzerolabs/lz-definitions': ^3.0.75 + '@layerzerolabs/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.75 + '@layerzerolabs/lz-v2-utilities': ^3.0.148 '@layerzerolabs/oft-v2-solana-sdk': ^3.0.59 - '@layerzerolabs/protocol-devtools': ^3.0.0 - '@layerzerolabs/protocol-devtools-solana': ~8.0.1 - '@layerzerolabs/ua-devtools': ^5.0.0 + '@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 dependencies: - '@layerzerolabs/devtools': 2.0.3(@ethersproject/bytes@5.8.0)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(zod@3.25.76) - '@layerzerolabs/devtools-solana': 3.0.6(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(@solana/web3.js@1.98.4)(bn.js@5.2.2)(fastestsmallesttextencoderdecoder@1.0.22)(fp-ts@2.16.11)(typescript@5.9.3)(zod@3.25.76) - '@layerzerolabs/io-devtools': 0.3.1(ink-gradient@2.0.0)(ink-table@3.1.0)(ink@3.2.0)(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76) - '@layerzerolabs/lz-definitions': 3.0.142 - '@layerzerolabs/lz-solana-sdk-v2': 3.0.142(fastestsmallesttextencoderdecoder@1.0.22)(got@11.8.6)(typescript@5.9.3) - '@layerzerolabs/lz-v2-utilities': 3.0.142 - '@layerzerolabs/oft-v2-solana-sdk': 3.0.142(fastestsmallesttextencoderdecoder@1.0.22)(got@11.8.6)(typescript@5.9.3) - '@layerzerolabs/protocol-devtools': 3.0.1(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(zod@3.25.76) - '@layerzerolabs/protocol-devtools-solana': 8.0.3(@layerzerolabs/devtools-solana@3.0.6)(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(@layerzerolabs/lz-solana-sdk-v2@3.0.142)(@layerzerolabs/lz-v2-utilities@3.0.142)(@layerzerolabs/protocol-devtools@3.0.1)(@layerzerolabs/ua-devtools@5.0.1)(@solana/web3.js@1.98.4)(fp-ts@2.16.11)(zod@3.25.76) - '@layerzerolabs/ua-devtools': 5.0.1(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(@layerzerolabs/lz-v2-utilities@3.0.142)(@layerzerolabs/protocol-devtools@3.0.1)(zod@3.25.76) - '@safe-global/api-kit': 1.3.1 - '@safe-global/protocol-kit': 1.3.0(ethers@5.8.0) + '@layerzerolabs/devtools': 2.0.5(@ethersproject/bytes@5.8.0)(@layerzerolabs/io-devtools@0.3.2)(@layerzerolabs/lz-definitions@3.0.159)(zod@3.25.76) + '@layerzerolabs/devtools-solana': 3.0.7(@layerzerolabs/devtools@2.0.5)(@layerzerolabs/io-devtools@0.3.2)(@layerzerolabs/lz-definitions@3.0.159)(@solana/web3.js@1.98.4)(bn.js@5.2.2)(fastestsmallesttextencoderdecoder@1.0.22)(fp-ts@2.16.11)(typescript@5.9.3)(zod@3.25.76) + '@layerzerolabs/io-devtools': 0.3.2(ink-gradient@2.0.0)(ink-table@3.1.0)(ink@3.2.0)(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76) + '@layerzerolabs/lz-definitions': 3.0.159 + '@layerzerolabs/lz-solana-sdk-v2': 3.0.159(fastestsmallesttextencoderdecoder@1.0.22)(got@11.8.6)(typescript@5.9.3) + '@layerzerolabs/lz-v2-utilities': 3.0.159 + '@layerzerolabs/oft-v2-solana-sdk': 3.0.159(fastestsmallesttextencoderdecoder@1.0.22)(got@11.8.6)(typescript@5.9.3) + '@layerzerolabs/protocol-devtools': 3.0.2(@layerzerolabs/devtools@2.0.5)(@layerzerolabs/io-devtools@0.3.2)(@layerzerolabs/lz-definitions@3.0.159)(zod@3.25.76) + '@layerzerolabs/protocol-devtools-solana': 8.0.6(@layerzerolabs/devtools-solana@3.0.7)(@layerzerolabs/devtools@2.0.5)(@layerzerolabs/io-devtools@0.3.2)(@layerzerolabs/lz-definitions@3.0.159)(@layerzerolabs/lz-solana-sdk-v2@3.0.159)(@layerzerolabs/lz-v2-utilities@3.0.159)(@layerzerolabs/protocol-devtools@3.0.2)(@layerzerolabs/ua-devtools@5.0.2)(@solana/web3.js@1.98.4)(fp-ts@2.16.11)(zod@3.25.76) + '@layerzerolabs/ua-devtools': 5.0.2(@layerzerolabs/devtools@2.0.5)(@layerzerolabs/io-devtools@0.3.2)(@layerzerolabs/lz-definitions@3.0.159)(@layerzerolabs/lz-v2-utilities@3.0.159)(@layerzerolabs/protocol-devtools@3.0.2)(zod@3.25.76) '@solana/web3.js': 1.98.4(typescript@5.9.3) - ethers: 5.8.0 fp-ts: 2.16.11 p-memoize: 4.0.4 zod: 3.25.76 - transitivePeerDependencies: - - bufferutil - - encoding - - supports-color - - utf-8-validate dev: true - /@layerzerolabs/ua-devtools@5.0.1(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(@layerzerolabs/lz-v2-utilities@3.0.142)(@layerzerolabs/protocol-devtools@3.0.1)(zod@3.25.76): - resolution: {integrity: sha512-acoxyJAYqF+di2/akGuWLa5Gdt7Z/8LLZD0LqOui34yjPuHYH88L4xxmKxqrs4Ga/uQnRKcF6Cauy9pjlQCj1A==} + /@layerzerolabs/ua-devtools@5.0.2(@layerzerolabs/devtools@2.0.5)(@layerzerolabs/io-devtools@0.3.2)(@layerzerolabs/lz-definitions@3.0.159)(@layerzerolabs/lz-v2-utilities@3.0.159)(@layerzerolabs/protocol-devtools@3.0.2)(zod@3.25.76): + resolution: {integrity: sha512-CxYSKblpzb17z2lR+kZrLMz6LCE2CpML/Ypyi7MZoS0RCr8vTWZrHacRKbtNSwzjIJFUEHFxlktjfPeTlnMSAQ==} peerDependencies: - '@layerzerolabs/devtools': ~2.0.0 - '@layerzerolabs/io-devtools': ~0.3.0 - '@layerzerolabs/lz-definitions': ^3.0.75 - '@layerzerolabs/lz-v2-utilities': ^3.0.75 - '@layerzerolabs/protocol-devtools': ~3.0.1 + '@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 dependencies: - '@layerzerolabs/devtools': 2.0.3(@ethersproject/bytes@5.8.0)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(zod@3.25.76) - '@layerzerolabs/io-devtools': 0.3.1(ink-gradient@2.0.0)(ink-table@3.1.0)(ink@3.2.0)(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76) - '@layerzerolabs/lz-definitions': 3.0.142 - '@layerzerolabs/lz-v2-utilities': 3.0.142 - '@layerzerolabs/protocol-devtools': 3.0.1(@layerzerolabs/devtools@2.0.3)(@layerzerolabs/io-devtools@0.3.1)(@layerzerolabs/lz-definitions@3.0.142)(zod@3.25.76) + '@layerzerolabs/devtools': 2.0.5(@ethersproject/bytes@5.8.0)(@layerzerolabs/io-devtools@0.3.2)(@layerzerolabs/lz-definitions@3.0.159)(zod@3.25.76) + '@layerzerolabs/io-devtools': 0.3.2(ink-gradient@2.0.0)(ink-table@3.1.0)(ink@3.2.0)(react@17.0.2)(yoga-layout-prebuilt@1.10.0)(zod@3.25.76) + '@layerzerolabs/lz-definitions': 3.0.159 + '@layerzerolabs/lz-v2-utilities': 3.0.159 + '@layerzerolabs/protocol-devtools': 3.0.2(@layerzerolabs/devtools@2.0.5)(@layerzerolabs/io-devtools@0.3.2)(@layerzerolabs/lz-definitions@3.0.159)(zod@3.25.76) zod: 3.25.76 dev: true - /@ledgerhq/devices@8.6.1: - resolution: {integrity: sha512-PQR2fyWz7P/wMFHY9ZLz17WgFdxC/Im0RVDcWXpp24+iRQRyxhQeX2iG4mBKUzfaAW6pOIEiWt+vmJh88QP9rQ==} + /@ledgerhq/devices@8.10.0: + resolution: {integrity: sha512-ytT66KI8MizFX6dGJKthOzPDw5uNRmmg+RaMta62jbFePKYqfXtYTp6Wc0ErTXaL8nFS3IujHENwKthPmsj6jw==} dependencies: - '@ledgerhq/errors': 6.26.0 - '@ledgerhq/logs': 6.13.0 + '@ledgerhq/errors': 6.29.0 + '@ledgerhq/logs': 6.14.0 rxjs: 7.8.2 semver: 7.7.3 dev: true - /@ledgerhq/errors@6.26.0: - resolution: {integrity: sha512-4OlisaDBafkn7KN5emue08lCGMVREX6T+nxj47C7W30EBA/leLAEDaVvUw5/gFOWrv8Q2A9Scb8aMM3uokyt0w==} + /@ledgerhq/errors@6.29.0: + resolution: {integrity: sha512-mmDsGN662zd0XGKyjzSKkg+5o1/l9pvV1HkVHtbzaydvHAtRypghmVoWMY9XAQDLXiUBXGIsLal84NgmGeuKWA==} dev: true - /@ledgerhq/hw-transport-webhid@6.30.8: - resolution: {integrity: sha512-2Hc15GjC7BFrpMVJYJ7N2p70A6OzIdcMklwUEYpOcIVYbEWWj84+M5E5pc83ZIBc5j3C8rdtjncPCm2ExGx2LQ==} + /@ledgerhq/hw-transport-webhid@6.31.0: + resolution: {integrity: sha512-XtCFOJ1ooaqCefB6WDfV/ie+GaO/7xQgezwRpyLroMBYboSpnEd3Diu3BAoptXKTNklwZEiUVRLVXlltTBzNvw==} dependencies: - '@ledgerhq/devices': 8.6.1 - '@ledgerhq/errors': 6.26.0 - '@ledgerhq/hw-transport': 6.31.12 - '@ledgerhq/logs': 6.13.0 + '@ledgerhq/devices': 8.10.0 + '@ledgerhq/errors': 6.29.0 + '@ledgerhq/hw-transport': 6.32.0 + '@ledgerhq/logs': 6.14.0 dev: true - /@ledgerhq/hw-transport-webusb@6.29.12: - resolution: {integrity: sha512-mMGKPYAUz9MNcURe+hSTSHwqPwCli6D0lCl15Z4hDOpcqhZ26vwoeWVKeQp53NNCetHOl0lauPkN43Gt9pIggg==} + /@ledgerhq/hw-transport-webusb@6.30.0: + resolution: {integrity: sha512-GX5OJvNl0cRZyadxQjS+cnAxiD2irw4Cponp46r50WmirXOLR7hJYKfd1plmGlZOAgT6ayggOZkzahunYerPXw==} dependencies: - '@ledgerhq/devices': 8.6.1 - '@ledgerhq/errors': 6.26.0 - '@ledgerhq/hw-transport': 6.31.12 - '@ledgerhq/logs': 6.13.0 + '@ledgerhq/devices': 8.10.0 + '@ledgerhq/errors': 6.29.0 + '@ledgerhq/hw-transport': 6.32.0 + '@ledgerhq/logs': 6.14.0 dev: true - /@ledgerhq/hw-transport@6.31.12: - resolution: {integrity: sha512-FO5LRIXYC8ELtaohlO8qK0b3TfHUNBZ3+CXKPHiHj2jJwrxPf4s5kcgBYrmzuf1C/1vfrMOjzyty6OgrMIbU6Q==} + /@ledgerhq/hw-transport@6.32.0: + resolution: {integrity: sha512-bf2nxzDQ21DV/bsmExfWI0tatoVeoqhu/ePWalD/nPgPnTn/ZIDq7VBU+TY5p0JZaE87NQwmRUAjm6C1Exe61A==} dependencies: - '@ledgerhq/devices': 8.6.1 - '@ledgerhq/errors': 6.26.0 - '@ledgerhq/logs': 6.13.0 + '@ledgerhq/devices': 8.10.0 + '@ledgerhq/errors': 6.29.0 + '@ledgerhq/logs': 6.14.0 events: 3.3.0 dev: true - /@ledgerhq/logs@6.13.0: - resolution: {integrity: sha512-4+qRW2Pc8V+btL0QEmdB2X+uyx0kOWMWE1/LWsq5sZy3Q5tpi4eItJS6mB0XL3wGW59RQ+8bchNQQ1OW/va8Og==} + /@ledgerhq/logs@6.14.0: + resolution: {integrity: sha512-kJFu1+asWQmU9XlfR1RM3lYR76wuEoPyZvkI/CNjpft78BQr3+MMf3Nu77ABzcKFnhIcmAkOLlDQ6B8L6hDXHA==} dev: true /@mdn/browser-compat-data@5.7.6: @@ -2872,7 +2870,7 @@ packages: /@metaplex-foundation/beet-solana@0.4.0(typescript@5.9.3): resolution: {integrity: sha512-B1L94N3ZGMo53b0uOSoznbuM5GBNJ8LwSeznxBxJ+OThvfHQ4B5oMUqb+0zdLRfkKGS7Q6tpHK9P+QK0j3w2cQ==} dependencies: - '@metaplex-foundation/beet': 0.7.2 + '@metaplex-foundation/beet': 0.7.1 '@solana/web3.js': 1.98.4(typescript@5.9.3) bs58: 5.0.0 debug: 4.4.3(supports-color@8.1.1) @@ -2918,6 +2916,7 @@ packages: debug: 4.4.3(supports-color@8.1.1) transitivePeerDependencies: - supports-color + dev: true /@metaplex-foundation/cusper@0.0.2: resolution: {integrity: sha512-S9RulC2fFCFOQraz61bij+5YCHhSO9llJegK8c8Y6731fSi6snUSQJdCUqYS8AIgR0TKbQvdvgSyIIdbDFZbBA==} @@ -3107,11 +3106,11 @@ packages: '@scure/base': 1.2.6 dev: true - /@mysten/sui@1.43.2(typescript@5.9.3): - resolution: {integrity: sha512-xURMCHrhdVUXLFIUTUM0oRBpYh4nCcLPpn7hNUrWa/gdnABginmwldJpK0R8UjxLv4lEwcYGHeWs2yBl7tqLXg==} + /@mysten/sui@1.45.2(typescript@5.9.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) + '@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 @@ -3122,10 +3121,10 @@ packages: '@scure/base': 1.2.6 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 - gql.tada: 1.8.13(graphql@16.11.0)(typescript@5.9.3) - graphql: 16.11.0 + gql.tada: 1.9.0(graphql@16.12.0)(typescript@5.9.3) + graphql: 16.12.0 poseidon-lite: 0.2.1 - valibot: 0.36.0 + valibot: 1.2.0(typescript@5.9.3) transitivePeerDependencies: - '@gql.tada/svelte-support' - '@gql.tada/vue-support' @@ -3142,12 +3141,17 @@ packages: resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} requiresBuild: true dependencies: - '@emnapi/core': 1.6.0 - '@emnapi/runtime': 1.6.0 + '@emnapi/core': 1.8.1 + '@emnapi/runtime': 1.8.1 '@tybys/wasm-util': 0.10.1 dev: true optional: true + /@noble/ciphers@1.3.0: + resolution: {integrity: sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==} + engines: {node: ^14.21.3 || >=16} + dev: true + /@noble/curves@1.4.2: resolution: {integrity: sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==} dependencies: @@ -3161,6 +3165,13 @@ packages: '@noble/hashes': 1.7.2 dev: true + /@noble/curves@1.9.1: + resolution: {integrity: sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==} + engines: {node: ^14.21.3 || >=16} + dependencies: + '@noble/hashes': 1.8.0 + dev: true + /@noble/curves@1.9.4: resolution: {integrity: sha512-2bKONnuM53lINoDrSmK8qP8W271ms7pygDhZt4SiLOoLwBtoHqeCFi6RG42V8zd3mLHuJFhU/Bmaqo4nX0/kBw==} engines: {node: ^14.21.3 || >=16} @@ -3227,7 +3238,7 @@ packages: engines: {node: '>= 8'} dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.19.1 + fastq: 1.20.1 dev: true /@nolyfill/is-core-module@1.0.39: @@ -3235,63 +3246,63 @@ packages: engines: {node: '>=12.4.0'} dev: true - /@nomicfoundation/edr-darwin-arm64@0.11.3: - resolution: {integrity: sha512-w0tksbdtSxz9nuzHKsfx4c2mwaD0+l5qKL2R290QdnN9gi9AV62p9DHkOgfBdyg6/a6ZlnQqnISi7C9avk/6VA==} - engines: {node: '>= 18'} + /@nomicfoundation/edr-darwin-arm64@0.12.0-next.23: + resolution: {integrity: sha512-Amh7mRoDzZyJJ4efqoePqdoZOzharmSOttZuJDlVE5yy07BoE8hL6ZRpa5fNYn0LCqn/KoWs8OHANWxhKDGhvQ==} + engines: {node: '>= 20'} dev: true - /@nomicfoundation/edr-darwin-x64@0.11.3: - resolution: {integrity: sha512-QR4jAFrPbOcrO7O2z2ESg+eUeIZPe2bPIlQYgiJ04ltbSGW27FblOzdd5+S3RoOD/dsZGKAvvy6dadBEl0NgoA==} - engines: {node: '>= 18'} + /@nomicfoundation/edr-darwin-x64@0.12.0-next.23: + resolution: {integrity: sha512-9wn489FIQm7m0UCD+HhktjWx6vskZzeZD9oDc2k9ZvbBzdXwPp5tiDqUBJ+eQpByAzCDfteAJwRn2lQCE0U+Iw==} + engines: {node: '>= 20'} dev: true - /@nomicfoundation/edr-linux-arm64-gnu@0.11.3: - resolution: {integrity: sha512-Ktjv89RZZiUmOFPspuSBVJ61mBZQ2+HuLmV67InNlh9TSUec/iDjGIwAn59dx0bF/LOSrM7qg5od3KKac4LJDQ==} - engines: {node: '>= 18'} + /@nomicfoundation/edr-linux-arm64-gnu@0.12.0-next.23: + resolution: {integrity: sha512-nlk5EejSzEUfEngv0Jkhqq3/wINIfF2ED9wAofc22w/V1DV99ASh9l3/e/MIHOQFecIZ9MDqt0Em9/oDyB1Uew==} + engines: {node: '>= 20'} dev: true - /@nomicfoundation/edr-linux-arm64-musl@0.11.3: - resolution: {integrity: sha512-B3sLJx1rL2E9pfdD4mApiwOZSrX0a/KQSBWdlq1uAhFKqkl00yZaY4LejgZndsJAa4iKGQJlGnw4HCGeVt0+jA==} - engines: {node: '>= 18'} + /@nomicfoundation/edr-linux-arm64-musl@0.12.0-next.23: + resolution: {integrity: sha512-SJuPBp3Rc6vM92UtVTUxZQ/QlLhLfwTftt2XUiYohmGKB3RjGzpgduEFMCA0LEnucUckU6UHrJNFHiDm77C4PQ==} + engines: {node: '>= 20'} dev: true - /@nomicfoundation/edr-linux-x64-gnu@0.11.3: - resolution: {integrity: sha512-D/4cFKDXH6UYyKPu6J3Y8TzW11UzeQI0+wS9QcJzjlrrfKj0ENW7g9VihD1O2FvXkdkTjcCZYb6ai8MMTCsaVw==} - engines: {node: '>= 18'} + /@nomicfoundation/edr-linux-x64-gnu@0.12.0-next.23: + resolution: {integrity: sha512-NU+Qs3u7Qt6t3bJFdmmjd5CsvgI2bPPzO31KifM2Ez96/jsXYho5debtTQnimlb5NAqiHTSlxjh/F8ROcptmeQ==} + engines: {node: '>= 20'} dev: true - /@nomicfoundation/edr-linux-x64-musl@0.11.3: - resolution: {integrity: sha512-ergXuIb4nIvmf+TqyiDX5tsE49311DrBky6+jNLgsGDTBaN1GS3OFwFS8I6Ri/GGn6xOaT8sKu3q7/m+WdlFzg==} - engines: {node: '>= 18'} + /@nomicfoundation/edr-linux-x64-musl@0.12.0-next.23: + resolution: {integrity: sha512-F78fZA2h6/ssiCSZOovlgIu0dUeI7ItKPsDDF3UUlIibef052GCXmliMinC90jVPbrjUADMd1BUwjfI0Z8OllQ==} + engines: {node: '>= 20'} dev: true - /@nomicfoundation/edr-win32-x64-msvc@0.11.3: - resolution: {integrity: sha512-snvEf+WB3OV0wj2A7kQ+ZQqBquMcrozSLXcdnMdEl7Tmn+KDCbmFKBt3Tk0X3qOU4RKQpLPnTxdM07TJNVtung==} - engines: {node: '>= 18'} + /@nomicfoundation/edr-win32-x64-msvc@0.12.0-next.23: + resolution: {integrity: sha512-IfJZQJn7d/YyqhmguBIGoCKjE9dKjbu6V6iNEPApfwf5JyyjHYyyfkLU4rf7hygj57bfH4sl1jtQ6r8HnT62lw==} + engines: {node: '>= 20'} dev: true - /@nomicfoundation/edr@0.11.3: - resolution: {integrity: sha512-kqILRkAd455Sd6v8mfP3C1/0tCOynJWY+Ir+k/9Boocu2kObCrsFgG+ZWB7fSBVdd9cPVSNrnhWS+V+PEo637g==} - engines: {node: '>= 18'} + /@nomicfoundation/edr@0.12.0-next.23: + resolution: {integrity: sha512-F2/6HZh8Q9RsgkOIkRrckldbhPjIZY7d4mT9LYuW68miwGQ5l7CkAgcz9fRRiurA0+YJhtsbx/EyrD9DmX9BOw==} + engines: {node: '>= 20'} dependencies: - '@nomicfoundation/edr-darwin-arm64': 0.11.3 - '@nomicfoundation/edr-darwin-x64': 0.11.3 - '@nomicfoundation/edr-linux-arm64-gnu': 0.11.3 - '@nomicfoundation/edr-linux-arm64-musl': 0.11.3 - '@nomicfoundation/edr-linux-x64-gnu': 0.11.3 - '@nomicfoundation/edr-linux-x64-musl': 0.11.3 - '@nomicfoundation/edr-win32-x64-msvc': 0.11.3 + '@nomicfoundation/edr-darwin-arm64': 0.12.0-next.23 + '@nomicfoundation/edr-darwin-x64': 0.12.0-next.23 + '@nomicfoundation/edr-linux-arm64-gnu': 0.12.0-next.23 + '@nomicfoundation/edr-linux-arm64-musl': 0.12.0-next.23 + '@nomicfoundation/edr-linux-x64-gnu': 0.12.0-next.23 + '@nomicfoundation/edr-linux-x64-musl': 0.12.0-next.23 + '@nomicfoundation/edr-win32-x64-msvc': 0.12.0-next.23 dev: true - /@nomicfoundation/hardhat-ethers@3.1.1(ethers@5.8.0)(hardhat@2.26.4): - resolution: {integrity: sha512-v/hm2yL7RfTnTShqD0hycgERZSaaj8dtM8pklVFElxwAKUfIpumaXo/lbPqUW5DHgvvG/y440g0g46gWwLlSHQ==} + /@nomicfoundation/hardhat-ethers@3.1.3(ethers@5.8.0)(hardhat@2.28.5): + resolution: {integrity: sha512-208JcDeVIl+7Wu3MhFUUtiA8TJ7r2Rn3Wr+lSx9PfsDTKkbsAsWPY6N6wQ4mtzDv0/pB9nIbJhkjoHe1EsgNsA==} peerDependencies: ethers: ^5.7.2 - hardhat: ^2.26.0 + hardhat: ^2.28.0 dependencies: debug: 4.4.3(supports-color@8.1.1) ethers: 5.8.0 - hardhat: 2.26.4(ts-node@10.9.2)(typescript@5.9.3) + hardhat: 2.28.5(ts-node@10.9.2)(typescript@5.9.3) lodash.isequal: 4.5.0 transitivePeerDependencies: - supports-color @@ -3359,17 +3370,17 @@ packages: '@nomicfoundation/solidity-analyzer-win32-x64-msvc': 0.1.2 dev: true - /@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0)(hardhat@2.26.4): + /@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0)(hardhat@2.28.5): resolution: {integrity: sha512-YhzPdzb612X591FOe68q+qXVXGG2ANZRvDo0RRUtimev85rCrAlv/TLMEZw5c+kq9AbzocLTVX/h2jVIFPL9Xg==} peerDependencies: ethers: ^5.7.2 hardhat: ^2.0.0 dependencies: ethers: 5.8.0 - hardhat: 2.26.4(ts-node@10.9.2)(typescript@5.9.3) + hardhat: 2.28.5(ts-node@10.9.2)(typescript@5.9.3) dev: true - /@nomiclabs/hardhat-waffle@2.0.6(@nomiclabs/hardhat-ethers@2.2.3)(@types/sinon-chai@3.2.12)(ethereum-waffle@4.0.10)(ethers@5.8.0)(hardhat@2.26.4): + /@nomiclabs/hardhat-waffle@2.0.6(@nomiclabs/hardhat-ethers@2.2.3)(@types/sinon-chai@3.2.12)(ethereum-waffle@4.0.10)(ethers@5.8.0)(hardhat@2.28.5): resolution: {integrity: sha512-+Wz0hwmJGSI17B+BhU/qFRZ1l6/xMW82QGXE/Gi+WTmwgJrQefuBs1lIf7hzQ1hLk6hpkvb/zwcNkpVKRYTQYg==} peerDependencies: '@nomiclabs/hardhat-ethers': ^2.0.0 @@ -3378,11 +3389,11 @@ packages: ethers: ^5.7.2 hardhat: ^2.0.0 dependencies: - '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.8.0)(hardhat@2.26.4) + '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.8.0)(hardhat@2.28.5) '@types/sinon-chai': 3.2.12 ethereum-waffle: 4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0)(ethers@5.8.0)(typescript@5.9.3) ethers: 5.8.0 - hardhat: 2.26.4(ts-node@10.9.2)(typescript@5.9.3) + hardhat: 2.28.5(ts-node@10.9.2)(typescript@5.9.3) dev: true /@openzeppelin/contracts-upgradeable@4.7.3: @@ -3409,6 +3420,16 @@ packages: resolution: {integrity: sha512-eCYgWnLg6WO+X52I16TZt8uEjbtdkgLC0SUX/xnAksjjrQI4Xfn4iBRoI5j55dmlOhDv1Y7BoR3cU7e3WWhC6A==} dev: true + /@peculiar/asn1-schema@2.6.0: + resolution: {integrity: sha512-xNLYLBFTBKkCzEZIw842BxytQQATQv+lDTCEMZ8C196iJcJJMBUZxrhSTxLaohMyKK8QlzRNTRkUmanucnDSqg==} + requiresBuild: true + dependencies: + asn1js: 3.0.7 + pvtsutils: 1.3.6 + tslib: 2.8.1 + dev: true + optional: true + /@pkgr/core@0.2.9: resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} @@ -3426,8 +3447,8 @@ packages: graceful-fs: 4.2.10 dev: true - /@pnpm/npm-conf@2.3.1: - resolution: {integrity: sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==} + /@pnpm/npm-conf@3.0.2: + resolution: {integrity: sha512-h104Kh26rR8tm+a3Qkc5S4VLYint3FE48as7+/5oCEcKR2idC/pF1G6AhIXKI+eHPJa/3J9i5z0Al47IeGHPkA==} engines: {node: '>=12'} dependencies: '@pnpm/config.env-replace': 1.1.0 @@ -3540,19 +3561,23 @@ packages: resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} dev: true - /@rushstack/eslint-patch@1.14.1: - resolution: {integrity: sha512-jGTk8UD/RdjsNZW8qq10r0RBvxL8OWtoT+kImlzPDFilmozzM+9QmIJsmze9UiSBrFU45ZxhTYBypn9q9z/VfQ==} + /@rushstack/eslint-patch@1.15.0: + resolution: {integrity: sha512-ojSshQPKwVvSMR8yT2L/QtUkV5SXi/IfDiJ4/8d6UbTPjiHVmxZzUAzGD8Tzks1b9+qQkZa0isUOvYObedITaw==} dev: true - /@safe-global/api-kit@1.3.1: - resolution: {integrity: sha512-JKvCNs8p+42+N8pV2MIqoXlBLckTe5CKboVT7t9mTluuA66i5W8+Kr+B5j9D//EIU5vO7iSOOIYnJuA2ck4XRQ==} + /@safe-global/api-kit@4.0.1(typescript@5.9.3)(zod@3.25.76): + resolution: {integrity: sha512-pNtDLgMHlCSr4Hwwe6jsnvMheAu2SZCTqjYlnNe4cKH2pSKINVRTiILoeJ0wOpixrMCH4NlgJ+9N3QruRNcCpQ==} dependencies: - '@ethersproject/abstract-signer': 5.8.0 - '@safe-global/safe-core-sdk-types': 2.3.0 + '@safe-global/protocol-kit': 6.1.2(typescript@5.9.3)(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.2(typescript@5.9.3)(zod@3.25.76) transitivePeerDependencies: + - bufferutil - encoding - - supports-color + - typescript + - utf-8-validate + - zod dev: true /@safe-global/protocol-kit@1.3.0(ethers@5.8.0): @@ -3561,9 +3586,9 @@ packages: '@ethersproject/address': 5.8.0 '@ethersproject/bignumber': 5.8.0 '@ethersproject/solidity': 5.8.0 - '@safe-global/safe-deployments': 1.37.47 + '@safe-global/safe-deployments': 1.37.51 ethereumjs-util: 7.1.5 - semver: 7.7.3 + semver: 7.7.4 web3: 1.10.4 web3-core: 1.10.4 web3-utils: 1.10.4 @@ -3576,13 +3601,32 @@ packages: - utf-8-validate dev: true + /@safe-global/protocol-kit@6.1.2(typescript@5.9.3)(zod@3.25.76): + resolution: {integrity: sha512-cTpPdUAS2AMfGCkD1T601rQNjT0rtMQLA2TH7L/C+iFPAC6WrrDFop2B9lzeHjczlnVzrRpfFe4cL1bLrJ9NZw==} + dependencies: + '@safe-global/safe-deployments': 1.37.51 + '@safe-global/safe-modules-deployments': 2.2.23 + '@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.4 + viem: 2.45.2(typescript@5.9.3)(zod@3.25.76) + optionalDependencies: + '@noble/curves': 1.9.7 + '@peculiar/asn1-schema': 2.6.0 + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + - zod + dev: true + /@safe-global/safe-core-sdk-types@2.3.0: resolution: {integrity: sha512-dU0KkDV1KJNf11ajbUjWiSi4ygdyWfhk1M50lTJWUdCn1/2Bsb/hICM8LoEk6DCoFumxaoCet02SmYakXsW2CA==} deprecated: 'WARNING: This project has been renamed to @safe-global/types-kit. Please, migrate from @safe-global/safe-core-sdk-types@5.1.0 to @safe-global/types-kit@1.0.0.' dependencies: '@ethersproject/bignumber': 5.8.0 '@ethersproject/contracts': 5.8.0 - '@safe-global/safe-deployments': 1.37.47 + '@safe-global/safe-deployments': 1.37.51 web3-core: 1.10.4 web3-utils: 1.10.4 transitivePeerDependencies: @@ -3590,10 +3634,23 @@ packages: - supports-color dev: true - /@safe-global/safe-deployments@1.37.47: - resolution: {integrity: sha512-abxu9nmvjfDahCIFdrHw4ENZ1CD60z/bgrv5cV3+sygADU1vuh96jFumebo+6PR/Q5qz5glrQuLwEtZ8K/lvJQ==} + /@safe-global/safe-deployments@1.37.51: + resolution: {integrity: sha512-w+p9XOtoS6j0sN57zfKkSGz2ts0blf+gzVZz5sqKUlov4wsSJdqtaUPcNJnKvpV8x1aes/k1Do7qJMBvJivPtQ==} dependencies: - semver: 7.7.3 + semver: 7.7.4 + dev: true + + /@safe-global/safe-modules-deployments@2.2.23: + resolution: {integrity: sha512-73V/PM3ire3Xc2JacalHEif3E3zyIF5xpJ9c0MVrzK3eS5S04CaTaTH/Sy6kCqh4g5fmJp/8Mc4hs20Op/Cd6A==} + dev: true + + /@safe-global/types-kit@3.0.0(typescript@5.9.3)(zod@3.25.76): + resolution: {integrity: sha512-AZWIlR5MguDPdGiOj7BB4JQPY2afqmWQww1mu8m8Oi16HHBW99G01kFOu4NEHBwEU1cgwWOMY19hsI5KyL4W2w==} + dependencies: + abitype: 1.2.3(typescript@5.9.3)(zod@3.25.76) + transitivePeerDependencies: + - typescript + - zod dev: true /@scure/base@1.1.9: @@ -3608,7 +3665,7 @@ packages: resolution: {integrity: sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==} dependencies: '@noble/hashes': 1.2.0 - '@noble/secp256k1': 1.7.1 + '@noble/secp256k1': 1.7.2 '@scure/base': 1.1.9 dev: true @@ -3623,7 +3680,7 @@ packages: /@scure/bip32@1.7.0: resolution: {integrity: sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw==} dependencies: - '@noble/curves': 1.9.7 + '@noble/curves': 1.9.1 '@noble/hashes': 1.8.0 '@scure/base': 1.2.6 dev: true @@ -3726,12 +3783,12 @@ packages: tslib: 1.14.1 dev: true - /@sinclair/typebox@0.27.8: - resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + /@sinclair/typebox@0.27.10: + resolution: {integrity: sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==} dev: true - /@sinclair/typebox@0.34.41: - resolution: {integrity: sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==} + /@sinclair/typebox@0.34.48: + resolution: {integrity: sha512-kKJTNuK3AQOrgjjotVxMrCn1sUJwM76wMszfq1kdU4uYVJjvEWuFQ6HgvLt4Xz3fSmZlTOxJ/Ie13KnIcWQXFA==} dev: true /@sindresorhus/is@4.6.0: @@ -3759,7 +3816,7 @@ packages: /@so-ric/colorspace@1.1.6: resolution: {integrity: sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==} dependencies: - color: 5.0.2 + color: 5.0.3 text-hex: 1.0.0 dev: true @@ -3909,7 +3966,7 @@ packages: typescript: '>=5.3.3' dependencies: chalk: 5.6.2 - commander: 14.0.2 + commander: 14.0.3 typescript: 5.9.3 /@solana/options@2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3): @@ -3992,7 +4049,7 @@ packages: /@solana/web3.js@1.98.4(typescript@5.9.3): resolution: {integrity: sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw==} dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.6 '@noble/curves': 1.9.7 '@noble/hashes': 1.8.0 '@solana/buffer-layout': 4.0.1 @@ -4003,9 +4060,9 @@ packages: bs58: 4.0.1 buffer: 6.0.3 fast-stable-stringify: 1.0.0 - jayson: 4.2.0 + jayson: 4.3.0 node-fetch: 2.7.0 - rpc-websockets: 9.2.0 + rpc-websockets: 9.3.3 superstruct: 2.0.2 transitivePeerDependencies: - bufferutil @@ -4061,8 +4118,8 @@ packages: resolution: {integrity: sha512-bprE8+K5V+DPX7q2e2K57ImqNBdfGHDIWaGI5xHxZoxbKOuQZn4wzPiUxOAHnsUr3w3xHrWXwN7gnG/iIuEMIg==} dev: true - /@swc/core-darwin-arm64@1.14.0: - resolution: {integrity: sha512-uHPC8rlCt04nvYNczWzKVdgnRhxCa3ndKTBBbBpResOZsRmiwRAvByIGh599j+Oo6Z5eyTPrgY+XfJzVmXnN7Q==} + /@swc/core-darwin-arm64@1.15.11: + resolution: {integrity: sha512-QoIupRWVH8AF1TgxYyeA5nS18dtqMuxNwchjBIwJo3RdwLEFiJq6onOx9JAxHtuPwUkIVuU2Xbp+jCJ7Vzmgtg==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] @@ -4070,8 +4127,8 @@ packages: dev: true optional: true - /@swc/core-darwin-x64@1.14.0: - resolution: {integrity: sha512-2SHrlpl68vtePRknv9shvM9YKKg7B9T13tcTg9aFCwR318QTYo+FzsKGmQSv9ox/Ua0Q2/5y2BNjieffJoo4nA==} + /@swc/core-darwin-x64@1.15.11: + resolution: {integrity: sha512-S52Gu1QtPSfBYDiejlcfp9GlN+NjTZBRRNsz8PNwBgSE626/FUf2PcllVUix7jqkoMC+t0rS8t+2/aSWlMuQtA==} engines: {node: '>=10'} cpu: [x64] os: [darwin] @@ -4079,8 +4136,8 @@ packages: dev: true optional: true - /@swc/core-linux-arm-gnueabihf@1.14.0: - resolution: {integrity: sha512-SMH8zn01dxt809svetnxpeg/jWdpi6dqHKO3Eb11u4OzU2PK7I5uKS6gf2hx5LlTbcJMFKULZiVwjlQLe8eqtg==} + /@swc/core-linux-arm-gnueabihf@1.15.11: + resolution: {integrity: sha512-lXJs8oXo6Z4yCpimpQ8vPeCjkgoHu5NoMvmJZ8qxDyU99KVdg6KwU9H79vzrmB+HfH+dCZ7JGMqMF//f8Cfvdg==} engines: {node: '>=10'} cpu: [arm] os: [linux] @@ -4088,8 +4145,8 @@ packages: dev: true optional: true - /@swc/core-linux-arm64-gnu@1.14.0: - resolution: {integrity: sha512-q2JRu2D8LVqGeHkmpVCljVNltG0tB4o4eYg+dElFwCS8l2Mnt9qurMCxIeo9mgoqz0ax+k7jWtIRHktnVCbjvQ==} + /@swc/core-linux-arm64-gnu@1.15.11: + resolution: {integrity: sha512-chRsz1K52/vj8Mfq/QOugVphlKPWlMh10V99qfH41hbGvwAU6xSPd681upO4bKiOr9+mRIZZW+EfJqY42ZzRyA==} engines: {node: '>=10'} cpu: [arm64] os: [linux] @@ -4097,8 +4154,8 @@ packages: dev: true optional: true - /@swc/core-linux-arm64-musl@1.14.0: - resolution: {integrity: sha512-uofpVoPCEUjYIv454ZEZ3sLgMD17nIwlz2z7bsn7rl301Kt/01umFA7MscUovFfAK2IRGck6XB+uulMu6aFhKQ==} + /@swc/core-linux-arm64-musl@1.15.11: + resolution: {integrity: sha512-PYftgsTaGnfDK4m6/dty9ryK1FbLk+LosDJ/RJR2nkXGc8rd+WenXIlvHjWULiBVnS1RsjHHOXmTS4nDhe0v0w==} engines: {node: '>=10'} cpu: [arm64] os: [linux] @@ -4106,8 +4163,8 @@ packages: dev: true optional: true - /@swc/core-linux-x64-gnu@1.14.0: - resolution: {integrity: sha512-quTTx1Olm05fBfv66DEBuOsOgqdypnZ/1Bh3yGXWY7ANLFeeRpCDZpljD9BSjdsNdPOlwJmEUZXMHtGm3v1TZQ==} + /@swc/core-linux-x64-gnu@1.15.11: + resolution: {integrity: sha512-DKtnJKIHiZdARyTKiX7zdRjiDS1KihkQWatQiCHMv+zc2sfwb4Glrodx2VLOX4rsa92NLR0Sw8WLcPEMFY1szQ==} engines: {node: '>=10'} cpu: [x64] os: [linux] @@ -4115,8 +4172,8 @@ packages: dev: true optional: true - /@swc/core-linux-x64-musl@1.14.0: - resolution: {integrity: sha512-caaNAu+aIqT8seLtCf08i8C3/UC5ttQujUjejhMcuS1/LoCKtNiUs4VekJd2UGt+pyuuSrQ6dKl8CbCfWvWeXw==} + /@swc/core-linux-x64-musl@1.15.11: + resolution: {integrity: sha512-mUjjntHj4+8WBaiDe5UwRNHuEzLjIWBTSGTw0JT9+C9/Yyuh4KQqlcEQ3ro6GkHmBGXBFpGIj/o5VMyRWfVfWw==} engines: {node: '>=10'} cpu: [x64] os: [linux] @@ -4124,8 +4181,8 @@ packages: dev: true optional: true - /@swc/core-win32-arm64-msvc@1.14.0: - resolution: {integrity: sha512-EeW3jFlT3YNckJ6V/JnTfGcX7UHGyh6/AiCPopZ1HNaGiXVCKHPpVQZicmtyr/UpqxCXLrTgjHOvyMke7YN26A==} + /@swc/core-win32-arm64-msvc@1.15.11: + resolution: {integrity: sha512-ZkNNG5zL49YpaFzfl6fskNOSxtcZ5uOYmWBkY4wVAvgbSAQzLRVBp+xArGWh2oXlY/WgL99zQSGTv7RI5E6nzA==} engines: {node: '>=10'} cpu: [arm64] os: [win32] @@ -4133,8 +4190,8 @@ packages: dev: true optional: true - /@swc/core-win32-ia32-msvc@1.14.0: - resolution: {integrity: sha512-dPai3KUIcihV5hfoO4QNQF5HAaw8+2bT7dvi8E5zLtecW2SfL3mUZipzampXq5FHll0RSCLzlrXnSx+dBRZIIQ==} + /@swc/core-win32-ia32-msvc@1.15.11: + resolution: {integrity: sha512-6XnzORkZCQzvTQ6cPrU7iaT9+i145oLwnin8JrfsLG41wl26+5cNQ2XV3zcbrnFEV6esjOceom9YO1w9mGJByw==} engines: {node: '>=10'} cpu: [ia32] os: [win32] @@ -4142,8 +4199,8 @@ packages: dev: true optional: true - /@swc/core-win32-x64-msvc@1.14.0: - resolution: {integrity: sha512-nm+JajGrTqUA6sEHdghDlHMNfH1WKSiuvljhdmBACW4ta4LC3gKurX2qZuiBARvPkephW9V/i5S8QPY1PzFEqg==} + /@swc/core-win32-x64-msvc@1.15.11: + resolution: {integrity: sha512-IQ2n6af7XKLL6P1gIeZACskSxK8jWtoKpJWLZmdXTDj1MGzktUy4i+FvpdtxFmJWNavRWH1VmTr6kAubRDHeKw==} engines: {node: '>=10'} cpu: [x64] os: [win32] @@ -4151,8 +4208,8 @@ packages: dev: true optional: true - /@swc/core@1.14.0: - resolution: {integrity: sha512-oExhY90bes5pDTVrei0xlMVosTxwd/NMafIpqsC4dMbRYZ5KB981l/CX8tMnGsagTplj/RcG9BeRYmV6/J5m3w==} + /@swc/core@1.15.11: + resolution: {integrity: sha512-iLmLTodbYxU39HhMPaMUooPwO/zqJWvsqkrXv1ZI38rMb048p6N7qtAtTp37sw9NzSrvH6oli8EdDygo09IZ/w==} engines: {node: '>=10'} requiresBuild: true peerDependencies: @@ -4164,35 +4221,35 @@ packages: '@swc/counter': 0.1.3 '@swc/types': 0.1.25 optionalDependencies: - '@swc/core-darwin-arm64': 1.14.0 - '@swc/core-darwin-x64': 1.14.0 - '@swc/core-linux-arm-gnueabihf': 1.14.0 - '@swc/core-linux-arm64-gnu': 1.14.0 - '@swc/core-linux-arm64-musl': 1.14.0 - '@swc/core-linux-x64-gnu': 1.14.0 - '@swc/core-linux-x64-musl': 1.14.0 - '@swc/core-win32-arm64-msvc': 1.14.0 - '@swc/core-win32-ia32-msvc': 1.14.0 - '@swc/core-win32-x64-msvc': 1.14.0 + '@swc/core-darwin-arm64': 1.15.11 + '@swc/core-darwin-x64': 1.15.11 + '@swc/core-linux-arm-gnueabihf': 1.15.11 + '@swc/core-linux-arm64-gnu': 1.15.11 + '@swc/core-linux-arm64-musl': 1.15.11 + '@swc/core-linux-x64-gnu': 1.15.11 + '@swc/core-linux-x64-musl': 1.15.11 + '@swc/core-win32-arm64-msvc': 1.15.11 + '@swc/core-win32-ia32-msvc': 1.15.11 + '@swc/core-win32-x64-msvc': 1.15.11 dev: true /@swc/counter@0.1.3: resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} dev: true - /@swc/helpers@0.5.17: - resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} + /@swc/helpers@0.5.18: + resolution: {integrity: sha512-TXTnIcNJQEKwThMMqBXsZ4VGAza6bvN4pa41Rkqoio6QBKMvo+5lexeTMScGCIxtzgQJzElcvIltani+adC5PQ==} dependencies: tslib: 2.8.1 - /@swc/jest@0.2.39(@swc/core@1.14.0): + /@swc/jest@0.2.39(@swc/core@1.15.11): resolution: {integrity: sha512-eyokjOwYd0Q8RnMHri+8/FS1HIrIUKK/sRrFp8c1dThUOfNeCWbLmBP1P5VsKdvmkd25JaH+OKYwEYiAYg9YAA==} engines: {npm: '>= 7.0.0'} peerDependencies: '@swc/core': '*' dependencies: '@jest/create-cache-key-function': 30.2.0 - '@swc/core': 1.14.0 + '@swc/core': 1.15.11 '@swc/counter': 0.1.3 jsonc-parser: 3.3.1 dev: true @@ -4248,7 +4305,7 @@ packages: dependencies: '@ton/core': 0.59.1(@ton/crypto@3.3.0) '@ton/crypto': 3.3.0 - axios: 1.13.1 + axios: 1.13.5 dataloader: 2.2.3 symbol.inspect: 1.0.1 teslabot: 1.5.0 @@ -4271,8 +4328,8 @@ packages: dev: true optional: true - /@tsconfig/node10@1.0.11: - resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} + /@tsconfig/node10@1.0.12: + resolution: {integrity: sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==} dev: true /@tsconfig/node12@1.0.11: @@ -4307,7 +4364,7 @@ packages: '@ethersproject/abi': 5.8.0 '@ethersproject/providers': 5.8.0 ethers: 5.8.0 - lodash: 4.17.21 + 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 @@ -4320,8 +4377,8 @@ packages: /@types/babel__core@7.20.5: resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} dependencies: - '@babel/parser': 7.28.5 - '@babel/types': 7.28.5 + '@babel/parser': 7.29.0 + '@babel/types': 7.29.0 '@types/babel__generator': 7.27.0 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.28.0 @@ -4330,20 +4387,20 @@ packages: /@types/babel__generator@7.27.0: resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} dependencies: - '@babel/types': 7.28.5 + '@babel/types': 7.29.0 dev: true /@types/babel__template@7.4.4: resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} dependencies: - '@babel/parser': 7.28.5 - '@babel/types': 7.28.5 + '@babel/parser': 7.29.0 + '@babel/types': 7.29.0 dev: true /@types/babel__traverse@7.28.0: resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} dependencies: - '@babel/types': 7.28.5 + '@babel/types': 7.29.0 dev: true /@types/bn.js@4.11.6: @@ -4360,7 +4417,7 @@ packages: /@types/cacheable-request@6.0.3: resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} dependencies: - '@types/http-cache-semantics': 4.0.4 + '@types/http-cache-semantics': 4.2.0 '@types/keyv': 3.1.4 '@types/node': 18.18.14 '@types/responselike': 1.0.3 @@ -4381,8 +4438,8 @@ packages: '@types/node': 18.18.14 dev: true - /@types/http-cache-semantics@4.0.4: - resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} + /@types/http-cache-semantics@4.2.0: + resolution: {integrity: sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==} dev: true /@types/istanbul-lib-coverage@2.0.6: @@ -4414,6 +4471,7 @@ packages: /@types/json5@0.0.29: resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + requiresBuild: true dev: true /@types/keyv@3.1.4: @@ -4448,7 +4506,7 @@ packages: resolution: {integrity: sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw==} dependencies: '@types/node': 18.18.14 - form-data: 4.0.4 + form-data: 4.0.5 dev: true /@types/node@11.11.6: @@ -4497,11 +4555,11 @@ packages: resolution: {integrity: sha512-9y0Gflk3b0+NhQZ/oxGtaAJDvRywCa5sIyaVnounqLvmf93yBF4EgIRspePtkMs3Tr844nCclYMlcCNmLCvjuQ==} dependencies: '@types/chai': 4.3.20 - '@types/sinon': 17.0.4 + '@types/sinon': 21.0.0 dev: true - /@types/sinon@17.0.4: - resolution: {integrity: sha512-RHnIrhfPO3+tJT0s7cFaXGZvsL4bbR3/k7z3P312qMS4JaS2Tk+KiwiLx1S0rQ56ERj00u1/BtdyVd0FY+Pdew==} + /@types/sinon@21.0.0: + resolution: {integrity: sha512-+oHKZ0lTI+WVLxx1IbJDNmReQaIsQJjN2e7UUrJHEeByG7bFeKJYsv1E75JxTQ9QKJDp21bAa/0W2Xo4srsDnw==} dependencies: '@types/sinonjs__fake-timers': 15.0.1 dev: true @@ -4539,8 +4597,8 @@ packages: resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} dev: true - /@types/yargs@17.0.34: - resolution: {integrity: sha512-KExbHVa92aJpw9WDQvzBaGVE2/Pz+pLZQloT2hjL8IqsZnV62rlPOYvNnLmf/L2dyllfVUOVBj64M0z/46eR2A==} + /@types/yargs@17.0.35: + resolution: {integrity: sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==} dependencies: '@types/yargs-parser': 21.0.3 dev: true @@ -4657,7 +4715,7 @@ packages: debug: 4.4.3(supports-color@8.1.1) globby: 11.1.0 is-glob: 4.0.3 - semver: 7.7.3 + semver: 7.7.4 tsutils: 3.21.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: @@ -4679,7 +4737,7 @@ packages: globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.7.3 + semver: 7.7.4 ts-api-utils: 1.4.3(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: @@ -4692,7 +4750,7 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@8.57.1) + '@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 @@ -4700,7 +4758,7 @@ packages: '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.9.3) eslint: 8.57.1 eslint-scope: 5.1.1 - semver: 7.7.3 + semver: 7.7.4 transitivePeerDependencies: - supports-color - typescript @@ -4712,7 +4770,7 @@ packages: peerDependencies: eslint: ^8.56.0 dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@8.57.1) + '@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) @@ -4896,6 +4954,21 @@ packages: dev: true optional: true + /abitype@1.2.3(typescript@5.9.3)(zod@3.25.76): + 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 + dependencies: + typescript: 5.9.3 + zod: 3.25.76 + dev: true + /abort-controller@3.0.0: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} engines: {node: '>=6.5'} @@ -5078,10 +5151,10 @@ packages: engines: {node: '>=20.0.0'} deprecated: Please update to the newer '@aptos-labs/ts-sdk'. 'aptos' is deprecated dependencies: - '@aptos-labs/aptos-client': 2.0.0(got@11.8.6) + '@aptos-labs/aptos-client': 2.1.0(got@11.8.6) '@noble/hashes': 1.3.3 '@scure/bip39': 1.2.1 - eventemitter3: 5.0.1 + eventemitter3: 5.0.4 tweetnacl: 1.0.3 transitivePeerDependencies: - got @@ -5130,7 +5203,7 @@ packages: call-bind: 1.0.8 call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.24.0 + es-abstract: 1.24.1 es-object-atoms: 1.1.1 get-intrinsic: 1.3.0 is-string: 1.1.1 @@ -5149,7 +5222,7 @@ packages: call-bind: 1.0.8 call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.24.0 + es-abstract: 1.24.1 es-errors: 1.3.0 es-object-atoms: 1.1.1 es-shim-unscopables: 1.1.0 @@ -5161,7 +5234,7 @@ packages: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.24.0 + es-abstract: 1.24.1 es-shim-unscopables: 1.1.0 dev: true @@ -5171,7 +5244,7 @@ packages: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.24.0 + es-abstract: 1.24.1 es-shim-unscopables: 1.1.0 dev: true @@ -5182,18 +5255,34 @@ packages: array-buffer-byte-length: 1.0.2 call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.24.0 + es-abstract: 1.24.1 es-errors: 1.3.0 get-intrinsic: 1.3.0 is-array-buffer: 3.0.5 dev: true + /arrify@1.0.1: + resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} + engines: {node: '>=0.10.0'} + dev: true + /asn1@0.2.6: resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} dependencies: safer-buffer: 2.1.2 dev: true + /asn1js@3.0.7: + resolution: {integrity: sha512-uLvq6KJu04qoQM6gvBfKFjlh6Gl0vOKQuR5cJMDHQkmwfMOQeN3F3SHCv9SNYSL+CRoHvOGFfllDlVz03GQjvQ==} + engines: {node: '>=12.0.0'} + requiresBuild: true + dependencies: + pvtsutils: 1.3.6 + pvutils: 1.1.5 + tslib: 2.8.1 + dev: true + optional: true + /assert-plus@1.0.0: resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} engines: {node: '>=0.8'} @@ -5245,7 +5334,7 @@ packages: /async@2.6.4: resolution: {integrity: sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==} dependencies: - lodash: 4.17.21 + lodash: 4.17.23 dev: true /async@3.2.6: @@ -5288,27 +5377,27 @@ packages: - debug dev: true - /axios@1.13.1: - resolution: {integrity: sha512-hU4EGxxt+j7TQijx1oYdAjw4xuIp1wRQSsbMFwSthCWeBQur1eF+qJ5iQ5sN3Tw8YRzQNKb8jszgBdMDVqwJcw==} + /axios@1.13.5: + resolution: {integrity: sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q==} dependencies: follow-redirects: 1.15.11(debug@4.4.3) - form-data: 4.0.4 + form-data: 4.0.5 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug dev: true - /babel-jest@29.7.0(@babel/core@7.28.5): + /babel-jest@29.7.0(@babel/core@7.29.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 dependencies: - '@babel/core': 7.28.5 + '@babel/core': 7.29.0 '@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) + babel-preset-jest: 29.6.3(@babel/core@7.29.0) chalk: 4.1.2 graceful-fs: 4.2.11 slash: 3.0.0 @@ -5320,7 +5409,7 @@ packages: resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} engines: {node: '>=8'} dependencies: - '@babel/helper-plugin-utils': 7.27.1 + '@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 @@ -5333,44 +5422,44 @@ packages: resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/template': 7.27.2 - '@babel/types': 7.28.5 + '@babel/template': 7.28.6 + '@babel/types': 7.29.0 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.28.0 dev: true - /babel-preset-current-node-syntax@1.2.0(@babel/core@7.28.5): + /babel-preset-current-node-syntax@1.2.0(@babel/core@7.29.0): resolution: {integrity: sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==} peerDependencies: '@babel/core': ^7.0.0 || ^8.0.0-0 dependencies: - '@babel/core': 7.28.5 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.28.5) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.28.5) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.28.5) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.28.5) - '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.28.5) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.28.5) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.28.5) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.28.5) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.28.5) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.28.5) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.28.5) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.28.5) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.28.5) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.28.5) - dev: true - - /babel-preset-jest@29.6.3(@babel/core@7.28.5): + '@babel/core': 7.29.0 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.29.0) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.29.0) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.29.0) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.29.0) + '@babel/plugin-syntax-import-attributes': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.29.0) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.29.0) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.29.0) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.29.0) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.29.0) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.29.0) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.29.0) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.29.0) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.29.0) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.29.0) + dev: true + + /babel-preset-jest@29.6.3(@babel/core@7.29.0): 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/core': 7.29.0 babel-plugin-jest-hoist: 29.6.3 - babel-preset-current-node-syntax: 1.2.0(@babel/core@7.28.5) + babel-preset-current-node-syntax: 1.2.0(@babel/core@7.29.0) dev: true /balanced-match@1.0.2: @@ -5392,8 +5481,8 @@ packages: /base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - /baseline-browser-mapping@2.8.21: - resolution: {integrity: sha512-JU0h5APyQNsHOlAM7HnQnPToSDQoEBZqzu/YBlqDnEeymPnZDREeXJA3KBMQee+dKteAxZ2AtvQEvVYdZf241Q==} + /baseline-browser-mapping@2.9.19: + resolution: {integrity: sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==} hasBin: true dev: true @@ -5478,8 +5567,8 @@ packages: /bn.js@5.2.2: resolution: {integrity: sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==} - /body-parser@1.20.3: - resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} + /body-parser@1.20.4: + resolution: {integrity: sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} dependencies: bytes: 3.1.2 @@ -5487,11 +5576,11 @@ packages: debug: 2.6.9 depd: 2.0.0 destroy: 1.2.0 - http-errors: 2.0.0 + http-errors: 2.0.1 iconv-lite: 0.4.24 on-finished: 2.4.1 - qs: 6.13.0 - raw-body: 2.5.2 + qs: 6.14.1 + raw-body: 2.5.3 type-is: 1.6.18 unpipe: 1.0.0 transitivePeerDependencies: @@ -5562,16 +5651,16 @@ packages: safe-buffer: 5.2.1 dev: true - /browserslist@4.27.0: - resolution: {integrity: sha512-AXVQwdhot1eqLihwasPElhX2tAZiBjWdJ9i/Zcj2S6QYIjkx62OKSfnobkriB81C3l4w0rVy3Nt4jaTBltYEpw==} + /browserslist@4.28.1: + resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - baseline-browser-mapping: 2.8.21 - caniuse-lite: 1.0.30001751 - electron-to-chromium: 1.5.243 + baseline-browser-mapping: 2.9.19 + caniuse-lite: 1.0.30001769 + electron-to-chromium: 1.5.286 node-releases: 2.0.27 - update-browserslist-db: 1.1.4(browserslist@4.27.0) + update-browserslist-db: 1.2.3(browserslist@4.28.1) dev: true /bs58@4.0.1: @@ -5656,8 +5745,8 @@ packages: dev: true optional: true - /bufferutil@4.0.9: - resolution: {integrity: sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw==} + /bufferutil@4.1.0: + resolution: {integrity: sha512-ZMANVnAixE6AWWnPzlW2KpUrxhm9woycYvPOo67jWHyFowASTEd9s+QN1EIMsSDtwhIxN4sWE1jotpuDUIgyIw==} engines: {node: '>=6.14.2'} requiresBuild: true dependencies: @@ -5692,12 +5781,12 @@ packages: resolution: {integrity: sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==} engines: {node: '>=14.16'} dependencies: - '@types/http-cache-semantics': 4.0.4 + '@types/http-cache-semantics': 4.2.0 get-stream: 6.0.1 http-cache-semantics: 4.2.0 keyv: 4.5.4 mimic-response: 4.0.0 - normalize-url: 8.1.0 + normalize-url: 8.1.1 responselike: 3.0.0 dev: true @@ -5757,8 +5846,8 @@ packages: engines: {node: '>=10'} dev: true - /caniuse-lite@1.0.30001751: - resolution: {integrity: sha512-A0QJhug0Ly64Ii3eIqHu5X51ebln3k4yTUkY1j8drqpWHVreg/VLijN48cZ1bYPiqOQuqpkIKnzr/Ul8V+p6Cw==} + /caniuse-lite@1.0.30001769: + resolution: {integrity: sha512-BCfFL1sHijQlBGWBMuJyhZUhzo7wer5sVj9hqekB/7xn0Ypy+pER/edCYQm4exbXj4WiySGp40P8UuTh6w1srg==} dev: true /caseless@0.12.0: @@ -5973,11 +6062,11 @@ packages: color-name: 1.1.4 dev: true - /color-convert@3.1.2: - resolution: {integrity: sha512-UNqkvCDXstVck3kdowtOTWROIJQwafjOfXSmddoDrXo4cewMKmusCeF22Q24zvjR8nwWib/3S/dfyzPItPEiJg==} + /color-convert@3.1.3: + resolution: {integrity: sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg==} engines: {node: '>=14.6'} dependencies: - color-name: 2.0.2 + color-name: 2.1.0 dev: true /color-name@1.1.3: @@ -5988,24 +6077,24 @@ packages: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} dev: true - /color-name@2.0.2: - resolution: {integrity: sha512-9vEt7gE16EW7Eu7pvZnR0abW9z6ufzhXxGXZEVU9IqPdlsUiMwJeJfRtq0zePUmnbHGT9zajca7mX8zgoayo4A==} + /color-name@2.1.0: + resolution: {integrity: sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==} engines: {node: '>=12.20'} dev: true - /color-string@2.1.2: - resolution: {integrity: sha512-RxmjYxbWemV9gKu4zPgiZagUxbH3RQpEIO77XoSSX0ivgABDZ+h8Zuash/EMFLTI4N9QgFPOJ6JQpPZKFxa+dA==} + /color-string@2.1.4: + resolution: {integrity: sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg==} engines: {node: '>=18'} dependencies: - color-name: 2.0.2 + color-name: 2.1.0 dev: true - /color@5.0.2: - resolution: {integrity: sha512-e2hz5BzbUPcYlIRHo8ieAhYgoajrJr+hWoceg6E345TPsATMUKqDgzt8fSXZJJbxfpiPzkWyphz8yn8At7q3fA==} + /color@5.0.3: + resolution: {integrity: sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA==} engines: {node: '>=18'} dependencies: - color-convert: 3.1.2 - color-string: 2.1.2 + color-convert: 3.1.3 + color-string: 2.1.4 dev: true /combined-stream@1.0.8: @@ -6048,8 +6137,8 @@ packages: resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} engines: {node: '>=18'} - /commander@14.0.2: - resolution: {integrity: sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==} + /commander@14.0.3: + resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} engines: {node: '>=20'} /commander@2.20.3: @@ -6070,7 +6159,7 @@ packages: hasBin: true dependencies: chalk: 4.1.2 - lodash: 4.17.21 + lodash: 4.17.23 rxjs: 7.8.2 shell-quote: 1.8.3 supports-color: 8.1.1 @@ -6114,8 +6203,8 @@ packages: engines: {node: '>= 4'} dev: true - /cookie-signature@1.0.6: - resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + /cookie-signature@1.0.7: + resolution: {integrity: sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==} dev: true /cookie@0.4.2: @@ -6123,13 +6212,13 @@ packages: engines: {node: '>= 0.6'} dev: true - /cookie@0.7.1: - resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==} + /cookie@0.7.2: + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} engines: {node: '>= 0.6'} dev: true - /core-js-pure@3.46.0: - resolution: {integrity: sha512-NMCW30bHNofuhwLhYPt66OLOKTMbOhgTTatKVbaQC3KRHpTCiRIBYvtshr+NBYSnBxwAFhjW/RfJ0XbIjS16rw==} + /core-js-pure@3.48.0: + resolution: {integrity: sha512-1slJgk89tWC51HQ1AEqG+s2VuwpTRr8ocu4n20QUcH1v9lAN0RXen0Q0AABa/DK1I7RrNWLucplOHMx8hfTGTw==} requiresBuild: true dev: true @@ -6141,8 +6230,8 @@ packages: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} dev: true - /cors@2.8.5: - resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} + /cors@2.8.6: + resolution: {integrity: sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==} engines: {node: '>= 0.10'} dependencies: object-assign: 4.1.1 @@ -6159,7 +6248,7 @@ packages: optional: true dependencies: import-fresh: 3.3.1 - js-yaml: 4.1.0 + js-yaml: 4.1.1 parse-json: 5.2.0 path-type: 4.0.0 typescript: 5.9.3 @@ -6291,8 +6380,8 @@ packages: resolution: {integrity: sha512-y2krtASINtPFS1rSDjacrFgn1dcUuoREVabwlOGOe4SdxenREqwjwjElAdwvbGM7kgZz9a3KVicWR7vcz8rnzA==} dev: true - /dayjs@1.11.18: - resolution: {integrity: sha512-zFBQ7WFRvVRhKcWoUh+ZA1g2HVgUbsZm9sbddh8EC5iv93sui8DVVz1Npvz+r6meo9VKfa8NyLWBsQK1VvIKPA==} + /dayjs@1.11.19: + resolution: {integrity: sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==} dev: true /debug@2.6.9: @@ -6358,8 +6447,8 @@ packages: mimic-response: 3.1.0 dev: true - /dedent@1.7.0: - resolution: {integrity: sha512-HGFtf8yhuhGhqO07SV79tRp+br4MnbdjeVxotpn1QBl30pcLLCQjX5b2295ll0fv8RKDKsmWYrl05usHM9CewQ==} + /dedent@1.7.1: + resolution: {integrity: sha512-9JmrhGZpOlEgOLdQgSm0zxFaYoQon408V1v49aqTWuXENVlnCuY9JBZcXZiCsZQWDjTm5Qf/nIvAy77mXDAjEg==} peerDependencies: babel-plugin-macros: ^3.1.0 peerDependenciesMeta: @@ -6457,13 +6546,18 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dev: true - /diff@4.0.2: - resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + /diff@3.5.1: + resolution: {integrity: sha512-Z3u54A8qGyqFOSr2pk0ijYs8mOE9Qz8kTvtKeBI+upoG9j04Sq+oI7W8zAJiQybDcESET8/uIdHzs0p3k4fZlw==} engines: {node: '>=0.3.1'} dev: true - /diff@5.2.0: - resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} + /diff@4.0.4: + resolution: {integrity: sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==} + engines: {node: '>=0.3.1'} + dev: true + + /diff@5.2.2: + resolution: {integrity: sha512-vtcDfH3TOjP8UekytvnHH1o1P4FcUdt4eQ1Y+Abap1tk/OB2MWQvcwS2ClCd1zuIhc3JKOx6p3kod8Vfys3E+A==} engines: {node: '>=0.3.1'} dev: true @@ -6530,8 +6624,8 @@ packages: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} dev: true - /electron-to-chromium@1.5.243: - resolution: {integrity: sha512-ZCphxFW3Q1TVhcgS9blfut1PX8lusVi2SvXQgmEEnK4TCmE1JhH2JkjJN+DNt0pJJwfBri5AROBnz2b/C+YU9g==} + /electron-to-chromium@1.5.286: + resolution: {integrity: sha512-9tfDXhJ4RKFNerfjdCcZfufu49vg620741MNs26a9+bhLThdB+plgMeou98CAaHu/WATj2iHOOHTp1hWtABj2A==} dev: true /elliptic@6.6.1: @@ -6568,11 +6662,6 @@ packages: resolution: {integrity: sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==} dev: true - /encodeurl@1.0.2: - resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} - engines: {node: '>= 0.8'} - dev: true - /encodeurl@2.0.0: resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} engines: {node: '>= 0.8'} @@ -6621,8 +6710,8 @@ packages: is-arrayish: 0.2.1 dev: true - /es-abstract@1.24.0: - resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==} + /es-abstract@1.24.1: + resolution: {integrity: sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==} engines: {node: '>= 0.4'} dependencies: array-buffer-byte-length: 1.0.2 @@ -6678,7 +6767,7 @@ packages: typed-array-byte-offset: 1.0.4 typed-array-length: 1.0.7 unbox-primitive: 1.1.0 - which-typed-array: 1.1.19 + which-typed-array: 1.1.20 dev: true /es-define-property@1.0.1: @@ -6825,7 +6914,7 @@ packages: debug: 4.4.3(supports-color@8.1.1) eslint: 8.57.1 eslint-plugin-import: 2.32.0(@typescript-eslint/parser@7.18.0)(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) - get-tsconfig: 4.13.0 + get-tsconfig: 4.13.6 is-bun-module: 2.0.0 stable-hash: 0.0.5 tinyglobby: 0.2.15 @@ -6885,12 +6974,12 @@ packages: dependencies: '@mdn/browser-compat-data': 5.7.6 ast-metadata-inferer: 0.8.1 - browserslist: 4.27.0 - caniuse-lite: 1.0.30001751 + browserslist: 4.28.1 + caniuse-lite: 1.0.30001769 eslint: 8.57.1 find-up: 5.0.0 lodash.memoize: 4.1.2 - semver: 7.7.3 + semver: 7.7.4 dev: true /eslint-plugin-import@2.32.0(@typescript-eslint/parser@7.18.0)(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1): @@ -6943,8 +7032,8 @@ packages: - typescript dev: true - /eslint-plugin-prettier@5.5.4(eslint-config-prettier@9.1.2)(eslint@8.57.1)(prettier@3.6.2): - resolution: {integrity: sha512-swNtI95SToIz05YINMA6Ox5R057IMAmWZ26GqPxusAp1TZzj+IdY9tXNWWD3vkF/wEqydCONcwjTFpxybBqZsg==} + /eslint-plugin-prettier@5.5.5(eslint-config-prettier@9.1.2)(eslint@8.57.1)(prettier@3.8.1): + resolution: {integrity: sha512-hscXkbqUZ2sPithAuLm5MXL+Wph+U7wHngPBv9OMWwlP8iaflyxpjTYZkmdgB4/vPIhemRlBEoLrH7UC1n7aUw==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: '@types/eslint': '>=8.0.0' @@ -6959,9 +7048,9 @@ packages: dependencies: eslint: 8.57.1 eslint-config-prettier: 9.1.2(eslint@8.57.1) - prettier: 3.6.2 - prettier-linter-helpers: 1.0.0 - synckit: 0.11.11 + prettier: 3.8.1 + prettier-linter-helpers: 1.0.1 + synckit: 0.11.12 dev: true /eslint-plugin-unused-imports@3.2.0(@typescript-eslint/eslint-plugin@7.18.0)(eslint@8.57.1): @@ -7011,7 +7100,7 @@ packages: deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. hasBin: true dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@8.57.1) + '@eslint-community/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 @@ -7028,7 +7117,7 @@ packages: eslint-scope: 7.2.2 eslint-visitor-keys: 3.4.3 espree: 9.6.1 - esquery: 1.6.0 + esquery: 1.7.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 file-entry-cache: 6.0.1 @@ -7040,7 +7129,7 @@ packages: imurmurhash: 0.1.4 is-glob: 4.0.3 is-path-inside: 3.0.3 - js-yaml: 4.1.0 + js-yaml: 4.1.1 json-stable-stringify-without-jsonify: 1.0.1 levn: 0.4.1 lodash.merge: 4.6.2 @@ -7078,8 +7167,8 @@ packages: hasBin: true dev: true - /esquery@1.6.0: - resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + /esquery@1.7.0: + resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} engines: {node: '>=0.10'} dependencies: estraverse: 5.3.0 @@ -7333,6 +7422,10 @@ packages: /eventemitter3@5.0.1: resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + dev: true + + /eventemitter3@5.0.4: + resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} /events@3.3.0: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} @@ -7381,38 +7474,38 @@ packages: resolution: {integrity: sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==} dev: true - /express@4.21.2: - resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==} + /express@4.22.1: + resolution: {integrity: sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==} engines: {node: '>= 0.10.0'} dependencies: accepts: 1.3.8 array-flatten: 1.1.1 - body-parser: 1.20.3 + body-parser: 1.20.4 content-disposition: 0.5.4 content-type: 1.0.5 - cookie: 0.7.1 - cookie-signature: 1.0.6 + 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.1 + finalhandler: 1.3.2 fresh: 0.5.2 - http-errors: 2.0.0 + 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.13.0 + qs: 6.14.1 range-parser: 1.2.1 safe-buffer: 5.2.1 - send: 0.19.0 - serve-static: 1.16.2 + send: 0.19.2 + serve-static: 1.16.3 setprototypeof: 1.2.0 - statuses: 2.0.1 + statuses: 2.0.2 type-is: 1.6.18 utils-merge: 1.0.1 vary: 1.1.2 @@ -7481,8 +7574,8 @@ packages: /fastestsmallesttextencoderdecoder@1.0.22: resolution: {integrity: sha512-Pb8d48e+oIuY4MaM64Cd7OW1gt4nxCHs7/ddPPZ/Ic3sg8yVGM7O9wDvZ7us6ScaUupzM+pfBolwtYhN1IxBIw==} - /fastq@1.19.1: - resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + /fastq@1.20.1: + resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} dependencies: reusify: 1.1.0 dev: true @@ -7526,8 +7619,8 @@ packages: to-regex-range: 5.0.1 dev: true - /finalhandler@1.3.1: - resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} + /finalhandler@1.3.2: + resolution: {integrity: sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==} engines: {node: '>= 0.8'} dependencies: debug: 2.6.9 @@ -7535,7 +7628,7 @@ packages: escape-html: 1.0.3 on-finished: 2.4.1 parseurl: 1.3.3 - statuses: 2.0.1 + statuses: 2.0.2 unpipe: 1.0.0 transitivePeerDependencies: - supports-color @@ -7640,8 +7733,8 @@ packages: mime-types: 2.1.35 dev: true - /form-data@4.0.4: - resolution: {integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==} + /form-data@4.0.5: + resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} engines: {node: '>= 6'} dependencies: asynckit: 0.4.0 @@ -7833,8 +7926,8 @@ packages: get-intrinsic: 1.3.0 dev: true - /get-tsconfig@4.13.0: - resolution: {integrity: sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==} + /get-tsconfig@4.13.6: + resolution: {integrity: sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw==} dependencies: resolve-pkg-maps: 1.0.0 dev: true @@ -7845,8 +7938,8 @@ packages: assert-plus: 1.0.0 dev: true - /git-hooks-list@4.1.1: - resolution: {integrity: sha512-cmP497iLq54AZnv4YRAEMnEyQ1eIn4tGKbmswqwmFV4GBnAqE8NLtWxxdXa++AalfgL5EBH4IxTPyquEuGY/jA==} + /git-hooks-list@4.2.1: + resolution: {integrity: sha512-WNvqJjOxxs/8ZP9+DWdwWJ7cDsd60NHf39XnD82pDVrKO5q7xfPqpkK6hwEAmBa/ZSEE4IOoR75EzbbIuwGlMw==} dev: true /glob-parent@5.1.2: @@ -7865,7 +7958,7 @@ packages: /glob@7.1.7: resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} - deprecated: Glob versions prior to v9 are no longer supported + deprecated: Old versions of glob 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 exorbitant rates) by contacting i@izs.me dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -7877,7 +7970,7 @@ packages: /glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported + deprecated: Old versions of glob 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 exorbitant rates) by contacting i@izs.me dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -7890,7 +7983,7 @@ packages: /glob@8.1.0: resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} engines: {node: '>=12'} - deprecated: Glob versions prior to v9 are no longer supported + deprecated: Old versions of glob 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 exorbitant rates) by contacting i@izs.me dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -7902,7 +7995,7 @@ packages: /global@4.4.0: resolution: {integrity: sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==} dependencies: - min-document: 2.19.0 + min-document: 2.19.2 process: 0.11.10 dev: true @@ -7994,16 +8087,16 @@ packages: responselike: 3.0.0 dev: true - /gql.tada@1.8.13(graphql@16.11.0)(typescript@5.9.3): - resolution: {integrity: sha512-fYoorairdPgxtE7Sf1X9/6bSN9Kt2+PN8KLg3hcF8972qFnawwUgs1OLVU8efZMHwL7EBHhhKBhrsGPlOs2lZQ==} + /gql.tada@1.9.0(graphql@16.12.0)(typescript@5.9.3): + resolution: {integrity: sha512-1LMiA46dRs5oF7Qev6vMU32gmiNvM3+3nHoQZA9K9j2xQzH8xOAWnnJrLSbZOFHTSdFxqn86TL6beo1/7ja/aA==} hasBin: true peerDependencies: typescript: ^5.0.0 dependencies: - '@0no-co/graphql.web': 1.2.0(graphql@16.11.0) - '@0no-co/graphqlsp': 1.15.0(graphql@16.11.0)(typescript@5.9.3) - '@gql.tada/cli-utils': 1.7.1(@0no-co/graphqlsp@1.15.0)(graphql@16.11.0)(typescript@5.9.3) - '@gql.tada/internal': 1.0.8(graphql@16.11.0)(typescript@5.9.3) + '@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) + '@gql.tada/internal': 1.0.8(graphql@16.12.0)(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - '@gql.tada/svelte-support' @@ -8031,8 +8124,8 @@ packages: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} dev: true - /graphql@16.11.0: - resolution: {integrity: sha512-mS1lbMsxgQj6hge1XZ6p7GPhbrtFwUFYi3wRzXAC/FmYnyXMTvvI3td3rjmQ2u8ewXueaSvRPWaEcgVVOT9Jnw==} + /graphql@16.12.0: + resolution: {integrity: sha512-DKKrynuQRne0PNpEbzuEdHlYOMksHSUI8Zc9Unei5gTsMNA2/vMpoMz/yKba50pejK56qj98qM0SjYxAKi13gQ==} engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} dev: true @@ -8050,26 +8143,26 @@ packages: har-schema: 2.0.0 dev: true - /hardhat-contract-sizer@2.10.1(hardhat@2.26.4): + /hardhat-contract-sizer@2.10.1(hardhat@2.28.5): resolution: {integrity: sha512-/PPQQbUMgW6ERzk8M0/DA8/v2TEM9xRRAnF9qKPNMYF6FX5DFWcnxBsQvtp8uBz+vy7rmLyV9Elti2wmmhgkbg==} peerDependencies: hardhat: ^2.0.0 dependencies: chalk: 4.1.2 cli-table3: 0.6.5 - hardhat: 2.26.4(ts-node@10.9.2)(typescript@5.9.3) + hardhat: 2.28.5(ts-node@10.9.2)(typescript@5.9.3) strip-ansi: 6.0.1 dev: true - /hardhat-deploy-ethers@0.4.2(@nomicfoundation/hardhat-ethers@3.1.1)(hardhat-deploy@0.12.4)(hardhat@2.26.4): + /hardhat-deploy-ethers@0.4.2(@nomicfoundation/hardhat-ethers@3.1.3)(hardhat-deploy@0.12.4)(hardhat@2.28.5): resolution: {integrity: sha512-AskNH/XRYYYqPT94MvO5s1yMi+/QvoNjS4oU5VcVqfDU99kgpGETl+uIYHIrSXtH5sy7J6gyVjpRMf4x0tjLSQ==} peerDependencies: '@nomicfoundation/hardhat-ethers': ^3.0.2 hardhat: ^2.16.0 hardhat-deploy: ^0.12.1 dependencies: - '@nomicfoundation/hardhat-ethers': 3.1.1(ethers@5.8.0)(hardhat@2.26.4) - hardhat: 2.26.4(ts-node@10.9.2)(typescript@5.9.3) + '@nomicfoundation/hardhat-ethers': 3.1.3(ethers@5.8.0)(hardhat@2.28.5) + hardhat: 2.28.5(ts-node@10.9.2)(typescript@5.9.3) hardhat-deploy: 0.12.4 dev: true @@ -8094,20 +8187,20 @@ packages: debug: 4.4.3(supports-color@8.1.1) enquirer: 2.4.1 ethers: 5.8.0 - form-data: 4.0.4 + form-data: 4.0.5 fs-extra: 10.1.0 match-all: 1.2.7 murmur-128: 0.2.1 - qs: 6.14.0 - zksync-ethers: 5.11.0(ethers@5.8.0) + qs: 6.14.1 + zksync-ethers: 5.11.1(ethers@5.8.0) transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate dev: true - /hardhat@2.26.4(ts-node@10.9.2)(typescript@5.9.3): - resolution: {integrity: sha512-2FMv6mmgR2ryefD3k23vRBYMqjdmZw0EhyXwu18Sz6BVRUAon9h8CjcEtVH4U3fHWPqZ4Pqr81h7s6p0RYAvLg==} + /hardhat@2.28.5(ts-node@10.9.2)(typescript@5.9.3): + resolution: {integrity: sha512-AlTvFAiLYXdy732uyzVWMFw5qjEpfAI0x9xMNe73cBzzD98ST783EaElDzbOXddJ7ro1Z3447FbO0xSinXfTVA==} hasBin: true peerDependencies: ts-node: '*' @@ -8120,7 +8213,7 @@ packages: dependencies: '@ethereumjs/util': 9.1.0 '@ethersproject/abi': 5.8.0 - '@nomicfoundation/edr': 0.11.3 + '@nomicfoundation/edr': 0.12.0-next.23 '@nomicfoundation/solidity-analyzer': 0.1.2 '@sentry/node': 5.30.0 adm-zip: 0.4.16 @@ -8140,20 +8233,20 @@ packages: io-ts: 1.10.4 json-stream-stringify: 3.1.6 keccak: 3.0.4 - lodash: 4.17.21 + 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.2 + 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 - ts-node: 10.9.2(@swc/core@1.14.0)(@types/node@18.18.14)(typescript@5.9.3) + ts-node: 10.9.2(@swc/core@1.15.11)(@types/node@18.18.14)(typescript@5.9.3) tsort: 0.0.1 typescript: 5.9.3 undici: 5.29.0 @@ -8249,14 +8342,14 @@ packages: resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} dev: true - /http-errors@2.0.0: - resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + /http-errors@2.0.1: + resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} engines: {node: '>= 0.8'} dependencies: depd: 2.0.0 inherits: 2.0.4 setprototypeof: 1.2.0 - statuses: 2.0.1 + statuses: 2.0.2 toidentifier: 1.0.1 dev: true @@ -8438,7 +8531,7 @@ packages: code-excerpt: 3.0.0 indent-string: 4.0.0 is-ci: 2.0.0 - lodash: 4.17.21 + lodash: 4.17.23 patch-console: 1.0.0 react: 17.0.2 react-devtools-core: 4.28.5 @@ -8545,7 +8638,7 @@ packages: /is-bun-module@2.0.0: resolution: {integrity: sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==} dependencies: - semver: 7.7.3 + semver: 7.7.4 dev: true /is-callable@1.2.7: @@ -8734,7 +8827,7 @@ packages: resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} engines: {node: '>= 0.4'} dependencies: - which-typed-array: 1.1.19 + which-typed-array: 1.1.20 /is-typedarray@1.0.0: resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} @@ -8792,6 +8885,14 @@ packages: dependencies: ws: 7.5.10 + /isows@1.0.7(ws@8.18.3): + resolution: {integrity: sha512-I1fSfDCZL5P0v33sVqeTDSpcstAg/N+wF5HS033mogOVIp4B+oHC7oOCsA3axAbBSGTJ8QubbNmnIRN/h8U7hg==} + peerDependencies: + ws: '*' + dependencies: + ws: 8.18.3 + dev: true + /isstream@0.1.2: resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} dev: true @@ -8805,8 +8906,8 @@ packages: resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} engines: {node: '>=8'} dependencies: - '@babel/core': 7.28.5 - '@babel/parser': 7.28.5 + '@babel/core': 7.29.0 + '@babel/parser': 7.29.0 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 6.3.1 @@ -8818,11 +8919,11 @@ packages: resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==} engines: {node: '>=10'} dependencies: - '@babel/core': 7.28.5 - '@babel/parser': 7.28.5 + '@babel/core': 7.29.0 + '@babel/parser': 7.29.0 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 - semver: 7.7.3 + semver: 7.7.4 transitivePeerDependencies: - supports-color dev: true @@ -8855,8 +8956,8 @@ packages: istanbul-lib-report: 3.0.1 dev: true - /jayson@4.2.0: - resolution: {integrity: sha512-VfJ9t1YLwacIubLhONk0KFeosUBwstRWQ0IRT1KDjEjnVnSOVHC3uwugyV7L0c7R9lpVyrUGT2XWiBA1UTtpyg==} + /jayson@4.3.0: + resolution: {integrity: sha512-AauzHcUcqs8OBnCHOkJY280VaTiCm57AbuO7lqzcw7JapGj50BisE3xhksye4zlTSR1+1tAz67wLTl8tEH1obQ==} engines: {node: '>=8'} hasBin: true dependencies: @@ -8896,7 +8997,7 @@ packages: '@types/node': 18.18.14 chalk: 4.1.2 co: 4.6.0 - dedent: 1.7.0 + dedent: 1.7.1 is-generator-fn: 2.1.0 jest-each: 29.7.0 jest-matcher-utils: 29.7.0 @@ -8954,11 +9055,11 @@ packages: ts-node: optional: true dependencies: - '@babel/core': 7.28.5 + '@babel/core': 7.29.0 '@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) + babel-jest: 29.7.0(@babel/core@7.29.0) chalk: 4.1.2 ci-info: 3.9.0 deepmerge: 4.3.1 @@ -8977,7 +9078,7 @@ packages: pretty-format: 29.7.0 slash: 3.0.0 strip-json-comments: 3.1.1 - ts-node: 10.9.2(@swc/core@1.14.0)(@types/node@18.18.14)(typescript@5.9.3) + ts-node: 10.9.2(@swc/core@1.15.11)(@types/node@18.18.14)(typescript@5.9.3) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -9069,7 +9170,7 @@ packages: resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/code-frame': 7.27.1 + '@babel/code-frame': 7.29.0 '@jest/types': 29.6.3 '@types/stack-utils': 2.0.3 chalk: 4.1.2 @@ -9199,15 +9300,15 @@ packages: resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/core': 7.28.5 - '@babel/generator': 7.28.5 - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.5) - '@babel/types': 7.28.5 + '@babel/core': 7.29.0 + '@babel/generator': 7.29.1 + '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.29.0) + '@babel/types': 7.29.0 '@jest/expect-utils': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - babel-preset-current-node-syntax: 1.2.0(@babel/core@7.28.5) + babel-preset-current-node-syntax: 1.2.0(@babel/core@7.29.0) chalk: 4.1.2 expect: 29.7.0 graceful-fs: 4.2.11 @@ -9218,7 +9319,7 @@ packages: jest-util: 29.7.0 natural-compare: 1.4.0 pretty-format: 29.7.0 - semver: 7.7.3 + semver: 7.7.4 transitivePeerDependencies: - supports-color dev: true @@ -9307,16 +9408,16 @@ packages: /js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - /js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + /js-yaml@3.14.2: + resolution: {integrity: sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==} hasBin: true dependencies: argparse: 1.0.10 esprima: 4.0.1 dev: true - /js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + /js-yaml@4.1.1: + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} hasBin: true dependencies: argparse: 2.0.1 @@ -9378,6 +9479,7 @@ packages: /json5@1.0.2: resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} hasBin: true + requiresBuild: true dependencies: minimist: 1.2.8 dev: true @@ -9632,8 +9734,8 @@ packages: resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} dev: true - /lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + /lodash@4.17.23: + resolution: {integrity: sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==} dev: true /log-symbols@4.1.0: @@ -9712,7 +9814,7 @@ packages: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} engines: {node: '>=10'} dependencies: - semver: 7.7.3 + semver: 7.7.4 dev: true /make-error@1.3.6: @@ -9900,8 +10002,8 @@ packages: engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: true - /min-document@2.19.0: - resolution: {integrity: sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==} + /min-document@2.19.2: + resolution: {integrity: sha512-8S5I8db/uZN8r9HSLFVWPdJCvYOejMcEC82VIzNUc6Zkklf/d1gg2psfE79/vyhWOj4+J8MtwmoOz3TmvaGu5A==} dependencies: dom-walk: 0.1.2 dev: true @@ -9993,12 +10095,12 @@ packages: browser-stdout: 1.3.1 chokidar: 3.6.0 debug: 4.4.3(supports-color@8.1.1) - diff: 5.2.0 + 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.0 + js-yaml: 4.1.1 log-symbols: 4.1.0 minimatch: 5.1.6 ms: 2.1.3 @@ -10156,8 +10258,8 @@ packages: engines: {node: '>=10'} dev: true - /normalize-url@8.1.0: - resolution: {integrity: sha512-X06Mfd/5aKsRHc0O0J5CUedwnPmnDtLF2+nq+KN9KSDlJHkPuh0JUviWjEWMe0SW/9TDdSLVPuk7L5gGTIA1/w==} + /normalize-url@8.1.1: + resolution: {integrity: sha512-JYc0DPlpGWB40kH5g07gGTrYuMqV653k3uBKY6uITPWds3M0ov3GaWGp9lbE3Bzngx8+XkfzgvASb9vk9JDFXQ==} engines: {node: '>=14.16'} dev: true @@ -10228,7 +10330,7 @@ packages: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.24.0 + es-abstract: 1.24.1 es-object-atoms: 1.1.1 dev: true @@ -10238,7 +10340,7 @@ packages: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.24.0 + es-abstract: 1.24.1 dev: true /object.values@1.2.1: @@ -10325,6 +10427,27 @@ packages: safe-push-apply: 1.0.0 dev: true + /ox@0.11.3(typescript@5.9.3)(zod@3.25.76): + resolution: {integrity: sha512-1bWYGk/xZel3xro3l8WGg6eq4YEKlaqvyMtVhfMFpbJzK2F6rj4EDRtqDCWVEJMkzcmEi9uW2QxsqELokOlarw==} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + 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 + typescript: 5.9.3 + transitivePeerDependencies: + - zod + dev: true + /p-cancelable@2.1.1: resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} engines: {node: '>=8'} @@ -10407,9 +10530,9 @@ packages: engines: {node: '>=14.16'} dependencies: got: 12.6.1 - registry-auth-token: 5.1.0 + registry-auth-token: 5.1.1 registry-url: 6.0.1 - semver: 7.7.3 + semver: 7.7.4 dev: true /pako@2.1.0: @@ -10438,7 +10561,7 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} dependencies: - '@babel/code-frame': 7.27.1 + '@babel/code-frame': 7.29.0 error-ex: 1.3.4 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -10615,35 +10738,34 @@ packages: engines: {node: '>= 0.8.0'} dev: true - /prettier-linter-helpers@1.0.0: - resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + /prettier-linter-helpers@1.0.1: + resolution: {integrity: sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg==} engines: {node: '>=6.0.0'} dependencies: fast-diff: 1.3.0 dev: true - /prettier-plugin-packagejson@2.5.19(prettier@3.6.2): - resolution: {integrity: sha512-Qsqp4+jsZbKMpEGZB1UP1pxeAT8sCzne2IwnKkr+QhUe665EXUo3BAvTf1kAPCqyMv9kg3ZmO0+7eOni/C6Uag==} + /prettier-plugin-packagejson@2.5.22(prettier@3.8.1): + resolution: {integrity: sha512-G6WalmoUssKF8ZXkni0+n4324K+gG143KPysSQNW+FrR0XyNb3BdRxchGC/Q1FE/F702p7/6KU7r4mv0WSWbzA==} peerDependencies: prettier: '>= 1.16.0' peerDependenciesMeta: prettier: optional: true dependencies: - prettier: 3.6.2 - sort-package-json: 3.4.0 - synckit: 0.11.11 + prettier: 3.8.1 + sort-package-json: 3.6.0 dev: true - /prettier-plugin-solidity@1.4.3(prettier@3.6.2): + /prettier-plugin-solidity@1.4.3(prettier@3.8.1): resolution: {integrity: sha512-Mrr/iiR9f9IaeGRMZY2ApumXcn/C5Gs3S7B7hWB3gigBFML06C0yEyW86oLp0eqiA0qg+46FaChgLPJCj/pIlg==} engines: {node: '>=18'} peerDependencies: prettier: '>=2.3.0' dependencies: '@solidity-parser/parser': 0.20.2 - prettier: 3.6.2 - semver: 7.7.3 + prettier: 3.8.1 + semver: 7.7.4 dev: true /prettier@2.8.8: @@ -10652,8 +10774,8 @@ packages: hasBin: true dev: true - /prettier@3.6.2: - resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} + /prettier@3.8.1: + resolution: {integrity: sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==} engines: {node: '>=14'} hasBin: true dev: true @@ -10766,15 +10888,23 @@ packages: resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} dev: true - /qs@6.13.0: - resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} - engines: {node: '>=0.6'} + /pvtsutils@1.3.6: + resolution: {integrity: sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==} + requiresBuild: true dependencies: - side-channel: 1.1.0 + tslib: 2.8.1 + dev: true + optional: true + + /pvutils@1.1.5: + resolution: {integrity: sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA==} + engines: {node: '>=16.0.0'} + requiresBuild: true dev: true + optional: true - /qs@6.14.0: - resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} + /qs@6.14.1: + resolution: {integrity: sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==} engines: {node: '>=0.6'} dependencies: side-channel: 1.1.0 @@ -10823,12 +10953,12 @@ packages: engines: {node: '>= 0.6'} dev: true - /raw-body@2.5.2: - resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + /raw-body@2.5.3: + resolution: {integrity: sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==} engines: {node: '>= 0.8'} dependencies: bytes: 3.1.2 - http-errors: 2.0.0 + http-errors: 2.0.1 iconv-lite: 0.4.24 unpipe: 1.0.0 dev: true @@ -10958,7 +11088,7 @@ packages: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.24.0 + es-abstract: 1.24.1 es-errors: 1.3.0 es-object-atoms: 1.1.1 get-intrinsic: 1.3.0 @@ -10978,11 +11108,11 @@ packages: set-function-name: 2.0.2 dev: true - /registry-auth-token@5.1.0: - resolution: {integrity: sha512-GdekYuwLXLxMuFTwAPg5UKGLW/UXzQrZvH/Zj791BQif5T05T0RsaLfHc9q3ZOKi7n+BoprPD9mJ0O0k4xzUlw==} + /registry-auth-token@5.1.1: + resolution: {integrity: sha512-P7B4+jq8DeD2nMsAcdfaqHbssgHtZ7Z5+++a5ask90fvmJ8p5je4mOa+wzu+DB4vQ5tdJV/xywY+UnVFeQLV5Q==} engines: {node: '>=14'} dependencies: - '@pnpm/npm-conf': 2.3.1 + '@pnpm/npm-conf': 3.0.2 dev: true /registry-url@6.0.1: @@ -11148,18 +11278,18 @@ packages: bn.js: 5.2.2 dev: true - /rpc-websockets@9.2.0: - resolution: {integrity: sha512-DS/XHdPxplQTtNRKiBCRWGBJfjOk56W7fyFUpiYi9fSTWTzoEMbUkn3J4gB0IMniIEVeAGR1/rzFQogzD5MxvQ==} + /rpc-websockets@9.3.3: + resolution: {integrity: sha512-OkCsBBzrwxX4DoSv4Zlf9DgXKRB0MzVfCFg5MC+fNnf9ktr4SMWjsri0VNZQlDbCnGcImT6KNEv4ZoxktQhdpA==} dependencies: - '@swc/helpers': 0.5.17 + '@swc/helpers': 0.5.18 '@types/uuid': 8.3.4 '@types/ws': 8.18.1 buffer: 6.0.3 - eventemitter3: 5.0.1 + eventemitter3: 5.0.4 uuid: 8.3.2 - ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + ws: 8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) optionalDependencies: - bufferutil: 4.0.9 + bufferutil: 4.1.0 utf-8-validate: 5.0.10 /run-parallel@1.2.0: @@ -11277,23 +11407,29 @@ packages: hasBin: true dev: true - /send@0.19.0: - resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} + /semver@7.7.4: + resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} + engines: {node: '>=10'} + hasBin: true + dev: true + + /send@0.19.2: + resolution: {integrity: sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==} engines: {node: '>= 0.8.0'} dependencies: debug: 2.6.9 depd: 2.0.0 destroy: 1.2.0 - encodeurl: 1.0.2 + encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 fresh: 0.5.2 - http-errors: 2.0.0 + 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.1 + statuses: 2.0.2 transitivePeerDependencies: - supports-color dev: true @@ -11304,14 +11440,14 @@ packages: randombytes: 2.1.0 dev: true - /serve-static@1.16.2: - resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} + /serve-static@1.16.3: + resolution: {integrity: sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==} engines: {node: '>= 0.8.0'} dependencies: encodeurl: 2.0.0 escape-html: 1.0.3 parseurl: 1.3.3 - send: 0.19.0 + send: 0.19.2 transitivePeerDependencies: - supports-color dev: true @@ -11320,9 +11456,9 @@ packages: resolution: {integrity: sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==} engines: {node: '>=6'} dependencies: - body-parser: 1.20.3 - cors: 2.8.5 - express: 4.21.2 + body-parser: 1.20.4 + cors: 2.8.6 + express: 4.22.1 request: 2.88.2 xhr: 2.6.0 transitivePeerDependencies: @@ -11545,11 +11681,11 @@ packages: fast-diff: 1.3.0 glob: 8.1.0 ignore: 5.3.2 - js-yaml: 4.1.0 + js-yaml: 4.1.1 latest-version: 7.0.0 - lodash: 4.17.21 + lodash: 4.17.23 pluralize: 8.0.0 - semver: 7.7.3 + semver: 7.7.4 strip-ansi: 6.0.1 table: 6.9.0 text-table: 0.2.0 @@ -11569,21 +11705,21 @@ packages: atomic-sleep: 1.0.0 dev: true - /sort-object-keys@1.1.3: - resolution: {integrity: sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg==} + /sort-object-keys@2.1.0: + resolution: {integrity: sha512-SOiEnthkJKPv2L6ec6HMwhUcN0/lppkeYuN1x63PbyPRrgSPIuBJCiYxYyvWRTtjMlOi14vQUCGUJqS6PLVm8g==} dev: true - /sort-package-json@3.4.0: - resolution: {integrity: sha512-97oFRRMM2/Js4oEA9LJhjyMlde+2ewpZQf53pgue27UkbEXfHJnDzHlUxQ/DWUkzqmp7DFwJp8D+wi/TYeQhpA==} + /sort-package-json@3.6.0: + resolution: {integrity: sha512-fyJsPLhWvY7u2KsKPZn1PixbXp+1m7V8NWqU8CvgFRbMEX41Ffw1kD8n0CfJiGoaSfoAvbrqRRl/DcHO8omQOQ==} engines: {node: '>=20'} hasBin: true dependencies: detect-indent: 7.0.2 detect-newline: 4.0.1 - git-hooks-list: 4.1.1 + git-hooks-list: 4.2.1 is-plain-obj: 4.1.0 - semver: 7.7.3 - sort-object-keys: 1.1.3 + semver: 7.7.4 + sort-object-keys: 2.1.0 tinyglobby: 0.2.15 dev: true @@ -11675,8 +11811,8 @@ packages: type-fest: 0.7.1 dev: true - /statuses@2.0.1: - resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + /statuses@2.0.2: + resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} engines: {node: '>= 0.8'} dev: true @@ -11744,7 +11880,7 @@ packages: call-bound: 1.0.4 define-data-property: 1.1.4 define-properties: 1.2.1 - es-abstract: 1.24.0 + es-abstract: 1.24.1 es-object-atoms: 1.1.1 has-property-descriptors: 1.0.2 dev: true @@ -11804,6 +11940,7 @@ packages: /strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} + requiresBuild: true dev: true /strip-bom@4.0.0: @@ -11890,8 +12027,8 @@ packages: resolution: {integrity: sha512-YQSL4duoHmLhsTD1Pw8RW6TZ5MaTX5rXJnqacJottr2P2LZBF/Yvrc3ku4NUpMOm8aM0KOCqM+UAkMA5HWQCzQ==} dev: true - /synckit@0.11.11: - resolution: {integrity: sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==} + /synckit@0.11.12: + resolution: {integrity: sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==} engines: {node: ^14.18.0 || >=16.0.0} dependencies: '@pkgr/core': 0.2.9 @@ -11932,6 +12069,7 @@ packages: /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 exorbitant rates) by contacting i@izs.me dependencies: chownr: 1.1.4 fs-minipass: 1.2.7 @@ -12073,19 +12211,19 @@ packages: /tronweb@5.3.4: resolution: {integrity: sha512-79HEnwSAqyCKrT7QB8dkxad0RqYx3dSulEg4dfBQQVwzhRr+AqdE1yz+nfTUpftu54RejqaHjqz40ZzWNy077w==} dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.6 '@ethersproject/abi': 5.8.0 '@tronweb3/google-protobuf': 3.21.4 - axios: 1.13.1 + axios: 1.13.5 bignumber.js: 9.3.1 ethereum-cryptography: 2.2.1 ethers: 5.8.0 eventemitter3: 3.1.2 injectpromise: 1.0.0 - lodash: 4.17.21 + lodash: 4.17.23 querystring-es3: 0.2.1 semver: 5.7.2 - validator: 13.15.20 + validator: 13.15.26 transitivePeerDependencies: - bufferutil - debug @@ -12119,7 +12257,20 @@ packages: typescript: 5.9.3 dev: true - /ts-node@10.9.2(@swc/core@1.14.0)(@types/node@18.18.14)(typescript@5.9.3): + /ts-mocha@10.1.0(mocha@10.8.2): + resolution: {integrity: sha512-T0C0Xm3/WqCuF2tpa0GNGESTBoKZaiqdUP8guNv4ZY316AFXlyidnrzQ1LUrCT0Wb1i3J0zFTgOh/55Un44WdA==} + engines: {node: '>= 6.X.X'} + hasBin: true + peerDependencies: + mocha: ^3.X.X || ^4.X.X || ^5.X.X || ^6.X.X || ^7.X.X || ^8.X.X || ^9.X.X || ^10.X.X || ^11.X.X + dependencies: + mocha: 10.8.2 + ts-node: 7.0.1 + optionalDependencies: + tsconfig-paths: 3.15.0 + dev: true + + /ts-node@10.9.2(@swc/core@1.15.11)(@types/node@18.18.14)(typescript@5.9.3): resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} hasBin: true peerDependencies: @@ -12134,8 +12285,8 @@ packages: optional: true dependencies: '@cspotcode/source-map-support': 0.8.1 - '@swc/core': 1.14.0 - '@tsconfig/node10': 1.0.11 + '@swc/core': 1.15.11 + '@tsconfig/node10': 1.0.12 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 @@ -12144,13 +12295,28 @@ packages: acorn-walk: 8.3.4 arg: 4.1.3 create-require: 1.1.1 - diff: 4.0.2 + diff: 4.0.4 make-error: 1.3.6 typescript: 5.9.3 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 dev: true + /ts-node@7.0.1: + resolution: {integrity: sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==} + engines: {node: '>=4.2.0'} + hasBin: true + dependencies: + arrify: 1.0.1 + buffer-from: 1.1.2 + diff: 3.5.1 + make-error: 1.3.6 + minimist: 1.2.8 + mkdirp: 0.5.6 + source-map-support: 0.5.21 + yn: 2.0.0 + dev: true + /tsconfig-paths@3.15.0: resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} dependencies: @@ -12255,7 +12421,7 @@ packages: fs-extra: 7.0.1 glob: 7.1.7 js-sha3: 0.8.0 - lodash: 4.17.21 + lodash: 4.17.23 mkdirp: 1.0.4 prettier: 2.8.8 ts-command-line-args: 2.5.1 @@ -12402,13 +12568,13 @@ packages: '@unrs/resolver-binding-win32-x64-msvc': 1.11.1 dev: true - /update-browserslist-db@1.1.4(browserslist@4.27.0): - resolution: {integrity: sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==} + /update-browserslist-db@1.2.3(browserslist@4.28.1): + resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' dependencies: - browserslist: 4.27.0 + browserslist: 4.28.1 escalade: 3.2.0 picocolors: 1.1.1 dev: true @@ -12428,7 +12594,7 @@ packages: engines: {node: '>= 0.4'} dependencies: punycode: 1.4.1 - qs: 6.14.0 + qs: 6.14.1 dev: true /utf-8-validate@5.0.10: @@ -12462,7 +12628,7 @@ packages: is-arguments: 1.2.0 is-generator-function: 1.1.2 is-typed-array: 1.1.15 - which-typed-array: 1.1.19 + which-typed-array: 1.1.20 /utils-merge@1.0.1: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} @@ -12497,10 +12663,6 @@ packages: convert-source-map: 2.0.0 dev: true - /valibot@0.36.0: - resolution: {integrity: sha512-CjF1XN4sUce8sBK9TixrDqFM7RwNkuXdJu174/AwmQUB62QbCQADg5lLe8ldBalFgtj1uKj+pKwDJiNo4Mn+eQ==} - dev: true - /valibot@0.37.0(typescript@5.9.3): resolution: {integrity: sha512-FQz52I8RXgFgOHym3XHYSREbNtkgSjF9prvMFH1nBsRyfL6SfCzoT1GuSDTlbsuPubM7/6Kbw0ZMQb8A+V+VsQ==} peerDependencies: @@ -12512,6 +12674,17 @@ packages: typescript: 5.9.3 dev: true + /valibot@1.2.0(typescript@5.9.3): + resolution: {integrity: sha512-mm1rxUsmOxzrwnX5arGS+U4T25RdvpPjPN4yR0u9pUBov9+zGVtO84tif1eY4r6zWxVxu3KzIyknJy3rxfRZZg==} + peerDependencies: + typescript: '>=5' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + typescript: 5.9.3 + dev: true + /validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} dependencies: @@ -12519,8 +12692,8 @@ packages: spdx-expression-parse: 3.0.1 dev: true - /validator@13.15.20: - resolution: {integrity: sha512-KxPOq3V2LmfQPP4eqf3Mq/zrT0Dqp2Vmx2Bn285LwVahLc+CsxOM0crBHczm8ijlcjZ0Q5Xd6LW3z3odTPnlrw==} + /validator@13.15.26: + resolution: {integrity: sha512-spH26xU080ydGggxRyR1Yhcbgx+j3y5jbNXk/8L+iRvdIEQ4uTRH2Sgf2dokud6Q4oAtsbNvJ1Ft+9xmm6IZcA==} engines: {node: '>= 0.10'} dev: true @@ -12542,6 +12715,29 @@ packages: extsprintf: 1.3.0 dev: true + /viem@2.45.2(typescript@5.9.3)(zod@3.25.76): + resolution: {integrity: sha512-GXPMmj0ukqFNL87sgpsZBy4CjGvsFQk42/EUdsn8dv3ZWtL4ukDXNCM0nME2hU0IcuS29CuUbrwbZN6iWxAipw==} + peerDependencies: + typescript: '>=5.0.4' + peerDependenciesMeta: + typescript: + optional: true + 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) + ox: 0.11.3(typescript@5.9.3)(zod@3.25.76) + typescript: 5.9.3 + ws: 8.18.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod + dev: true + /walker@1.0.8: resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} dependencies: @@ -12828,7 +13024,7 @@ packages: resolution: {integrity: sha512-/REy6amwPZl44DDzvRCkaI1q1bIiQB0mEFQLUrhz3z2EK91cp3n72rAjUlrTP0zV22HJIUOVHQGPxhFRjxjt+Q==} engines: {node: '>=4.0.0'} dependencies: - bufferutil: 4.0.9 + bufferutil: 4.1.0 debug: 2.6.9 es5-ext: 0.10.64 typedarray-to-buffer: 3.1.5 @@ -12871,7 +13067,7 @@ packages: isarray: 2.0.5 which-boxed-primitive: 1.1.1 which-collection: 1.0.2 - which-typed-array: 1.1.19 + which-typed-array: 1.1.20 dev: true /which-collection@1.0.2: @@ -12888,8 +13084,8 @@ packages: resolution: {integrity: sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ==} dev: true - /which-typed-array@1.1.19: - resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} + /which-typed-array@1.1.20: + resolution: {integrity: sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==} engines: {node: '>= 0.4'} dependencies: available-typed-arrays: 1.0.7 @@ -12936,8 +13132,8 @@ packages: triple-beam: 1.4.1 dev: true - /winston@3.18.3: - resolution: {integrity: sha512-NoBZauFNNWENgsnC9YpgyYwOVrl2m58PpQ8lNHjV3kosGs7KJ7Npk9pCUE+WJlawVSe8mykWDKWFSVfs3QO9ww==} + /winston@3.19.0: + resolution: {integrity: sha512-LZNJgPzfKR+/J3cHkxcpHKpKKvGfDZVPS4hfJCc4cCG0CgYzvlD6yE/S3CIL/Yt91ak327YCpiF/0MyeZHEHKA==} engines: {node: '>= 12.0.0'} dependencies: '@colors/colors': 1.6.0 @@ -13049,9 +13245,22 @@ packages: optional: true dev: true - /ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10): + /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 + dev: true + + /ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10): + resolution: {integrity: sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==} + engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 utf-8-validate: '>=5.0.2' @@ -13061,7 +13270,7 @@ packages: utf-8-validate: optional: true dependencies: - bufferutil: 4.0.9 + bufferutil: 4.1.0 utf-8-validate: 5.0.10 /xhr-request-promise@0.1.3: @@ -13187,6 +13396,11 @@ packages: yargs-parser: 2.4.1 dev: true + /yn@2.0.0: + resolution: {integrity: sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==} + engines: {node: '>=4'} + dev: true + /yn@3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} engines: {node: '>=6'} @@ -13204,8 +13418,8 @@ packages: '@types/yoga-layout': 1.9.2 dev: true - /zksync-ethers@5.11.0(ethers@5.8.0): - resolution: {integrity: sha512-oLwfjfVfHYjxMeDjmB3Kb+I0W0fwau5k6ZFSJJS0/gEYyu5A6AZIJV08NP/RnG30V5XP46u6Ld3Dw6HYkESJ+A==} + /zksync-ethers@5.11.1(ethers@5.8.0): + resolution: {integrity: sha512-Znl2p0gporGnHbAO0KKM1TIQpyRQKCi8nf1kOlZuTVCvlgBwhweWjTy53le96ZOoR3J5LUXAk7aYil2czSLJZw==} engines: {node: '>=16.0.0'} peerDependencies: ethers: ^5.7.2 diff --git a/examples/oft-solana/scripts/resolve-oft-id.js b/examples/oft-solana/scripts/resolve-oft-id.js new file mode 100644 index 0000000000..e941a4b2bb --- /dev/null +++ b/examples/oft-solana/scripts/resolve-oft-id.js @@ -0,0 +1,28 @@ +#!/usr/bin/env node +'use strict'; + +// This script is used specifically in the `test:anchor` npm script to resolve +// the OFT program ID and output it to stdout. The test/anchor/constants.ts file +// has its own implementation since it needs the value at TypeScript import time. + +const fs = require('fs'); + +const { Keypair } = require('@solana/web3.js'); + +const keypairPath = 'target/deploy/oft-keypair.json'; +const fallbackId = '9UovNrJD8pQyBLheeHNayuG1wJSEAoxkmM14vw5gcsTT'; + +function resolveOftId() { + try { + if (!fs.existsSync(keypairPath)) { + return fallbackId; + } + + const secret = JSON.parse(fs.readFileSync(keypairPath, 'utf8')); + return Keypair.fromSecretKey(Uint8Array.from(secret)).publicKey.toBase58(); + } catch (error) { + return fallbackId; + } +} + +process.stdout.write(resolveOftId()); diff --git a/examples/oft-solana/tasks/aptos/aptosEndpointV2.ts b/examples/oft-solana/tasks/aptos/aptosEndpointV2.ts index 4ff52e84d1..11df3242f5 100644 --- a/examples/oft-solana/tasks/aptos/aptosEndpointV2.ts +++ b/examples/oft-solana/tasks/aptos/aptosEndpointV2.ts @@ -11,6 +11,7 @@ import { Uln302SetExecutorConfig, Uln302SetUlnConfig, Uln302UlnConfig, + Uln302UlnUserConfig, UlnReadSetUlnConfig, UlnReadUlnConfig, UlnReadUlnUserConfig, @@ -262,7 +263,7 @@ export class AptosEndpointV2 implements IEndpointV2 { _oapp: OmniAddress, _uln: OmniAddress, _eid: EndpointId, - _config: any, + _config: Uln302UlnUserConfig, _type: Uln302ConfigType ) { return false diff --git a/examples/oft-solana/tasks/aptos/aptosSdkFactory.ts b/examples/oft-solana/tasks/aptos/aptosSdkFactory.ts index a6b6aec3a0..7154058395 100644 --- a/examples/oft-solana/tasks/aptos/aptosSdkFactory.ts +++ b/examples/oft-solana/tasks/aptos/aptosSdkFactory.ts @@ -1,4 +1,4 @@ -import { OmniAddress, OmniPoint, OmniTransaction } from '@layerzerolabs/devtools' +import { Bytes, OmniAddress, OmniPoint, OmniTransaction } from '@layerzerolabs/devtools' import { ChainType, EndpointId, endpointIdToChainType } from '@layerzerolabs/lz-definitions' import { IOApp, OAppEnforcedOptionParam } from '@layerzerolabs/ua-devtools' @@ -49,8 +49,8 @@ export function createAptosOAppFactory() { async isDelegate(): Promise { return false }, - async getEnforcedOptions(): Promise { - return {} + async getEnforcedOptions(_eid: EndpointId, _msgType: number): Promise { + return '0x' }, async setEnforcedOptions(enforcedOptions: OAppEnforcedOptionParam[]): Promise { return createStubTransaction(`setEnforcedOptions(${enforcedOptions.length} options)`) diff --git a/examples/oft-solana/tasks/common/config.get.ts b/examples/oft-solana/tasks/common/config.get.ts index 4d065849af..880e567fe9 100644 --- a/examples/oft-solana/tasks/common/config.get.ts +++ b/examples/oft-solana/tasks/common/config.get.ts @@ -54,7 +54,7 @@ const getNetworkName = (eid: EndpointId) => { if (hardhatUnsupportedEids.includes(eid)) { return `${chainName}-${env}` } else { - return getNetworkNameForEid(eid as any) + return getNetworkNameForEid(eid) } } diff --git a/examples/oft-solana/tasks/common/types.ts b/examples/oft-solana/tasks/common/types.ts index 2c4bf0d940..1d5e954e02 100644 --- a/examples/oft-solana/tasks/common/types.ts +++ b/examples/oft-solana/tasks/common/types.ts @@ -7,7 +7,11 @@ export const keyPair: CLIArgumentType = { parse(name: string, value: string) { return Keypair.fromSecretKey(decode(value)) }, - validate() {}, + validate(name: string, value: unknown) { + if (!(value instanceof Keypair)) { + throw new Error(`${name} is not a valid Keypair`) + } + }, } export const publicKey: CLIArgumentType = { @@ -15,7 +19,11 @@ export const publicKey: CLIArgumentType = { parse(name: string, value: string) { return new PublicKey(value) }, - validate() {}, + validate(name: string, value: unknown) { + if (!(value instanceof PublicKey)) { + throw new Error(`${name} is not a valid PublicKey`) + } + }, } export interface SendResult { diff --git a/examples/oft-solana/tasks/common/wire.ts b/examples/oft-solana/tasks/common/wire.ts index 522d31546b..692f980ad4 100644 --- a/examples/oft-solana/tasks/common/wire.ts +++ b/examples/oft-solana/tasks/common/wire.ts @@ -163,7 +163,7 @@ task(TASK_LZ_OAPP_WIRE) try { // Use the SDK to check if configs exist - const [sendConfig, receiveConfig] = await getSolanaUlnConfigPDAs( + const [_sendConfig, _receiveConfig] = await getSolanaUlnConfigPDAs( connection.vector.to.eid, await connectionFactory(connection.vector.from.eid), new PublicKey(connection.config.sendLibrary), diff --git a/examples/oft-solana/tasks/evm/sendEvm.ts b/examples/oft-solana/tasks/evm/sendEvm.ts index b5bddd5055..3953b96ba0 100644 --- a/examples/oft-solana/tasks/evm/sendEvm.ts +++ b/examples/oft-solana/tasks/evm/sendEvm.ts @@ -50,9 +50,13 @@ export async function sendEvm( 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! + if (wrapper.contract.contractName) { + wrapperAddress = (await srcEidHre.deployments.get(wrapper.contract.contractName)).address + } else if (wrapper.contract.address) { + wrapperAddress = wrapper.contract.address + } else { + throw new Error(`No contract address found for EID ${srcEid}`) + } } // 2️⃣ load OFT ABI const oftArtifact = await srcEidHre.artifacts.readArtifact('OFT') diff --git a/examples/oft-solana/tasks/solana/index.ts b/examples/oft-solana/tasks/solana/index.ts index 996087bad0..c07b43842c 100644 --- a/examples/oft-solana/tasks/solana/index.ts +++ b/examples/oft-solana/tasks/solana/index.ts @@ -181,10 +181,11 @@ export const getOftStoreAddress = (eid: EndpointId): string | null => { return null } return oftStore - } catch (err: any) { + } catch (err: unknown) { + const message = err instanceof Error ? err.message : String(err) DebugLogger.printWarning( KnownWarnings.ERROR_LOADING_SOLANA_DEPLOYMENT, - `Could not load Solana deployment for ${endpointIdToNetwork(eid)} (eid ${eid}): ${err.message}` + `Could not load Solana deployment for ${endpointIdToNetwork(eid)} (eid ${eid}): ${message}` ) return null } diff --git a/examples/oft-solana/tasks/solana/setOutboundRateLimit.ts b/examples/oft-solana/tasks/solana/setOutboundRateLimit.ts index 4d5abbf51c..b4294c4418 100644 --- a/examples/oft-solana/tasks/solana/setOutboundRateLimit.ts +++ b/examples/oft-solana/tasks/solana/setOutboundRateLimit.ts @@ -3,7 +3,7 @@ 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 { 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' @@ -47,7 +47,6 @@ task( 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( diff --git a/examples/oft-solana/tasks/solana/utils.ts b/examples/oft-solana/tasks/solana/utils.ts index 096d66db95..7565a7868f 100644 --- a/examples/oft-solana/tasks/solana/utils.ts +++ b/examples/oft-solana/tasks/solana/utils.ts @@ -78,14 +78,21 @@ export function parseDecimalToUnits(amount: string, decimals: number): bigint { */ 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 + process.stderr.write = (( + chunk: string | Uint8Array, + encoding?: BufferEncoding | ((err?: Error) => void), + cb?: (err?: Error) => void + ) => { + const str = typeof chunk === 'string' ? chunk : Buffer.from(chunk).toString('utf8') if (typeof str === 'string' && str.includes('429 Too Many Requests')) { // swallow it return true } // otherwise pass through - return origWrite(chunk, ...args) + if (typeof encoding === 'function') { + return origWrite(chunk, encoding) + } + return origWrite(chunk, encoding, cb) }) as typeof process.stderr.write } diff --git a/examples/oft-solana/test/anchor/constants.ts b/examples/oft-solana/test/anchor/constants.ts new file mode 100755 index 0000000000..a0c0908287 --- /dev/null +++ b/examples/oft-solana/test/anchor/constants.ts @@ -0,0 +1,55 @@ +import fs from 'fs' +import path from 'path' + +import { publicKey } from '@metaplex-foundation/umi' +import { utils } from '@noble/secp256k1' +import { Keypair } from '@solana/web3.js' + +import { UMI } from '@layerzerolabs/lz-solana-sdk-v2' + +export const SRC_EID = 50168 +export const DST_EID = 50125 +export const INVALID_EID = 999999 // Non-existent EID for testing +export const TON_EID = 50343 + +const DEFAULT_OFT_KEYPAIR = path.resolve(process.cwd(), 'target/deploy/oft-keypair.json') +const OFT_PROGRAM_ID_VALUE = + process.env.OFT_ID ?? readKeypairPublicKey(DEFAULT_OFT_KEYPAIR) ?? '9UovNrJD8pQyBLheeHNayuG1wJSEAoxkmM14vw5gcsTT' +const ENDPOINT_PROGRAM_ID_VALUE = process.env.LZ_ENDPOINT_PROGRAM_ID ?? '76y77prsiCMvXMjuoZ5VRrhG5qYBrUMYTE5WgHqgjEn6' +const ULN_PROGRAM_ID_VALUE = process.env.LZ_ULN_PROGRAM_ID ?? '7a4WjyR8VZ7yZz5XJAKm39BUGn5iT9CKcv2pmG9tdXVH' +const EXECUTOR_PROGRAM_ID_VALUE = process.env.LZ_EXECUTOR_PROGRAM_ID ?? '6doghB248px58JSSwG4qejQ46kFMW4AMj7vzJnWZHNZn' +const PRICEFEED_PROGRAM_ID_VALUE = process.env.LZ_PRICEFEED_PROGRAM_ID ?? '8ahPGPjEbpgGaZx2NV1iG5Shj7TDwvsjkEDcGWjt94TP' +const DVN_PROGRAM_IDS_VALUE = (process.env.LZ_DVN_PROGRAM_IDS ?? 'HtEYV4xB4wvsj5fgTkcfuChYpvGYzgzwvNhgDZQNh7wW') + .split(',') + .map((value) => value.trim()) + .filter(Boolean) + +export const OFT_PROGRAM_ID = publicKey(OFT_PROGRAM_ID_VALUE) + +export const DVN_SIGNERS = new Array(4).fill(0).map(() => utils.randomPrivateKey()) + +export const OFT_DECIMALS = 6 + +export const defaultMultiplierBps = 12500 // 125% + +export const endpoint: UMI.EndpointProgram.Endpoint = new UMI.EndpointProgram.Endpoint(ENDPOINT_PROGRAM_ID_VALUE) +export const uln: UMI.UlnProgram.Uln = new UMI.UlnProgram.Uln(ULN_PROGRAM_ID_VALUE) +export const executor: UMI.ExecutorProgram.Executor = new UMI.ExecutorProgram.Executor(EXECUTOR_PROGRAM_ID_VALUE) +export const priceFeed: UMI.PriceFeedProgram.PriceFeed = new UMI.PriceFeedProgram.PriceFeed(PRICEFEED_PROGRAM_ID_VALUE) + +export const dvns = DVN_PROGRAM_IDS_VALUE.map((value) => publicKey(value)) + +function readKeypairPublicKey(keypairPath: string): string | undefined { + if (!fs.existsSync(keypairPath)) { + return undefined + } + + try { + const secret = JSON.parse(fs.readFileSync(keypairPath, 'utf-8')) as number[] + const keypair = Keypair.fromSecretKey(Uint8Array.from(secret)) + return keypair.publicKey.toBase58() + } catch (error) { + console.warn(`Failed to read keypair at ${keypairPath}: ${String(error)}`) + return undefined + } +} diff --git a/examples/oft-solana/test/anchor/got-shim.cjs b/examples/oft-solana/test/anchor/got-shim.cjs new file mode 100644 index 0000000000..432faef210 --- /dev/null +++ b/examples/oft-solana/test/anchor/got-shim.cjs @@ -0,0 +1,78 @@ +const fs = require('fs'); +const path = require('path'); +const Module = require('module'); +const { Keypair } = require('@solana/web3.js'); + +const originalLoad = Module._load; + +const ROOT_DIR = path.join(__dirname, '..', '..'); +const KEYPAIR_DIR = path.join(ROOT_DIR, 'target', 'surfnet-programs'); + +const USE_LOCAL_PROGRAMS = process.env.SURFPOOL_USE_LOCAL_PROGRAMS === '1'; +process.env.SURFPOOL_USE_LOCAL_PROGRAMS = USE_LOCAL_PROGRAMS ? '1' : '0'; + +if (USE_LOCAL_PROGRAMS) { + if (!process.env.SURFPOOL_OFFLINE) { + process.env.SURFPOOL_OFFLINE = '1'; + } + if (!fs.existsSync(KEYPAIR_DIR)) { + fs.mkdirSync(KEYPAIR_DIR, { recursive: true }); + } + + const programKeypairs = [ + { name: 'endpoint', envId: 'LZ_ENDPOINT_PROGRAM_ID', envKeypair: 'LZ_ENDPOINT_PROGRAM_KEYPAIR' }, + { name: 'uln', envId: 'LZ_ULN_PROGRAM_ID', envKeypair: 'LZ_ULN_PROGRAM_KEYPAIR' }, + { name: 'executor', envId: 'LZ_EXECUTOR_PROGRAM_ID', envKeypair: 'LZ_EXECUTOR_PROGRAM_KEYPAIR' }, + { name: 'pricefeed', envId: 'LZ_PRICEFEED_PROGRAM_ID', envKeypair: 'LZ_PRICEFEED_PROGRAM_KEYPAIR' }, + { name: 'dvn', envId: 'LZ_DVN_PROGRAM_ID', envKeypair: 'LZ_DVN_PROGRAM_KEYPAIR' }, + ]; + + const dvnIds = []; + programKeypairs.forEach((program) => { + const keypairPath = path.join(KEYPAIR_DIR, `${program.name}-keypair.json`); + + if (!fs.existsSync(keypairPath)) { + const keypair = Keypair.generate(); + fs.writeFileSync(keypairPath, JSON.stringify(Array.from(keypair.secretKey))); + if (!process.env[program.envId]) { + process.env[program.envId] = keypair.publicKey.toBase58(); + } + } else if (!process.env[program.envId]) { + const secret = JSON.parse(fs.readFileSync(keypairPath, 'utf-8')); + const keypair = Keypair.fromSecretKey(Uint8Array.from(secret)); + process.env[program.envId] = keypair.publicKey.toBase58(); + } + + process.env[program.envKeypair] = keypairPath; + if (program.name === 'dvn') { + dvnIds.push(process.env[program.envId]); + } + }); + + if (!process.env.LZ_DVN_PROGRAM_IDS && dvnIds.length) { + process.env.LZ_DVN_PROGRAM_IDS = dvnIds.join(','); + } +} + +const gotStub = { + default: Object.assign( + async () => { + throw new Error('got stub: network client not available in tests'); + }, + { + get: async () => { + throw new Error('got stub: network client not available in tests'); + }, + post: async () => { + throw new Error('got stub: network client not available in tests'); + }, + } + ), +}; + +Module._load = function (request, parent, isMain) { + if (request === 'got') { + return gotStub; + } + return originalLoad.call(this, request, parent, isMain); +}; diff --git a/examples/oft-solana/test/anchor/helpers/error-assertions.ts b/examples/oft-solana/test/anchor/helpers/error-assertions.ts new file mode 100644 index 0000000000..4b48698abc --- /dev/null +++ b/examples/oft-solana/test/anchor/helpers/error-assertions.ts @@ -0,0 +1,96 @@ +import assert from 'assert' + +import { Program, ProgramError } from '@metaplex-foundation/umi' + +import { oft } from '@layerzerolabs/oft-v2-solana-sdk' + +export async function expectOftError( + operation: () => Promise, + expectedErrorClass: new (...args: unknown[]) => T, + program: Program, + customMessage?: string +): Promise { + try { + await operation() + assert.fail(`Expected ${expectedErrorClass.name} to be thrown, but operation succeeded`) + } catch (error: unknown) { + const errorMessage = customMessage || `Expected ${expectedErrorClass.name}` + assertOftError(error, expectedErrorClass, program, errorMessage) + } +} + +export function assertOftError( + error: unknown, + expectedErrorClass: new (...args: unknown[]) => T, + program: Program, + message: string +): void { + const isMatch = isOftError(error, expectedErrorClass, program) + + if (!isMatch) { + const actualInfo = getErrorInfo(error) + assert.fail(`${message}, but got: ${actualInfo}\nExpected: ${expectedErrorClass.name}`) + } +} + +function isOftError( + error: unknown, + expectedErrorClass: new (...args: unknown[]) => T, + program: Program +): boolean { + const instance = new expectedErrorClass(program) + if (!('code' in instance) || typeof instance.code !== 'number') { + return false + } + const expectedMessage = `Error Code: ${instance.name}. Error Number: ${instance.code.toString(10)}` + + if ( + typeof error === 'object' && + 'message' in error && + typeof error.message === 'string' && + error.message.startsWith('Simulate Fail:') + ) { + const msg = error.message.split('Simulate Fail:')[1] + return JSON.stringify(msg).includes(expectedMessage) + } + + if ( + typeof error !== 'object' || + !('transactionError' in error) || + typeof error.transactionError !== 'object' || + !('logs' in error.transactionError) + ) { + return false + } + + const logs = error.transactionError.logs + return JSON.stringify(logs).includes(expectedMessage) +} + +function getErrorInfo(error: unknown): string { + const err = error as { message?: string; code?: string; name?: string; logs?: string[] } + const parts = [] + + if (err.message) { + parts.push(`Message: "${err.message}"`) + } + + if (err.code) { + parts.push(`Code: ${err.code}`) + } + + if (err.name) { + parts.push(`Name: ${err.name}`) + } + + if (err.logs) { + const errorLogs = err.logs.filter((log: string) => log.includes('Error Code:') || log.includes('Error Number:')) + if (errorLogs.length > 0) { + parts.push(`Logs: [${errorLogs.slice(0, 2).join(', ')}]`) + } + } + + return parts.length > 0 ? parts.join(', ') : 'Unknown error format' +} + +export const OftErrors = oft.errors diff --git a/examples/oft-solana/test/anchor/helpers/index.ts b/examples/oft-solana/test/anchor/helpers/index.ts new file mode 100644 index 0000000000..c3fb981acb --- /dev/null +++ b/examples/oft-solana/test/anchor/helpers/index.ts @@ -0,0 +1,4 @@ +export { initOft, send } from './oft-layerzero-simulation' +export { quoteSend, quoteOft } from './oft-quotes' +export { createOftKeys, createOftKeySets, createKeypairFromSeed, createSignerFromSeed } from './test-keys' +export { expectOftError, assertOftError, OftErrors } from './error-assertions' diff --git a/examples/oft-solana/test/anchor/helpers/oft-layerzero-simulation.ts b/examples/oft-solana/test/anchor/helpers/oft-layerzero-simulation.ts new file mode 100644 index 0000000000..4c83f6ef9e --- /dev/null +++ b/examples/oft-solana/test/anchor/helpers/oft-layerzero-simulation.ts @@ -0,0 +1,108 @@ +import { KeypairSigner, PublicKey, Umi, publicKeyBytes } from '@metaplex-foundation/umi' +import { base58 } from '@metaplex-foundation/umi/serializers' +import { fromWeb3JsPublicKey, toWeb3JsPublicKey } from '@metaplex-foundation/umi-web3js-adapters' +import { TOKEN_PROGRAM_ID } from '@solana/spl-token' + +import { UMI } from '@layerzerolabs/lz-solana-sdk-v2' +import { Options } from '@layerzerolabs/lz-v2-utilities' +import { OFT_DECIMALS, oft } from '@layerzerolabs/oft-v2-solana-sdk' + +import { OFT_PROGRAM_ID, endpoint } from '../constants' +import { OftKeys, PacketSentEvent, TestContext } from '../types' +import { sendAndConfirm } from '../utils' + +const SIMULATION_EXECUTION_OPTIONS = Options.newOptions().addExecutorLzReceiveOption(200000, 200000 * 5) +const SIMULATION_COMPUTE_UNITS = 400000 + +export async function initOft( + umi: Umi, + keys: OftKeys, + oftType: oft.types.OFTType, + sharedDecimals = OFT_DECIMALS +): Promise { + const ix = oft.initOft( + { + payer: keys.oappAdmin, + admin: keys.oappAdmin.publicKey, + mint: keys.mint.publicKey, + escrow: keys.escrow, + }, + oftType, + sharedDecimals, + { + oft: OFT_PROGRAM_ID, + endpoint: endpoint.programId, + } + ) + + await sendAndConfirm(umi, ix, keys.oappAdmin) +} + +export async function send( + context: TestContext, + oftKeys: OftKeys, + source: KeypairSigner, + sourceTokenAccount: PublicKey, + dest: PublicKey, + dstEid: number, + sendAmount: bigint, + fee: UMI.EndpointProgram.types.MessagingFee, + composeMsg?: Uint8Array, + minAmountLd = 0n +): Promise { + const { umi } = context + + const ix = await oft.send( + umi.rpc, + { + payer: source, + tokenMint: oftKeys.mint.publicKey, + tokenEscrow: oftKeys.escrow.publicKey, + tokenSource: sourceTokenAccount, + }, + { + dstEid, + to: publicKeyBytes(dest), + amountLd: sendAmount, + minAmountLd, + options: SIMULATION_EXECUTION_OPTIONS.toBytes(), + composeMsg, + nativeFee: fee.nativeFee, + lzTokenFee: fee.lzTokenFee, + }, + { + oft: context.program.publicKey, + endpoint: endpoint.programId, + token: fromWeb3JsPublicKey(TOKEN_PROGRAM_ID), + } + ) + + const { signature } = await sendAndConfirm( + umi, + ix, + source, + SIMULATION_COMPUTE_UNITS, + context.lookupTable === undefined ? undefined : [context.lookupTable] + ) + + return extractPacketSentEvent(context, signature) +} + +async function extractPacketSentEvent(context: TestContext, signature: Uint8Array): Promise { + const signatureBase58 = base58.deserialize(signature)[0] + const maxAttempts = 10 + for (let attempt = 0; attempt < maxAttempts; attempt++) { + const events = await UMI.extractEventFromTransactionSignature( + context.connection, + toWeb3JsPublicKey(endpoint.programId), + signatureBase58, + UMI.EndpointProgram.events.getPacketSentEventSerializer(), + { commitment: 'confirmed', maxSupportedTransactionVersion: 0 } + ) + if (events && events.length > 0) { + return events[0] + } + await new Promise((resolve) => setTimeout(resolve, 500)) + } + throw new Error(`PacketSent event not found for signature ${signatureBase58}`) +} diff --git a/examples/oft-solana/test/anchor/helpers/oft-quotes.ts b/examples/oft-solana/test/anchor/helpers/oft-quotes.ts new file mode 100644 index 0000000000..c9065c578f --- /dev/null +++ b/examples/oft-solana/test/anchor/helpers/oft-quotes.ts @@ -0,0 +1,75 @@ +import { KeypairSigner, PublicKey, publicKeyBytes } from '@metaplex-foundation/umi' + +import { UMI } from '@layerzerolabs/lz-solana-sdk-v2' +import { Options } from '@layerzerolabs/lz-v2-utilities' +import { oft } from '@layerzerolabs/oft-v2-solana-sdk' + +import { endpoint } from '../constants' +import { OftKeys, TestContext } from '../types' + +const DEFAULT_LZ_RECEIVE_OPTIONS = Options.newOptions().addExecutorLzReceiveOption(200000, 0) + +export async function quoteSend( + context: TestContext, + oftKeys: OftKeys, + payer: KeypairSigner, + dest: PublicKey, + dstEid: number, + sendAmount: bigint, + minAmount = 0n, + composeMessage?: Uint8Array, + options: Uint8Array = DEFAULT_LZ_RECEIVE_OPTIONS.toBytes() +): Promise { + return oft.quote( + context.umi.rpc, + { + payer: payer.publicKey, + tokenMint: oftKeys.mint.publicKey, + tokenEscrow: oftKeys.escrow.publicKey, + }, + { + dstEid, + to: publicKeyBytes(dest), + amountLd: sendAmount, + minAmountLd: minAmount, + options, + composeMsg: composeMessage, + }, + { + oft: context.program.publicKey, + endpoint: endpoint.programId, + }, + undefined, + context.lookupTable?.publicKey + ) +} + +export async function quoteOft( + context: TestContext, + oftKeys: OftKeys, + payer: KeypairSigner, + dest: PublicKey, + dstEid: number, + sendAmount: bigint, + minAmount = 0n, + composeMessage?: Uint8Array, + options: Uint8Array = DEFAULT_LZ_RECEIVE_OPTIONS.toBytes() +): Promise { + return oft.quoteOft( + context.umi.rpc, + { + payer: payer.publicKey, + tokenMint: oftKeys.mint.publicKey, + tokenEscrow: oftKeys.escrow.publicKey, + }, + { + dstEid, + to: publicKeyBytes(dest), + amountLd: sendAmount, + minAmountLd: minAmount, + options, + composeMsg: composeMessage, + }, + context.program.publicKey + ) +} diff --git a/examples/oft-solana/test/anchor/helpers/test-keys.ts b/examples/oft-solana/test/anchor/helpers/test-keys.ts new file mode 100644 index 0000000000..fac44f1607 --- /dev/null +++ b/examples/oft-solana/test/anchor/helpers/test-keys.ts @@ -0,0 +1,53 @@ +import { createHash } from 'crypto' + +import { Keypair, KeypairSigner, PublicKey, createSignerFromKeypair, defaultPublicKey } from '@metaplex-foundation/umi' +import { createWeb3JsEddsa } from '@metaplex-foundation/umi-eddsa-web3js' +import { fromWeb3JsKeypair } from '@metaplex-foundation/umi-web3js-adapters' +import { Keypair as Web3Keypair } from '@solana/web3.js' + +import { OftPDA } from '@layerzerolabs/oft-v2-solana-sdk' + +import { OftKeySets, OftKeys } from '../types' + +const eddsa = createWeb3JsEddsa() + +export function createKeypairFromSeed(seed: string): Keypair { + const hash = createHash('sha256').update(seed).digest() + const seedBytes = hash.subarray(0, 32) + const web3Keypair = Web3Keypair.fromSeed(seedBytes) + return fromWeb3JsKeypair(web3Keypair) +} + +export function createSignerFromSeed(seed: string): KeypairSigner { + const keypair = createKeypairFromSeed(seed) + return createSignerFromKeypair({ eddsa }, keypair) +} + +export function createOftKeys(program: PublicKey, seedPrefix: string): OftKeys { + const admin = createSignerFromSeed(`${seedPrefix}-admin`) + const delegate = createSignerFromSeed(`${seedPrefix}-delegate`) + const pauser = createSignerFromSeed(`${seedPrefix}-pauser`) + const unpauser = createSignerFromSeed(`${seedPrefix}-unpauser`) + const mint = createSignerFromSeed(`${seedPrefix}-mint`) + const escrow = createSignerFromSeed(`${seedPrefix}-escrow`) + const [oftStore] = new OftPDA(program).oftStore(escrow.publicKey) + + return { + escrow, + mint, + oappAdmin: admin, + tokenMintAuthority: defaultPublicKey(), + oappAdminTokenAccount: undefined, + oftStore, + delegate, + pauser, + unpauser, + } +} + +export function createOftKeySets(program: PublicKey): OftKeySets { + return { + native: createOftKeys(program, 'oft-native'), + adapter: createOftKeys(program, 'oft-adapter'), + } +} diff --git a/examples/oft-solana/test/anchor/index.test.ts b/examples/oft-solana/test/anchor/index.test.ts new file mode 100644 index 0000000000..926ae93e51 --- /dev/null +++ b/examples/oft-solana/test/anchor/index.test.ts @@ -0,0 +1,463 @@ +import './got-shim.cjs' +import 'mocha' + +import fs from 'fs' +import { ChildProcess, type SpawnOptions, spawn } from 'node:child_process' +import path from 'path' +import { env } from 'process' + +import { + Context, + Program, + Umi, + createNullContext, + createSignerFromKeypair, + generateSigner, + publicKeyBytes, + sol, +} from '@metaplex-foundation/umi' +import { createUmi } from '@metaplex-foundation/umi-bundle-defaults' +import { Connection, Keypair } from '@solana/web3.js' +import axios from 'axios' + +import { UMI } from '@layerzerolabs/lz-solana-sdk-v2' +import { OftPDA, oft } from '@layerzerolabs/oft-v2-solana-sdk' + +import { DST_EID, OFT_PROGRAM_ID, SRC_EID, dvns, endpoint, executor, priceFeed, uln } from './constants' +import { createOftKeySets } from './helpers' +import { OftKeySets, TestContext } from './types' + +type SurfnetProgram = { + name: string + id: string + binary?: string + keypairEnv?: string +} + +const RPC_PORT = env.SURFPOOL_RPC_PORT ?? '13033' +const RPC_HOST = env.SURFPOOL_HOST ?? '127.0.0.1' +const WS_PORT = env.SURFPOOL_WS_PORT ?? `${Number(RPC_PORT) + 1}` +const RPC = `http://${RPC_HOST}:${RPC_PORT}` +const UPSTREAM_RPC_URL = env.SURFPOOL_RPC_URL ?? 'https://api.mainnet-beta.solana.com' +const USE_LOCAL_PROGRAMS = env.SURFPOOL_USE_LOCAL_PROGRAMS === '1' +const SURFPOOL_OFFLINE = env.SURFPOOL_OFFLINE === '1' +const SYSTEM_PROGRAM_ID = '11111111111111111111111111111111' +const EMPTY_ACCOUNT_DATA_HEX = '' +const SURFPOOL_LOG = path.join(__dirname, '../../target/surfpool.log') +const JUNK_KEYPAIR_PATH = path.join(__dirname, '../../junk-id.json') +const OFT_PROGRAM_PATH = path.join(__dirname, '../../target/deploy/oft.so') +const OFT_KEYPAIR_PATH = path.join(__dirname, '../../target/deploy/oft-keypair.json') +const TARGET_PROGRAMS_DIR = path.join(__dirname, '../../target/programs') +const DVN_PROGRAM_IDS = dvns.map((dvn) => dvn.toString()) + +const LAYERZERO_PROGRAMS: SurfnetProgram[] = [ + { + name: 'endpoint', + id: endpoint.programId.toString(), + binary: 'endpoint.so', + keypairEnv: 'LZ_ENDPOINT_PROGRAM_KEYPAIR', + }, + { + name: 'uln', + id: uln.programId.toString(), + binary: 'uln.so', + keypairEnv: 'LZ_ULN_PROGRAM_KEYPAIR', + }, + { + name: 'executor', + id: executor.programId.toString(), + binary: 'executor.so', + keypairEnv: 'LZ_EXECUTOR_PROGRAM_KEYPAIR', + }, + { + name: 'pricefeed', + id: priceFeed.programId.toString(), + binary: 'pricefeed.so', + keypairEnv: 'LZ_PRICEFEED_PROGRAM_KEYPAIR', + }, + ...DVN_PROGRAM_IDS.map((id, index) => ({ + name: DVN_PROGRAM_IDS.length > 1 ? `dvn-${index + 1}` : 'dvn', + id, + binary: 'dvn.so', + keypairEnv: 'LZ_DVN_PROGRAM_KEYPAIR', + })), +] + +let globalContext: TestContext +let globalUmi: Umi | Context +let surfpoolProcess: ChildProcess + +const sleep = (ms: number): Promise => new Promise((resolve) => setTimeout(resolve, ms)) + +describe('OFT Solana Tests', function () { + this.timeout(300000) + + before(async function () { + console.log('Setting up test environment...') + + surfpoolProcess = await startSurfnet() + await setupPrograms() + + globalContext = await createGlobalTestContext() + globalUmi = globalContext.umi + + console.log('Test environment ready.') + }) + + after(async function () { + console.log('Cleaning up test environment...') + globalUmi = createNullContext() + if (globalContext) { + globalContext.umi = globalUmi + } + await sleep(2000) + if (surfpoolProcess) { + surfpoolProcess.kill('SIGKILL') + } + console.log('Cleanup completed.') + }) + + describe('LayerZero Infrastructure', function () { + require('./suites/layerzero-infrastructure.test') + }) + + describe('Instruction Tests', function () { + require('./suites/init_oft.test') + require('./suites/set_oft_config.test') + require('./suites/set_peer_config.test') + require('./suites/quote_instructions.test') + require('./suites/send_and_receive.test') + require('./suites/layerzero-simulation.test') + require('./suites/withdraw_fee.test') + }) +}) + +export function getGlobalContext(): TestContext { + return globalContext +} + +export function getGlobalUmi(): Umi | Context { + return globalUmi +} + +export function setGlobalKeys(keys: OftKeySets): void { + if (globalContext) { + globalContext.keys = keys + } +} + +export function getGlobalKeys(): OftKeySets { + return globalContext?.keys as OftKeySets +} + +async function setupPrograms(): Promise { + assertFileExists(JUNK_KEYPAIR_PATH, 'junk keypair') + assertFileExists(OFT_PROGRAM_PATH, 'OFT program binary') + assertFileExists(OFT_KEYPAIR_PATH, 'OFT program keypair') + + if (SURFPOOL_OFFLINE && !USE_LOCAL_PROGRAMS) { + throw new Error('SURFPOOL_OFFLINE requires SURFPOOL_USE_LOCAL_PROGRAMS=1 for local program deployment.') + } + + if (USE_LOCAL_PROGRAMS) { + if (DVN_PROGRAM_IDS.length > 1) { + throw new Error('Local Surfnet mode supports a single DVN program ID. Set LZ_DVN_PROGRAM_IDS accordingly.') + } + await deployLocalLayerZeroPrograms() + } else { + console.log(`Priming LayerZero programs from ${UPSTREAM_RPC_URL}...`) + for (const program of LAYERZERO_PROGRAMS) { + console.log(` Cloning ${program.name}...`) + await cloneProgramAccount(program.id) + } + await resetInfrastructureAccounts() + } + + const oftProgramId = OFT_PROGRAM_ID.toString() + const hasOftProgram = USE_LOCAL_PROGRAMS + ? await accountExists(oftProgramId) + : await tryCloneProgramAccount(oftProgramId, 'oft') + + if (!hasOftProgram) { + await ensureOftProgramAuthority(oftProgramId) + console.log('Deploying OFT program to Surfnet...') + await deployProgram(OFT_KEYPAIR_PATH, OFT_PROGRAM_PATH) + } +} + +async function startSurfnet(): Promise { + assertFileExists(JUNK_KEYPAIR_PATH, 'junk keypair') + const args = [ + 'start', + '-p', + RPC_PORT, + '-w', + WS_PORT, + '-o', + RPC_HOST, + '--no-tui', + '--no-deploy', + '--airdrop-keypair-path', + JUNK_KEYPAIR_PATH, + ] + + if (SURFPOOL_OFFLINE) { + args.push('--offline') + } else { + args.push('-u', UPSTREAM_RPC_URL) + } + + console.log(`Starting surfpool (${SURFPOOL_OFFLINE ? 'offline' : `upstream: ${UPSTREAM_RPC_URL}`})...`) + const logFd = fs.openSync(SURFPOOL_LOG, 'w') + const surfnetProcess = spawn('surfpool', [...args], { + stdio: ['ignore', logFd, logFd], + }) + + let surfnetReady = false + for (let i = 0; i < 60; i++) { + try { + await axios.post(RPC, { jsonrpc: '2.0', id: 1, method: 'getVersion' }, { timeout: 5000 }) + console.log('Surfnet started.') + surfnetReady = true + break + } catch (e) { + await sleep(1000) + console.log('Waiting for surfnet to start...') + } + } + + if (!surfnetReady) { + surfnetProcess.kill('SIGKILL') + throw new Error('Surfnet failed to start within 60 seconds') + } + + return surfnetProcess +} + +async function cloneProgramAccount(programId: string): Promise { + try { + await callSurfnetRpc('surfnet_cloneProgramAccount', [programId, programId]) + } catch (error) { + const details = error instanceof Error ? error.message : String(error) + throw new Error( + `Failed to clone program ${programId} from ${UPSTREAM_RPC_URL}: ${details}. If these programs are devnet-only, set SURFPOOL_RPC_URL to a devnet RPC.` + ) + } +} + +async function deployLocalLayerZeroPrograms(): Promise { + console.log('Deploying local LayerZero programs...') + for (const program of LAYERZERO_PROGRAMS) { + if (!program.binary || !program.keypairEnv) { + continue + } + + const keypairPath = env[program.keypairEnv] + if (!keypairPath) { + throw new Error(`Missing ${program.keypairEnv} for local program ${program.name}`) + } + + const programPath = path.join(TARGET_PROGRAMS_DIR, program.binary) + assertFileExists(programPath, `${program.name} program binary`) + assertFileExists(keypairPath, `${program.name} program keypair`) + + if (await accountExists(program.id)) { + console.log(` ${program.name} already deployed.`) + continue + } + + console.log(` Deploying ${program.name}...`) + await deployProgram(keypairPath, programPath) + } +} + +async function deployProgram(keypairPath: string, programPath: string): Promise { + await runCommand( + 'solana', + ['program', 'deploy', '--url', RPC, '--keypair', JUNK_KEYPAIR_PATH, '--program-id', keypairPath, programPath], + { stdio: 'inherit' } + ) +} + +async function accountExists(pubkey: string): Promise { + const result = await callSurfnetRpc<{ value: unknown | null }>('getAccountInfo', [pubkey, { encoding: 'base64' }]) + return Boolean(result?.value) +} + +export async function callSurfnetRpc(method: string, params?: unknown): Promise { + const response = await axios.post(RPC, { jsonrpc: '2.0', id: 1, method, params }, { timeout: 30000 }) + + if (response.data?.error) { + const errorMessage = response.data.error?.message ?? JSON.stringify(response.data.error) + throw new Error(`Surfnet RPC ${method} failed: ${errorMessage}`) + } + + return response.data?.result as T +} + +async function resetInfrastructureAccounts(): Promise { + const keySets = createOftKeySets(OFT_PROGRAM_ID) + const oappStores = [keySets.native.oftStore, keySets.adapter.oftStore] + const remoteEids = [DST_EID, SRC_EID] + + const addresses = [ + // Endpoint PDAs + endpoint.pda.setting()[0], + endpoint.eventAuthority, + endpoint.pda.messageLibraryInfo(uln.pda.messageLib()[0])[0], + + // Uln PDAs + uln.pda.messageLib()[0], + uln.pda.setting()[0], + uln.eventAuthority, + + // Executor & PriceFeed + executor.pda.config()[0], + executor.eventAuthority, + priceFeed.pda.priceFeed()[0], + + // DVN PDAs + ...dvns.map((dvn) => new UMI.DvnPDA(dvn).config()[0]), + ...dvns.map((dvn) => new UMI.EventPDA(dvn).eventAuthority()[0]), + + // OApp stores + registries + ...oappStores, + ...oappStores.map((oapp) => endpoint.pda.oappRegistry(oapp)[0]), + + // Pathway config/nonce PDAs + ...oappStores.flatMap((store) => + remoteEids.flatMap((remote) => [ + endpoint.pda.defaultSendLibraryConfig(remote)[0], + endpoint.pda.oappRegistry(store)[0], + endpoint.pda.sendLibraryConfig(store, remote)[0], + endpoint.pda.nonce(store, remote, publicKeyBytes(store))[0], + endpoint.pda.pendingNonce(store, remote, publicKeyBytes(store))[0], + uln.pda.defaultSendConfig(remote)[0], + uln.pda.defaultReceiveConfig(remote)[0], + uln.pda.sendConfig(remote, store)[0], + uln.pda.receiveConfig(remote, store)[0], + ]) + ), + ] + + const unique = dedupeAddresses(addresses) + for (const address of unique) { + // Clear forked PDAs so init instructions can recreate them without "account already in use" errors. + await clearAccount(address.toString()) + } +} + +async function clearAccount(pubkey: string): Promise { + try { + await callSurfnetRpc('surfnet_setAccount', [ + pubkey, + { + data: EMPTY_ACCOUNT_DATA_HEX, + executable: false, + lamports: 0, + owner: SYSTEM_PROGRAM_ID, + rentEpoch: 0, + }, + ]) + } catch (error) { + const details = error instanceof Error ? error.message : String(error) + throw new Error(`Failed to clear account ${pubkey} with surfnet_setAccount: ${details}`) + } +} + +async function ensureOftProgramAuthority(programId: string): Promise { + const authority = loadKeypairPublicKey(JUNK_KEYPAIR_PATH) + + try { + await callSurfnetRpc('surfnet_setProgramAuthority', [programId, authority]) + } catch (error) { + const details = error instanceof Error ? error.message : String(error) + console.warn(`Skipping program authority update for OFT: ${details}`) + } +} + +async function tryCloneProgramAccount(programId: string, label: string): Promise { + try { + await cloneProgramAccount(programId) + return true + } catch (error) { + const details = error instanceof Error ? error.message : String(error) + if (details.includes('not found')) { + console.warn(`Program ${label} (${programId}) not found upstream; deploying locally.`) + return false + } + throw error + } +} + +function assertFileExists(filePath: string, label: string): void { + if (!fs.existsSync(filePath)) { + throw new Error(`Missing ${label} at ${filePath}`) + } +} + +function loadKeypairPublicKey(filePath: string): string { + const secret = JSON.parse(fs.readFileSync(filePath, 'utf-8')) as number[] + const keypair = Keypair.fromSecretKey(Uint8Array.from(secret)) + return keypair.publicKey.toBase58() +} + +function dedupeAddresses(addresses: { toString(): string }[]): { toString(): string }[] { + const seen = new Set() + return addresses.filter((address) => { + const key = address.toString() + if (seen.has(key)) { + return false + } + seen.add(key) + return true + }) +} + +async function createGlobalTestContext(): Promise { + const connection = new Connection(RPC, 'confirmed') + const umi = createUmi(connection) + const program: Program = { + name: 'oft', + publicKey: OFT_PROGRAM_ID, + getErrorFromCode(code: number, cause?: Error) { + return oft.errors.getOftErrorFromCode(code, this, cause) + }, + getErrorFromName(name: string, cause?: Error) { + return oft.errors.getOftErrorFromName(name, this, cause) + }, + isOnCluster() { + return true + }, + } + + const context: TestContext = { + umi, + connection, + executor: createSignerFromKeypair(umi, umi.eddsa.generateKeypair()), + program, + programRepo: oft.createOFTProgramRepo(OFT_PROGRAM_ID, umi.rpc), + pda: new OftPDA(OFT_PROGRAM_ID), + keys: createOftKeySets(OFT_PROGRAM_ID), + } + umi.payer = generateSigner(umi) + + await umi.rpc.airdrop(umi.payer.publicKey, sol(10000)) + + return context +} + +async function runCommand(command: string, args: string[], options?: SpawnOptions): Promise { + await new Promise((resolve, reject) => { + const child = spawn(command, args, { stdio: 'inherit', ...options }) + + child.on('error', reject) + child.on('close', (code) => { + if (code === 0) { + resolve() + return + } + reject(new Error(`Command failed: ${command} ${args.join(' ')} (exit ${code ?? 'unknown'})`)) + }) + }) +} diff --git a/examples/oft-solana/test/anchor/suites/init_oft.test.ts b/examples/oft-solana/test/anchor/suites/init_oft.test.ts new file mode 100644 index 0000000000..bfa92565c5 --- /dev/null +++ b/examples/oft-solana/test/anchor/suites/init_oft.test.ts @@ -0,0 +1,107 @@ +import assert from 'assert' + +import { Context, TransactionBuilder, Umi, publicKeyBytes, sol } from '@metaplex-foundation/umi' +import { fromWeb3JsPublicKey } from '@metaplex-foundation/umi-web3js-adapters' +import { TOKEN_PROGRAM_ID } from '@solana/spl-token' +import { before, describe, it } from 'mocha' + +import { OFT_DECIMALS, OftPDA, oft } from '@layerzerolabs/oft-v2-solana-sdk' + +import { DST_EID, OFT_PROGRAM_ID, SRC_EID, endpoint, uln } from '../constants' +import { createOftKeys } from '../helpers' +import { expectOftError } from '../helpers/error-assertions' +import { initOft } from '../helpers/oft-layerzero-simulation' +import { getGlobalContext, getGlobalKeys, getGlobalUmi, setGlobalKeys } from '../index.test' +import { OftKeySets, TestContext } from '../types' +import { initMint } from '../utils' + +const TOKEN_PROGRAM = fromWeb3JsPublicKey(TOKEN_PROGRAM_ID) + +describe('init_oft', function () { + this.timeout(300000) + + let context: TestContext + let umi: Umi | Context + let keys: OftKeySets + + before(async function () { + context = getGlobalContext() + umi = getGlobalUmi() + keys = getGlobalKeys() + + await umi.rpc.airdrop(keys.native.oappAdmin.publicKey, sol(10000)) + await umi.rpc.airdrop(keys.adapter.oappAdmin.publicKey, sol(10000)) + + await initMint(context, keys.native, TOKEN_PROGRAM) + await initMint(context, keys.adapter, TOKEN_PROGRAM) + setGlobalKeys(keys) + }) + + it('rejects init_oft when shared decimals exceed mint decimals', async () => { + const invalidKeys = createOftKeys(OFT_PROGRAM_ID, 'oft-invalid') + await umi.rpc.airdrop(invalidKeys.oappAdmin.publicKey, sol(10000)) + await initMint(context, invalidKeys, TOKEN_PROGRAM, OFT_DECIMALS - 1) + + await expectOftError( + async () => initOft(umi as Umi, invalidKeys, oft.types.OFTType.Native, OFT_DECIMALS), + oft.errors.InvalidDecimalsError, + context.program + ) + }) + + it('initializes native and adapter OFTs', async () => { + await initOft(umi as Umi, keys.native, oft.types.OFTType.Native, OFT_DECIMALS) + await initOft(umi as Umi, keys.adapter, oft.types.OFTType.Adapter, OFT_DECIMALS) + + const nativeStore = await oft.accounts.fetchOFTStore(umi, keys.native.oftStore) + const adapterStore = await oft.accounts.fetchOFTStore(umi, keys.adapter.oftStore) + + assert.strictEqual(nativeStore.oftType, oft.types.OFTType.Native) + assert.strictEqual(adapterStore.oftType, oft.types.OFTType.Adapter) + + const [nativeTypes] = new OftPDA(context.program.publicKey).lzReceiveTypesAccounts(keys.native.oftStore) + const [adapterTypes] = new OftPDA(context.program.publicKey).lzReceiveTypesAccounts(keys.adapter.oftStore) + + const nativeTypesAccount = await oft.accounts.fetchLzReceiveTypesAccounts(umi, nativeTypes) + const adapterTypesAccount = await oft.accounts.fetchLzReceiveTypesAccounts(umi, adapterTypes) + + assert.strictEqual(nativeTypesAccount.oftStore, keys.native.oftStore) + assert.strictEqual(adapterTypesAccount.oftStore, keys.adapter.oftStore) + }) + + it('sets OApp libraries and nonces', async () => { + await setupOappLibraries(umi as Umi, keys.native) + await setupOappLibraries(umi as Umi, keys.adapter) + }) +}) + +async function setupOappLibraries(umi: Umi, keySet: OftKeySets['native']): Promise { + const oftStore = keySet.oftStore + await new TransactionBuilder( + [ + endpoint.initOAppSendLibrary(keySet.oappAdmin, { sender: oftStore, remote: DST_EID }), + endpoint.setOAppSendLibrary(keySet.oappAdmin, { + sender: oftStore, + remote: DST_EID, + msgLibProgram: uln.programId, + }), + endpoint.initOAppReceiveLibrary(keySet.oappAdmin, { receiver: oftStore, remote: SRC_EID }), + endpoint.setOAppReceiveLibrary(keySet.oappAdmin, { + receiver: oftStore, + remote: SRC_EID, + msgLibProgram: uln.programId, + }), + endpoint.initOAppNonce(keySet.oappAdmin, { + localOApp: oftStore, + remote: DST_EID, + remoteOApp: publicKeyBytes(oftStore), + }), + endpoint.initOAppNonce(keySet.oappAdmin, { + localOApp: oftStore, + remote: SRC_EID, + remoteOApp: publicKeyBytes(oftStore), + }), + ], + { feePayer: keySet.oappAdmin } + ).sendAndConfirm(umi) +} diff --git a/examples/oft-solana/test/anchor/suites/layerzero-infrastructure.test.ts b/examples/oft-solana/test/anchor/suites/layerzero-infrastructure.test.ts new file mode 100644 index 0000000000..3d085778ab --- /dev/null +++ b/examples/oft-solana/test/anchor/suites/layerzero-infrastructure.test.ts @@ -0,0 +1,643 @@ +import { createLut, extendLut } from '@metaplex-foundation/mpl-toolbox' +import { + Context, + KeypairSigner, + PublicKey, + Signer, + TransactionBuilder, + Umi, + none, + publicKey, + publicKeyBytes, + some, +} from '@metaplex-foundation/umi' +import { fromWeb3JsPublicKey, toWeb3JsPublicKey } from '@metaplex-foundation/umi-web3js-adapters' +import { getPublicKey } from '@noble/secp256k1' +import { ASSOCIATED_TOKEN_PROGRAM_ID, TOKEN_2022_PROGRAM_ID, TOKEN_PROGRAM_ID } from '@solana/spl-token' +import { AccountInfo, Connection } from '@solana/web3.js' + +import { UMI } from '@layerzerolabs/lz-solana-sdk-v2' + +import { + DST_EID, + DVN_SIGNERS, + INVALID_EID, + SRC_EID, + TON_EID, + defaultMultiplierBps, + dvns, + endpoint, + executor, + priceFeed, + uln, +} from '../constants' +import { callSurfnetRpc, getGlobalContext, getGlobalKeys, getGlobalUmi } from '../index.test' +import { OftKeySets } from '../types' +import { sendAndConfirm } from '../utils' + +describe('LayerZero Infrastructure Setup', function () { + const SYSTEM_PROGRAM_ID = '11111111111111111111111111111111' + let umi: Umi | Context + let endpointAdmin: Signer + let executorInExecutor: KeypairSigner + let keys: OftKeySets + let connection: Connection + + before(function () { + const context = getGlobalContext() + umi = getGlobalUmi() + endpointAdmin = umi.payer + executorInExecutor = context.executor + keys = getGlobalKeys() + connection = context.connection + }) + + it('Init Endpoint', async function () { + const endpointSettings = endpoint.pda.setting()[0] + const existing = await connection.getAccountInfo(toWeb3JsPublicKey(endpointSettings)) + const needsInit = !existing || isClearedAccount(existing, SYSTEM_PROGRAM_ID) + if (!needsInit && existing) { + await ensureEndpointAdmin(endpointSettings, existing, endpointAdmin, connection) + } + const messageLibInfo = endpoint.pda.messageLibraryInfo(uln.pda.messageLib()[0])[0] + const messageLibInfoExisting = await connection.getAccountInfo(toWeb3JsPublicKey(messageLibInfo)) + const shouldRegisterLibrary = + !messageLibInfoExisting || isClearedAccount(messageLibInfoExisting, SYSTEM_PROGRAM_ID) + const initInstructions: TransactionBuilder[] = [] + if (needsInit) { + initInstructions.push( + endpoint.initEndpoint(endpointAdmin, { + eid: SRC_EID, + admin: endpointAdmin.publicKey, + }) + ) + } + if (shouldRegisterLibrary) { + initInstructions.push( + endpoint.registerLibrary(endpointAdmin, { + messageLibProgram: uln.programId, + }) + ) + } + await sendAndConfirm( + umi, + [ + ...initInstructions, + await endpoint.setDefaultSendLibrary(umi.rpc, endpointAdmin, { + messageLibProgram: uln.programId, + remote: DST_EID, + }), + await endpoint.setDefaultReceiveLibrary(umi.rpc, endpointAdmin, { + messageLibProgram: uln.programId, + remote: SRC_EID, + }), + ], + endpointAdmin + ) + await sendAndConfirm( + umi, + [ + await endpoint.setDefaultSendLibrary(umi.rpc, endpointAdmin, { + messageLibProgram: uln.programId, + remote: INVALID_EID, + }), + await endpoint.setDefaultReceiveLibrary(umi.rpc, endpointAdmin, { + messageLibProgram: uln.programId, + remote: INVALID_EID, + }), + await endpoint.setDefaultSendLibrary(umi.rpc, endpointAdmin, { + messageLibProgram: uln.programId, + remote: TON_EID, + }), + await endpoint.setDefaultReceiveLibrary(umi.rpc, endpointAdmin, { + messageLibProgram: uln.programId, + remote: TON_EID, + }), + ], + endpointAdmin + ) + }) + + it('Init Executor', async function () { + const executorConfig = executor.pda.config()[0] + const existing = await connection.getAccountInfo(toWeb3JsPublicKey(executorConfig)) + const needsInit = !existing || isClearedAccount(existing, SYSTEM_PROGRAM_ID) + if (!needsInit && existing) { + await ensureExecutorOwner(executorConfig, existing, endpointAdmin, connection) + } + const initInstructions: TransactionBuilder[] = [] + if (needsInit) { + initInstructions.push( + executor.initExecutor(endpointAdmin, { + admins: [endpointAdmin.publicKey], + executors: [executorInExecutor.publicKey], + msglibs: [uln.pda.messageLib()[0]], + owner: endpointAdmin.publicKey, + priceFeed: priceFeed.pda.priceFeed()[0], + }) + ) + } else { + // Forked executor configs keep mainnet admins; reset to local admin so admin-only updates succeed. + initInstructions.push(executor.setAdmins(endpointAdmin, [endpointAdmin.publicKey])) + } + initInstructions.push( + executor.setPriceFeed(endpointAdmin, priceFeed.programId), + executor.setDefaultMultiplierBps(endpointAdmin, defaultMultiplierBps), + executor.setDstConfig(endpointAdmin, [ + { + eid: DST_EID, + lzReceiveBaseGas: 10000, + lzComposeBaseGas: 10000, + multiplierBps: some(13000), + floorMarginUsd: some(10000n), + nativeDropCap: BigInt(1e7), + } satisfies UMI.ExecutorProgram.types.DstConfig, + ]) + ) + await sendAndConfirm(umi, initInstructions, endpointAdmin) + }) + + it('Init PriceFeed', async function () { + const priceFeedConfig = priceFeed.pda.priceFeed()[0] + const existing = await connection.getAccountInfo(toWeb3JsPublicKey(priceFeedConfig)) + const needsInit = !existing || isClearedAccount(existing, SYSTEM_PROGRAM_ID) + if (!needsInit && existing) { + await ensurePriceFeedAdmin(priceFeedConfig, existing, endpointAdmin, connection) + } + const nativeTokenPriceUsd = BigInt(1e10) + const priceRatio = BigInt(1e10) + const gasPriceInUnit = BigInt(1e9) + const gasPerByte = 1 + const modelType: UMI.PriceFeedProgram.types.ModelType = { + __kind: 'Arbitrum', + gasPerL2Tx: BigInt(1e6), + gasPerL1CalldataByte: 1, + } + const initInstructions: TransactionBuilder[] = [] + if (needsInit) { + initInstructions.push( + priceFeed.initPriceFeed(endpointAdmin, { + admin: endpointAdmin.publicKey, + updaters: [endpointAdmin.publicKey], + }) + ) + } + initInstructions.push( + priceFeed.setSolPrice(endpointAdmin, nativeTokenPriceUsd), + priceFeed.setPrice(endpointAdmin, { + dstEid: DST_EID, + priceRatio, + gasPriceInUnit, + gasPerByte, + modelType: modelType, + }) + ) + await sendAndConfirm(umi, initInstructions, endpointAdmin) + }) + + it('Init DVN', async function () { + for (const programId of dvns) { + const dvn = new UMI.DVNProgram.DVN(programId) + const config = new UMI.DvnPDA(publicKey(programId)).config()[0] + const existing = await connection.getAccountInfo(toWeb3JsPublicKey(config)) + const needsInit = !existing || isClearedAccount(existing, SYSTEM_PROGRAM_ID) + if (!needsInit && existing) { + await ensureDvnAdmin(config, existing, endpointAdmin, connection) + } + await sendAndConfirm( + umi, + [ + ...(needsInit + ? [ + await dvn.initDVN(umi.rpc, endpointAdmin, { + admins: [endpointAdmin.publicKey], + signers: DVN_SIGNERS.map((signer) => getPublicKey(signer, false).subarray(1)), + msglibs: [uln.pda.messageLib()[0]], + quorum: 1, + vid: DST_EID % 30000, + priceFeed: priceFeed.pda.priceFeed()[0], + }), + ] + : []), + dvn.setDefaultMultiplierBps(endpointAdmin, defaultMultiplierBps), + dvn.setPriceFeed(endpointAdmin, priceFeed.programId), + UMI.DVNProgram.instructions.extendDvnConfig( + { programs: dvn.programRepo }, + { admin: endpointAdmin, config } + ).items[0], + dvn.setDstConfig(endpointAdmin, [ + { + eid: DST_EID, + dstGas: 10000, + multiplierBps: some(defaultMultiplierBps), + floorMarginUsd: none(), + }, + ]), + ], + endpointAdmin + ) + } + }) + + it('Init UltraLightNode', async function () { + const ulnSettings = uln.pda.setting()[0] + const existing = await connection.getAccountInfo(toWeb3JsPublicKey(ulnSettings)) + const needsInit = !existing || isClearedAccount(existing, SYSTEM_PROGRAM_ID) + if (!needsInit && existing) { + await ensureUlnAdmin(ulnSettings, existing, endpointAdmin, connection) + } + const defaultNativeFeeBps = 100 + const maxMessageSize = 1024 + const requiredDvns = dvns.map((programId) => new UMI.DvnPDA(publicKey(programId)).config()[0]).sort() + const sendUlnConfig: UMI.UlnProgram.types.UlnConfig = { + confirmations: 1n, + requiredDvnCount: requiredDvns.length, + optionalDvnCount: 0, + optionalDvnThreshold: 0, + requiredDvns: requiredDvns, + optionalDvns: [], + } + const receiveUlnConfig: UMI.UlnProgram.types.UlnConfig = { + confirmations: 1n, + requiredDvnCount: requiredDvns.length, + optionalDvnCount: 0, + optionalDvnThreshold: 0, + requiredDvns: requiredDvns, + optionalDvns: [], + } + const executorConfig: UMI.UlnProgram.types.ExecutorConfig = { + maxMessageSize, + executor: executor.pda.config()[0], + } + const initInstructions: TransactionBuilder[] = [] + if (needsInit) { + initInstructions.push( + uln.initUln(endpointAdmin, { + admin: endpointAdmin.publicKey, + eid: DST_EID, + endpointProgram: endpoint.programId, + }) + ) + } + initInstructions.push( + uln.setTreasury(endpointAdmin, { + admin: endpointAdmin.publicKey, + lzToken: null, + nativeFeeBps: defaultNativeFeeBps, + nativeReceiver: endpointAdmin.publicKey, + }), + await uln.initOrUpdateDefaultConfig(umi.rpc, endpointAdmin, { + executorConfig: some(executorConfig), + receiveUlnConfig: some(receiveUlnConfig), + remote: SRC_EID, + sendUlnConfig: some(sendUlnConfig), + }), + await uln.initOrUpdateDefaultConfig(umi.rpc, endpointAdmin, { + executorConfig: some(executorConfig), + receiveUlnConfig: some(receiveUlnConfig), + remote: DST_EID, + sendUlnConfig: some(sendUlnConfig), + }) + ) + await sendAndConfirm(umi, initInstructions, endpointAdmin) + + await sendAndConfirm( + umi, + [ + await uln.initOrUpdateDefaultConfig(umi.rpc, endpointAdmin, { + executorConfig: some(executorConfig), + receiveUlnConfig: some(receiveUlnConfig), + remote: INVALID_EID, + sendUlnConfig: some(sendUlnConfig), + }), + await uln.initOrUpdateDefaultConfig(umi.rpc, endpointAdmin, { + executorConfig: some(executorConfig), + receiveUlnConfig: some(receiveUlnConfig), + remote: TON_EID, + sendUlnConfig: some(sendUlnConfig), + }), + ], + endpointAdmin + ) + }) + + it('Init address lookup table', async function () { + const context = getGlobalContext() + const oftStores = [keys.native.oftStore, keys.adapter.oftStore] + const remoteEids = [DST_EID, SRC_EID] + const [oftEventAuthority] = new UMI.EventPDA(context.program.publicKey).eventAuthority() + + const recentSlot = await umi.rpc.getSlot({ commitment: 'finalized' }) + const [builder, input] = createLut(umi, { + recentSlot, + authority: umi.payer, + payer: umi.payer, + addresses: globalAddress(dvns, oftStores), + }) + await builder.sendAndConfirm(umi) + + // Extend the lookup table with more addresses + const extendAddresses = dedupeAddresses([ + ...oftStores.flatMap((store) => + remoteEids.flatMap((remote) => pathwayAddresses(store, remote, publicKeyBytes(store))) + ), + + // executor + executor.pda.context(umi.payer.publicKey, 1)[0], + umi.payer.publicKey, + + // additional oapp pda + oftEventAuthority, + context.program.publicKey, + ]) + + const chunkSize = 20 + for (let index = 0; index < extendAddresses.length; index += chunkSize) { + await extendLut(umi, { + authority: umi.payer, + address: input.publicKey, + addresses: extendAddresses.slice(index, index + chunkSize), + }).sendAndConfirm(umi) + } + + input.addresses = [...input.addresses, ...extendAddresses] + context.lookupTable = input + }) +}) + +function isClearedAccount(account: AccountInfo, systemProgramId: string): boolean { + return account.owner.toBase58() === systemProgramId +} + +const ENDPOINT_ADMIN_OFFSET = 13 +const ENDPOINT_EID_OFFSET = 8 +const ULN_EID_OFFSET = 8 +const ULN_ADMIN_OFFSET = 77 +const EXECUTOR_OWNER_OFFSET = 9 +const PRICEFEED_ADMIN_OFFSET = 8 +const PRICEFEED_UPDATERS_OFFSET = 40 + +async function ensureEndpointAdmin( + settingsPda: PublicKey, + accountInfo: AccountInfo, + admin: Signer, + connection: Connection +): Promise { + const desiredAdmin = toWeb3JsPublicKey(admin.publicKey) + const desiredBytes = Buffer.from(desiredAdmin.toBytes()) + const data = Buffer.from(accountInfo.data) + const currentBytes = Buffer.from(data.subarray(ENDPOINT_ADMIN_OFFSET, ENDPOINT_ADMIN_OFFSET + 32)) + const currentEid = data.readUInt32LE(ENDPOINT_EID_OFFSET) + if (currentBytes.equals(desiredBytes) && currentEid === SRC_EID) { + return + } + + // Forked settings are owned by mainnet admin; reassign so local tests can set defaults. + desiredBytes.copy(data, ENDPOINT_ADMIN_OFFSET) + if (currentEid !== SRC_EID) { + data.writeUInt32LE(SRC_EID, ENDPOINT_EID_OFFSET) + } + const safeLamports = await connection.getMinimumBalanceForRentExemption(accountInfo.data.length) + await callSurfnetRpc('surfnet_setAccount', [ + settingsPda.toString(), + { + data: data.toString('hex'), + executable: accountInfo.executable, + lamports: safeLamports, + owner: accountInfo.owner.toBase58(), + rentEpoch: 0, + }, + ]) +} + +async function ensureUlnAdmin( + settingsPda: PublicKey, + accountInfo: AccountInfo, + admin: Signer, + connection: Connection +): Promise { + const desiredAdmin = toWeb3JsPublicKey(admin.publicKey) + const desiredBytes = Buffer.from(desiredAdmin.toBytes()) + const currentBytes = Buffer.from(accountInfo.data.subarray(ULN_ADMIN_OFFSET, ULN_ADMIN_OFFSET + 32)) + const data = Buffer.from(accountInfo.data) + const currentEid = data.readUInt32LE(ULN_EID_OFFSET) + if (currentBytes.equals(desiredBytes) && currentEid === DST_EID) { + return + } + + // Forked ULN settings are owned by mainnet admin; reassign for local config updates. + desiredBytes.copy(data, ULN_ADMIN_OFFSET) + if (currentEid !== DST_EID) { + data.writeUInt32LE(DST_EID, ULN_EID_OFFSET) + } + const safeLamports = await connection.getMinimumBalanceForRentExemption(accountInfo.data.length) + await callSurfnetRpc('surfnet_setAccount', [ + settingsPda.toString(), + { + data: data.toString('hex'), + executable: accountInfo.executable, + lamports: safeLamports, + owner: accountInfo.owner.toBase58(), + rentEpoch: 0, + }, + ]) +} + +async function ensureExecutorOwner( + settingsPda: PublicKey, + accountInfo: AccountInfo, + admin: Signer, + connection: Connection +): Promise { + const desiredAdmin = toWeb3JsPublicKey(admin.publicKey) + const desiredBytes = Buffer.from(desiredAdmin.toBytes()) + const currentBytes = Buffer.from(accountInfo.data.subarray(EXECUTOR_OWNER_OFFSET, EXECUTOR_OWNER_OFFSET + 32)) + if (currentBytes.equals(desiredBytes)) { + return + } + + // Forked executor config is owned by mainnet admin; reassign for local config updates. + const data = Buffer.from(accountInfo.data) + desiredBytes.copy(data, EXECUTOR_OWNER_OFFSET) + const safeLamports = await connection.getMinimumBalanceForRentExemption(accountInfo.data.length) + await callSurfnetRpc('surfnet_setAccount', [ + settingsPda.toString(), + { + data: data.toString('hex'), + executable: accountInfo.executable, + lamports: safeLamports, + owner: accountInfo.owner.toBase58(), + rentEpoch: 0, + }, + ]) +} + +async function ensurePriceFeedAdmin( + settingsPda: PublicKey, + accountInfo: AccountInfo, + admin: Signer, + connection: Connection +): Promise { + const desiredAdmin = toWeb3JsPublicKey(admin.publicKey) + const desiredBytes = Buffer.from(desiredAdmin.toBytes()) + const data = Buffer.from(accountInfo.data) + const currentBytes = Buffer.from(data.subarray(PRICEFEED_ADMIN_OFFSET, PRICEFEED_ADMIN_OFFSET + 32)) + let needsUpdate = false + if (!currentBytes.equals(desiredBytes)) { + desiredBytes.copy(data, PRICEFEED_ADMIN_OFFSET) + needsUpdate = true + } + + const updatersLength = data.readUInt32LE(PRICEFEED_UPDATERS_OFFSET) + const updatersStart = PRICEFEED_UPDATERS_OFFSET + 4 + let hasUpdater = false + for (let i = 0; i < updatersLength; i += 1) { + const start = updatersStart + i * 32 + if (data.subarray(start, start + 32).equals(desiredBytes)) { + hasUpdater = true + break + } + } + if (!hasUpdater && updatersLength > 0) { + data.set(desiredBytes, updatersStart) + needsUpdate = true + } + if (!needsUpdate) { + return + } + + // Forked price feed uses mainnet admin/updaters; reset for local price updates. + const safeLamports = await connection.getMinimumBalanceForRentExemption(accountInfo.data.length) + await callSurfnetRpc('surfnet_setAccount', [ + settingsPda.toString(), + { + data: data.toString('hex'), + executable: accountInfo.executable, + lamports: safeLamports, + owner: accountInfo.owner.toBase58(), + rentEpoch: 0, + }, + ]) +} + +async function ensureDvnAdmin( + settingsPda: PublicKey, + accountInfo: AccountInfo, + admin: Signer, + connection: Connection +): Promise { + const serializer = UMI.DVNProgram.accounts.getDvnConfigAccountDataSerializer() + const [state] = serializer.deserialize(accountInfo.data) + const desiredAdmin = admin.publicKey + const desiredVid = DST_EID % 30000 + const desiredSigners = DVN_SIGNERS.map((signer) => getPublicKey(signer, false).subarray(1)) + const quorum = 1 + const needsAdminUpdate = !state.admins.some((current) => current === desiredAdmin) + const needsVidUpdate = state.vid !== desiredVid + const needsSignerUpdate = + state.multisig.quorum !== quorum || + desiredSigners.some((signer) => + state.multisig.signers.every((current) => !Buffer.from(current).equals(Buffer.from(signer))) + ) + if (!needsAdminUpdate && !needsVidUpdate && !needsSignerUpdate) { + return + } + + const nextAdmins = state.admins.length > 0 ? [desiredAdmin, ...state.admins.slice(1)] : [desiredAdmin] + const nextSigners = [...state.multisig.signers] + for (let i = 0; i < Math.min(nextSigners.length, desiredSigners.length); i += 1) { + nextSigners[i] = desiredSigners[i] + } + const nextState = { + ...state, + admins: nextAdmins, + vid: desiredVid, + multisig: { + ...state.multisig, + signers: nextSigners, + quorum, + }, + } + const data = Buffer.from(serializer.serialize(nextState)) + + // Forked DVN config uses mainnet admins/vid/signers; reset so local config updates succeed. + const safeLamports = await connection.getMinimumBalanceForRentExemption(data.length) + await callSurfnetRpc('surfnet_setAccount', [ + settingsPda.toString(), + { + data: data.toString('hex'), + executable: accountInfo.executable, + lamports: safeLamports, + owner: accountInfo.owner.toBase58(), + rentEpoch: 0, + }, + ]) +} + +function globalAddress(dvns: PublicKey[], oapps: PublicKey[]): PublicKey[] { + const addresses: PublicKey[] = [ + publicKey('11111111111111111111111111111111'), + publicKey('Sysvar1nstructions1111111111111111111111111'), + fromWeb3JsPublicKey(TOKEN_2022_PROGRAM_ID), + fromWeb3JsPublicKey(TOKEN_PROGRAM_ID), + fromWeb3JsPublicKey(ASSOCIATED_TOKEN_PROGRAM_ID), + + // Programs + endpoint.programId, + uln.programId, + executor.programId, + priceFeed.programId, + ...dvns, + + // Endpoint PDAs + endpoint.pda.setting()[0], + endpoint.eventAuthority, + endpoint.pda.messageLibraryInfo(uln.pda.messageLib()[0])[0], + + // Uln PDAs + uln.pda.messageLib()[0], + uln.pda.setting()[0], + uln.eventAuthority, + + // Worker Configs + executor.pda.config()[0], + executor.eventAuthority, + priceFeed.pda.priceFeed()[0], + + ...dvns.map((dvn) => new UMI.DvnPDA(publicKey(dvn)).config()[0]), + ...dvns.map((dvn) => new UMI.EventPDA(publicKey(dvn)).eventAuthority()[0]), + + // OApp + ...oapps, + ...oapps.map((oapp) => endpoint.pda.oappRegistry(oapp)[0]), + ] + + return dedupeAddresses(addresses) +} + +function pathwayAddresses(localOApp: PublicKey, remote: number, remoteOApp: Uint8Array): PublicKey[] { + return [ + endpoint.pda.defaultSendLibraryConfig(remote)[0], + endpoint.pda.oappRegistry(localOApp)[0], + endpoint.pda.sendLibraryConfig(localOApp, remote)[0], + endpoint.pda.nonce(localOApp, remote, remoteOApp)[0], + endpoint.pda.pendingNonce(localOApp, remote, remoteOApp)[0], + + uln.pda.defaultSendConfig(remote)[0], + uln.pda.defaultReceiveConfig(remote)[0], + uln.pda.sendConfig(remote, localOApp)[0], + uln.pda.receiveConfig(remote, localOApp)[0], + ] +} + +function dedupeAddresses(addresses: PublicKey[]): PublicKey[] { + const seen = new Set() + return addresses.filter((address) => { + const key = address.toString() + if (seen.has(key)) { + return false + } + seen.add(key) + return true + }) +} diff --git a/examples/oft-solana/test/anchor/suites/layerzero-simulation.test.ts b/examples/oft-solana/test/anchor/suites/layerzero-simulation.test.ts new file mode 100644 index 0000000000..42b2a997c1 --- /dev/null +++ b/examples/oft-solana/test/anchor/suites/layerzero-simulation.test.ts @@ -0,0 +1,127 @@ +import assert from 'assert' + +import { fetchToken } from '@metaplex-foundation/mpl-toolbox' +import { Context, Umi, generateSigner, sol } from '@metaplex-foundation/umi' +import { fromWeb3JsPublicKey, toWeb3JsKeypair, toWeb3JsPublicKey } from '@metaplex-foundation/umi-web3js-adapters' +import { TOKEN_PROGRAM_ID, getOrCreateAssociatedTokenAccount } from '@solana/spl-token' + +import { oft } from '@layerzerolabs/oft-v2-solana-sdk' + +import { DST_EID, OFT_DECIMALS } from '../constants' +import { quoteOft, quoteSend, send } from '../helpers' +import { getGlobalContext, getGlobalKeys, getGlobalUmi } from '../index.test' +import { OftKeySets, TestContext } from '../types' +import { verifyAndReceive } from '../utils' + +describe('LayerZero Simulation', function () { + let umi: Umi | Context + let context: TestContext + let keys: OftKeySets + + before(async function () { + context = getGlobalContext() + umi = getGlobalUmi() + keys = getGlobalKeys() + }) + ;(['native', 'adapter'] as const).forEach((keyLabel) => { + it(`simulates send and receive for ${keyLabel}`, async () => { + const keySet = keys[keyLabel] + if (!keySet.oappAdminTokenAccount) { + throw new Error('Missing admin token account for simulation') + } + + const sendAmount = BigInt(500 * 10 ** OFT_DECIMALS) + + const dest = generateSigner(umi) + await umi.rpc.airdrop(dest.publicKey, sol(10)) + + const tokenDest = await getOrCreateAssociatedTokenAccount( + context.connection, + toWeb3JsKeypair(dest), + toWeb3JsPublicKey(keySet.mint.publicKey), + toWeb3JsPublicKey(dest.publicKey), + false, + undefined, + undefined, + TOKEN_PROGRAM_ID + ) + + const quote = await quoteOft(context, keySet, keySet.oappAdmin, dest.publicKey, DST_EID, sendAmount) + const amountSentLd = quote.oftReceipt.amountSentLd + const amountReceivedLd = quote.oftReceipt.amountReceivedLd + const oftFeeLd = amountSentLd - amountReceivedLd + assert.ok(amountSentLd >= amountReceivedLd) + + const fee = await quoteSend(context, keySet, keySet.oappAdmin, dest.publicKey, DST_EID, sendAmount) + + const beforeSourceBalance = await fetchToken(umi, keySet.oappAdminTokenAccount) + const beforeEscrowBalance = await fetchToken(umi, keySet.escrow.publicKey) + const beforeDestBalance = await fetchToken(umi, fromWeb3JsPublicKey(tokenDest.address)) + const beforeStore = await oft.accounts.fetchOFTStore(umi, keySet.oftStore) + + const packetSentEvent = await send( + context, + keySet, + keySet.oappAdmin, + keySet.oappAdminTokenAccount, + dest.publicKey, + DST_EID, + sendAmount, + fee + ) + + const afterSendSourceBalance = await fetchToken(umi, keySet.oappAdminTokenAccount) + const afterSendEscrowBalance = await fetchToken(umi, keySet.escrow.publicKey) + const afterSendDestBalance = await fetchToken(umi, fromWeb3JsPublicKey(tokenDest.address)) + const afterSendStore = await oft.accounts.fetchOFTStore(umi, keySet.oftStore) + + assert.strictEqual( + afterSendSourceBalance.amount, + beforeSourceBalance.amount - amountSentLd, + 'Source should be debited by amount sent' + ) + + if (keyLabel === 'adapter') { + assert.strictEqual( + afterSendEscrowBalance.amount, + beforeEscrowBalance.amount + amountSentLd, + 'Escrow should hold sent amount for adapter' + ) + assert.strictEqual(afterSendStore.tvlLd, beforeStore.tvlLd + amountReceivedLd) + } else { + assert.strictEqual( + afterSendEscrowBalance.amount, + beforeEscrowBalance.amount + oftFeeLd, + 'Escrow should hold fees for native' + ) + assert.strictEqual(afterSendStore.tvlLd, beforeStore.tvlLd) + } + + assert.strictEqual(afterSendDestBalance.amount, beforeDestBalance.amount) + + await verifyAndReceive(context, keySet, packetSentEvent) + + const afterReceiveDestBalance = await fetchToken(umi, fromWeb3JsPublicKey(tokenDest.address)) + const afterReceiveEscrowBalance = await fetchToken(umi, keySet.escrow.publicKey) + const afterReceiveStore = await oft.accounts.fetchOFTStore(umi, keySet.oftStore) + + assert.strictEqual( + afterReceiveDestBalance.amount, + beforeDestBalance.amount + amountReceivedLd, + 'Destination should receive amount received' + ) + + if (keyLabel === 'adapter') { + assert.strictEqual( + afterReceiveEscrowBalance.amount, + afterSendEscrowBalance.amount - amountReceivedLd, + 'Escrow should release amount received' + ) + assert.strictEqual(afterReceiveStore.tvlLd, afterSendStore.tvlLd - amountReceivedLd) + } else { + assert.strictEqual(afterReceiveEscrowBalance.amount, afterSendEscrowBalance.amount) + assert.strictEqual(afterReceiveStore.tvlLd, afterSendStore.tvlLd) + } + }) + }) +}) diff --git a/examples/oft-solana/test/anchor/suites/quote_instructions.test.ts b/examples/oft-solana/test/anchor/suites/quote_instructions.test.ts new file mode 100644 index 0000000000..1ad34e2a21 --- /dev/null +++ b/examples/oft-solana/test/anchor/suites/quote_instructions.test.ts @@ -0,0 +1,71 @@ +import assert from 'assert' + +import { before, describe, it } from 'mocha' + +import { oft } from '@layerzerolabs/oft-v2-solana-sdk' + +import { DST_EID, OFT_DECIMALS } from '../constants' +import { expectOftError, quoteOft, quoteSend } from '../helpers' +import { getGlobalContext, getGlobalKeys } from '../index.test' +import { OftKeySets, TestContext } from '../types' + +describe('quote instructions', function () { + this.timeout(300000) + + let context: TestContext + let keys: OftKeySets + + before(() => { + context = getGlobalContext() + keys = getGlobalKeys() + }) + ;(['native', 'adapter'] as const).forEach((keyLabel) => { + describe(`${keyLabel} quotes`, () => { + it('rejects slippage when min amount exceeds computed amount', async () => { + const keySet = keys[keyLabel] + const sendAmount = BigInt(2 * 10 ** OFT_DECIMALS) + const minAmount = BigInt(3 * 10 ** OFT_DECIMALS) + + await expectOftError( + async () => + quoteSend( + context, + keySet, + keySet.oappAdmin, + keySet.oappAdmin.publicKey, + DST_EID, + sendAmount, + minAmount + ), + oft.errors.SlippageExceededError, + context.program + ) + }) + + it('returns quoteSend and quoteOft results', async () => { + const keySet = keys[keyLabel] + const sendAmount = BigInt(10 * 10 ** OFT_DECIMALS) + + const quote = await quoteSend( + context, + keySet, + keySet.oappAdmin, + keySet.oappAdmin.publicKey, + DST_EID, + sendAmount + ) + assert.ok(quote.nativeFee >= 0n) + + const oftQuote = await quoteOft( + context, + keySet, + keySet.oappAdmin, + keySet.oappAdmin.publicKey, + DST_EID, + sendAmount + ) + assert.strictEqual(oftQuote.oftReceipt.amountSentLd, sendAmount) + }) + }) + }) +}) diff --git a/examples/oft-solana/test/anchor/suites/send_and_receive.test.ts b/examples/oft-solana/test/anchor/suites/send_and_receive.test.ts new file mode 100644 index 0000000000..f48ad7ad30 --- /dev/null +++ b/examples/oft-solana/test/anchor/suites/send_and_receive.test.ts @@ -0,0 +1,123 @@ +import { Context, Umi } from '@metaplex-foundation/umi' +import { fromWeb3JsPublicKey } from '@metaplex-foundation/umi-web3js-adapters' +import { TOKEN_PROGRAM_ID } from '@solana/spl-token' +import { before, describe, it } from 'mocha' + +import { UMI } from '@layerzerolabs/lz-solana-sdk-v2' +import { oft } from '@layerzerolabs/oft-v2-solana-sdk' + +import { DST_EID, OFT_DECIMALS, endpoint } from '../constants' +import { expectOftError } from '../helpers' +import { getGlobalContext, getGlobalKeys, getGlobalUmi } from '../index.test' +import { OftKeySets, TestContext } from '../types' +import { sendAndConfirm } from '../utils' + +const helper = new UMI.SendHelper() + +describe('send instruction', function () { + this.timeout(300000) + + let context: TestContext + let umi: Umi | Context + let keys: OftKeySets + + before(async function () { + context = getGlobalContext() + umi = getGlobalUmi() + keys = getGlobalKeys() + }) + ;(['native', 'adapter'] as const).forEach((keyLabel) => { + describe(`${keyLabel} send failures`, () => { + it('rejects slippage when min amount exceeds computed amount', async () => { + const { program } = context + const keySet = keys[keyLabel] + const sendAmount = BigInt(1 * 10 ** OFT_DECIMALS) + const minAmount = BigInt(2 * 10 ** OFT_DECIMALS) + if (!keySet.oappAdminTokenAccount) { + throw new Error('Missing admin token account for send test') + } + + const ix = await oft.send( + umi.rpc, + { + payer: keySet.oappAdmin, + tokenMint: keySet.mint.publicKey, + tokenEscrow: keySet.escrow.publicKey, + tokenSource: keySet.oappAdminTokenAccount, + }, + { + dstEid: DST_EID, + to: new Uint8Array(32).fill(1), + amountLd: sendAmount, + minAmountLd: minAmount, + options: new Uint8Array(), + composeMsg: undefined, + nativeFee: 0n, + lzTokenFee: 0n, + }, + { + oft: context.program.publicKey, + endpoint: endpoint.programId, + token: fromWeb3JsPublicKey(TOKEN_PROGRAM_ID), + } + ) + + await expectOftError( + async () => sendAndConfirm(umi, ix, keySet.oappAdmin), + oft.errors.SlippageExceededError, + program + ) + }) + + it('rejects invalid sender when remaining accounts are tampered', async () => { + const { program } = context + const keySet = keys[keyLabel] + if (!keySet.oappAdminTokenAccount) { + throw new Error('Missing admin token account for send test') + } + + const remainingAccounts = await helper.getSendAccounts(umi.rpc, { + payer: keySet.oappAdmin.publicKey, + dstEid: DST_EID, + sender: keySet.oftStore, + receiver: keySet.oftStore, + }) + + const tamperedAccounts = remainingAccounts.slice() + tamperedAccounts[1] = { ...tamperedAccounts[1], pubkey: keySet.mint.publicKey } + + const ix = await oft.send( + umi.rpc, + { + payer: keySet.oappAdmin, + tokenMint: keySet.mint.publicKey, + tokenEscrow: keySet.escrow.publicKey, + tokenSource: keySet.oappAdminTokenAccount, + }, + { + dstEid: DST_EID, + to: new Uint8Array(32).fill(1), + amountLd: 1n, + minAmountLd: 0n, + options: new Uint8Array(), + composeMsg: undefined, + nativeFee: 0n, + lzTokenFee: 0n, + }, + { + oft: context.program.publicKey, + endpoint: endpoint.programId, + token: fromWeb3JsPublicKey(TOKEN_PROGRAM_ID), + }, + tamperedAccounts + ) + + await expectOftError( + async () => sendAndConfirm(umi, ix, keySet.oappAdmin), + oft.errors.InvalidSenderError, + program + ) + }) + }) + }) +}) diff --git a/examples/oft-solana/test/anchor/suites/set_oft_config.test.ts b/examples/oft-solana/test/anchor/suites/set_oft_config.test.ts new file mode 100644 index 0000000000..f226676627 --- /dev/null +++ b/examples/oft-solana/test/anchor/suites/set_oft_config.test.ts @@ -0,0 +1,215 @@ +import assert from 'assert' + +import { Context, PublicKey, Umi, generateSigner, sol } from '@metaplex-foundation/umi' +import { before, describe, it } from 'mocha' + +import { UMI } from '@layerzerolabs/lz-solana-sdk-v2' +import { oft } from '@layerzerolabs/oft-v2-solana-sdk' + +import { endpoint } from '../constants' +import { expectOftError } from '../helpers' +import { getGlobalContext, getGlobalKeys, getGlobalUmi } from '../index.test' +import { OftKeySets, TestContext } from '../types' +import { sendAndConfirm } from '../utils' + +const FEE_TOO_HIGH = 10000 + +describe('set_oft_config', function () { + this.timeout(300000) + + let context: TestContext + let umi: Umi | Context + let keys: OftKeySets + + before(async function () { + context = getGlobalContext() + umi = getGlobalUmi() + keys = getGlobalKeys() + }) + ;(['native', 'adapter'] as const).forEach((keyLabel) => { + describe(`${keyLabel} config`, () => { + let programs: { oft: PublicKey; endpoint: PublicKey } + + before(() => { + programs = { oft: context.program.publicKey, endpoint: endpoint.programId } + }) + + it('rejects unauthorized config updates', async () => { + const { program } = context + const keySet = keys[keyLabel] + const unauthorizedUser = generateSigner(umi) + await umi.rpc.airdrop(unauthorizedUser.publicKey, sol(1)) + + const ix = oft.setOFTConfig( + { + admin: unauthorizedUser, + oftStore: keySet.oftStore, + }, + { + __kind: 'DefaultFee', + defaultFee: 100, + }, + programs + ) + + await expectOftError( + async () => sendAndConfirm(umi, ix, unauthorizedUser), + oft.errors.UnauthorizedError, + program + ) + }) + + it('rejects invalid default fee bps', async () => { + const { program } = context + const keySet = keys[keyLabel] + + const ix = oft.setOFTConfig( + { + admin: keySet.oappAdmin, + oftStore: keySet.oftStore, + }, + { + __kind: 'DefaultFee', + defaultFee: FEE_TOO_HIGH, + }, + programs + ) + + await expectOftError( + async () => sendAndConfirm(umi, ix, keySet.oappAdmin), + oft.errors.InvalidFeeError, + program + ) + }) + + it('sets minimum default fee bps', async () => { + const keySet = keys[keyLabel] + + await sendAndConfirm( + umi, + oft.setOFTConfig( + { + admin: keySet.oappAdmin, + oftStore: keySet.oftStore, + }, + { + __kind: 'DefaultFee', + defaultFee: 0, + }, + programs + ), + keySet.oappAdmin + ) + + const oftStoreAccount = await oft.accounts.fetchOFTStore(umi, keySet.oftStore) + assert.strictEqual(oftStoreAccount.defaultFeeBps, 0) + }) + + it('sets maximum default fee bps', async () => { + const keySet = keys[keyLabel] + + await sendAndConfirm( + umi, + oft.setOFTConfig( + { + admin: keySet.oappAdmin, + oftStore: keySet.oftStore, + }, + { + __kind: 'DefaultFee', + defaultFee: 9999, + }, + programs + ), + keySet.oappAdmin + ) + + const oftStoreAccount = await oft.accounts.fetchOFTStore(umi, keySet.oftStore) + assert.strictEqual(oftStoreAccount.defaultFeeBps, 9999) + }) + + it('updates admin, delegate, and fee', async () => { + const keySet = keys[keyLabel] + + const newAdmin = generateSigner(umi) + await umi.rpc.airdrop(newAdmin.publicKey, sol(10000)) + + await sendAndConfirm( + umi, + oft.setOFTConfig( + { + admin: keySet.oappAdmin, + oftStore: keySet.oftStore, + }, + { + __kind: 'Admin', + admin: newAdmin.publicKey, + }, + programs + ), + keySet.oappAdmin + ) + + const oftStoreAccount = await oft.accounts.fetchOFTStore(umi, keySet.oftStore) + assert.strictEqual(oftStoreAccount.admin, newAdmin.publicKey) + + await sendAndConfirm( + umi, + oft.setOFTConfig( + { + admin: newAdmin, + oftStore: keySet.oftStore, + }, + { + __kind: 'Admin', + admin: keySet.oappAdmin.publicKey, + }, + programs + ), + newAdmin + ) + + await sendAndConfirm( + umi, + oft.setOFTConfig( + { + admin: keySet.oappAdmin, + oftStore: keySet.oftStore, + }, + { + __kind: 'Delegate', + delegate: keySet.delegate.publicKey, + }, + programs + ), + keySet.oappAdmin + ) + + const oappRegistry = await UMI.EndpointProgram.accounts.fetchOAppRegistry( + umi, + endpoint.pda.oappRegistry(keySet.oftStore) + ) + assert.strictEqual(oappRegistry.delegate, keySet.delegate.publicKey) + + await sendAndConfirm( + umi, + oft.setOFTConfig( + { + admin: keySet.oappAdmin, + oftStore: keySet.oftStore, + }, + { + __kind: 'DefaultFee', + defaultFee: 500, + }, + programs + ), + keySet.oappAdmin + ) + + const updatedStore = await oft.accounts.fetchOFTStore(umi, keySet.oftStore) + assert.strictEqual(updatedStore.defaultFeeBps, 500) + }) + }) + }) +}) diff --git a/examples/oft-solana/test/anchor/suites/set_peer_config.test.ts b/examples/oft-solana/test/anchor/suites/set_peer_config.test.ts new file mode 100644 index 0000000000..66252fa422 --- /dev/null +++ b/examples/oft-solana/test/anchor/suites/set_peer_config.test.ts @@ -0,0 +1,204 @@ +import assert from 'assert' + +import { Context, Program, ProgramError, Umi, generateSigner, publicKeyBytes, sol } from '@metaplex-foundation/umi' +import { before, describe, it } from 'mocha' + +import { Options } from '@layerzerolabs/lz-v2-utilities' +import { oft } from '@layerzerolabs/oft-v2-solana-sdk' + +import { DST_EID, SRC_EID } from '../constants' +import { expectOftError } from '../helpers' +import { getGlobalContext, getGlobalKeys, getGlobalUmi } from '../index.test' +import { OftKeySets, TestContext } from '../types' +import { sendAndConfirm, setPeerConfig } from '../utils' + +const enforcedOptions = Options.newOptions().addExecutorLzReceiveOption(200_000, 2_500_000).toBytes() + +describe('set_peer_config', function () { + this.timeout(300000) + + let context: TestContext + let umi: Umi | Context + let keys: OftKeySets + + before(async function () { + context = getGlobalContext() + umi = getGlobalUmi() + keys = getGlobalKeys() + }) + ;(['native', 'adapter'] as const).forEach((keyLabel) => { + describe(`${keyLabel} peer config`, () => { + it('rejects unauthorized peer updates', async () => { + const { program } = context + const keySet = keys[keyLabel] + const invalidSender = generateSigner(umi) + await umi.rpc.airdrop(invalidSender.publicKey, sol(1)) + + const ix = oft.setPeerConfig( + { + admin: invalidSender, + oftStore: keySet.oftStore, + }, + { + __kind: 'PeerAddress', + remote: DST_EID, + peer: publicKeyBytes(keySet.oftStore), + }, + context.programRepo + ) + + await expectOftError( + async () => sendAndConfirm(umi, ix, invalidSender), + oft.errors.UnauthorizedError, + program + ) + }) + + it('rejects invalid fee bps', async () => { + const { program } = context + const keySet = keys[keyLabel] + + const ix = oft.setPeerConfig( + { + admin: keySet.oappAdmin, + oftStore: keySet.oftStore, + }, + { + __kind: 'FeeBps', + remote: DST_EID, + feeBps: 10000, + }, + context.programRepo + ) + + await expectOftError( + async () => sendAndConfirm(umi, ix, keySet.oappAdmin), + oft.errors.InvalidFeeError, + program + ) + }) + + it('rejects invalid enforced options', async () => { + const { program } = context + const keySet = keys[keyLabel] + + const invalidOptions = Uint8Array.from([0, 1]) + const ix = oft.setPeerConfig( + { + admin: keySet.oappAdmin, + oftStore: keySet.oftStore, + }, + { + __kind: 'EnforcedOptions', + remote: DST_EID, + send: invalidOptions, + sendAndCall: invalidOptions, + }, + context.programRepo + ) + + await expectOftError( + async () => sendAndConfirm(umi, ix, keySet.oappAdmin), + class InvalidOptionsError extends ProgramError { + override readonly name: string = 'InvalidOptions' + readonly code: number = 0x1770 // 6000 + constructor(program: Program, cause?: Error) { + super('InvalidOptions', program, cause) + } + }, + program + ) + }) + + it('sets peer addresses and enforced options', async () => { + const keySet = keys[keyLabel] + const peerAddr = publicKeyBytes(keySet.oftStore) + + const dstPeer = await setPeerConfig( + umi as Umi, + keySet, + context.pda, + context.programRepo, + peerAddr, + DST_EID + ) + const srcPeer = await setPeerConfig( + umi as Umi, + keySet, + context.pda, + context.programRepo, + peerAddr, + SRC_EID + ) + + const [dstPeerAccount, srcPeerAccount] = await oft.accounts.fetchAllPeerConfig(umi, [dstPeer, srcPeer]) + assert.strictEqual(dstPeerAccount.peerAddress.toString(), peerAddr.toString()) + assert.strictEqual(srcPeerAccount.peerAddress.toString(), peerAddr.toString()) + + await sendAndConfirm( + umi, + [ + oft.setPeerConfig( + { admin: keySet.oappAdmin, oftStore: keySet.oftStore }, + { + __kind: 'EnforcedOptions', + remote: DST_EID, + send: enforcedOptions, + sendAndCall: enforcedOptions, + }, + context.programRepo + ), + oft.setPeerConfig( + { admin: keySet.oappAdmin, oftStore: keySet.oftStore }, + { + __kind: 'EnforcedOptions', + remote: SRC_EID, + send: enforcedOptions, + sendAndCall: enforcedOptions, + }, + context.programRepo + ), + ], + keySet.oappAdmin + ) + }) + + it('sets outbound rate limit values', async () => { + const keySet = keys[keyLabel] + + await sendAndConfirm( + umi, + oft.setPeerConfig( + { admin: keySet.oappAdmin, oftStore: keySet.oftStore }, + { + __kind: 'OutboundRateLimit', + remote: DST_EID, + rateLimit: { refillPerSecond: 1n, capacity: 5n }, + }, + context.programRepo + ), + keySet.oappAdmin + ) + + const [peer] = context.pda.peer(keySet.oftStore, DST_EID) + const peerConfig = await oft.accounts.fetchPeerConfig(umi, peer) + assert.ok(peerConfig.outboundRateLimiter.__option === 'Some') + assert.strictEqual(peerConfig.outboundRateLimiter.value.capacity, 5n) + + await sendAndConfirm( + umi, + oft.setPeerConfig( + { admin: keySet.oappAdmin, oftStore: keySet.oftStore }, + { + __kind: 'OutboundRateLimit', + remote: DST_EID, + rateLimit: undefined, + }, + context.programRepo + ), + keySet.oappAdmin + ) + }) + }) + }) +}) diff --git a/examples/oft-solana/test/anchor/suites/withdraw_fee.test.ts b/examples/oft-solana/test/anchor/suites/withdraw_fee.test.ts new file mode 100644 index 0000000000..a5eff9dd22 --- /dev/null +++ b/examples/oft-solana/test/anchor/suites/withdraw_fee.test.ts @@ -0,0 +1,165 @@ +import assert from 'assert' + +import { fetchToken } from '@metaplex-foundation/mpl-toolbox' +import { Context, PublicKey, Umi, generateSigner, sol } from '@metaplex-foundation/umi' +import { before, describe, it } from 'mocha' + +import { oft } from '@layerzerolabs/oft-v2-solana-sdk' + +import { DST_EID, OFT_DECIMALS } from '../constants' +import { expectOftError, quoteOft, quoteSend, send } from '../helpers' +import { getGlobalContext, getGlobalKeys, getGlobalUmi } from '../index.test' +import { OftKeySets, TestContext } from '../types' +import { sendAndConfirm } from '../utils' + +const SEND_AMOUNT = BigInt(100 * 10 ** OFT_DECIMALS) + +describe('withdraw_fee', function () { + this.timeout(300000) + + let context: TestContext + let umi: Umi | Context + let keys: OftKeySets + + before(async function () { + context = getGlobalContext() + umi = getGlobalUmi() + keys = getGlobalKeys() + }) + ;(['native', 'adapter'] as const).forEach((keyLabel) => { + describe(`${keyLabel} fee withdrawal`, () => { + it('rejects unauthorized fee withdrawal', async () => { + const { program } = context + const keySet = keys[keyLabel] + const invalidSender = generateSigner(umi) + await umi.rpc.airdrop(invalidSender.publicKey, sol(1)) + + const ix = oft.withdrawFee( + { + admin: invalidSender, + mint: keySet.mint.publicKey, + escrow: keySet.escrow.publicKey, + dest: keySet.oappAdminTokenAccount as PublicKey, + }, + 1n, + { oft: context.program.publicKey } + ) + + await expectOftError( + async () => sendAndConfirm(umi, ix, invalidSender), + oft.errors.UnauthorizedError, + program + ) + }) + + it('rejects withdrawal above available fees', async () => { + const { program } = context + const keySet = keys[keyLabel] + if (!keySet.oappAdminTokenAccount) { + throw new Error('Missing admin token account for fee withdrawal') + } + + const fee = await quoteSend( + context, + keySet, + keySet.oappAdmin, + keySet.oappAdmin.publicKey, + DST_EID, + SEND_AMOUNT + ) + + await send( + context, + keySet, + keySet.oappAdmin, + keySet.oappAdminTokenAccount, + keySet.oappAdmin.publicKey, + DST_EID, + SEND_AMOUNT, + fee + ) + + const oftStore = await oft.accounts.fetchOFTStore(umi, keySet.oftStore) + const escrowBalance = await fetchToken(umi, keySet.escrow.publicKey) + const availableFee = escrowBalance.amount - oftStore.tvlLd + + const ix = oft.withdrawFee( + { + admin: keySet.oappAdmin, + mint: keySet.mint.publicKey, + escrow: keySet.escrow.publicKey, + dest: keySet.oappAdminTokenAccount, + }, + availableFee + 1n, + { oft: context.program.publicKey } + ) + + await expectOftError( + async () => sendAndConfirm(umi, ix, keySet.oappAdmin), + oft.errors.InvalidFeeError, + program + ) + }) + + it('withdraws available fees', async () => { + const keySet = keys[keyLabel] + if (!keySet.oappAdminTokenAccount) { + throw new Error('Missing admin token account for fee withdrawal') + } + + const fee = await quoteSend( + context, + keySet, + keySet.oappAdmin, + keySet.oappAdmin.publicKey, + DST_EID, + SEND_AMOUNT + ) + const quote = await quoteOft( + context, + keySet, + keySet.oappAdmin, + keySet.oappAdmin.publicKey, + DST_EID, + SEND_AMOUNT + ) + const amountSentLd = quote.oftReceipt.amountSentLd + const amountReceivedLd = quote.oftReceipt.amountReceivedLd + const oftFeeLd = amountSentLd - amountReceivedLd + + await send( + context, + keySet, + keySet.oappAdmin, + keySet.oappAdminTokenAccount, + keySet.oappAdmin.publicKey, + DST_EID, + SEND_AMOUNT, + fee + ) + + const oftStore = await oft.accounts.fetchOFTStore(umi, keySet.oftStore) + const escrowBalance = await fetchToken(umi, keySet.escrow.publicKey) + const availableFee = escrowBalance.amount - oftStore.tvlLd + assert.ok(availableFee >= oftFeeLd) + + const destBalanceBefore = await fetchToken(umi, keySet.oappAdminTokenAccount) + + const ix = oft.withdrawFee( + { + admin: keySet.oappAdmin, + mint: keySet.mint.publicKey, + escrow: keySet.escrow.publicKey, + dest: keySet.oappAdminTokenAccount, + }, + oftFeeLd, + { oft: context.program.publicKey } + ) + await sendAndConfirm(umi, ix, keySet.oappAdmin) + + const destBalanceAfter = await fetchToken(umi, keySet.oappAdminTokenAccount) + assert.strictEqual(destBalanceAfter.amount, destBalanceBefore.amount + oftFeeLd) + }) + }) + }) +}) diff --git a/examples/oft-solana/test/anchor/types.ts b/examples/oft-solana/test/anchor/types.ts new file mode 100644 index 0000000000..37b183bf73 --- /dev/null +++ b/examples/oft-solana/test/anchor/types.ts @@ -0,0 +1,42 @@ +import { + AddressLookupTableInput, + Context, + KeypairSigner, + Program, + ProgramRepositoryInterface, + PublicKey, +} from '@metaplex-foundation/umi' +import { Connection } from '@solana/web3.js' + +import { UMI } from '@layerzerolabs/lz-solana-sdk-v2' +import { OftPDA } from '@layerzerolabs/oft-v2-solana-sdk' + +export type PacketSentEvent = UMI.EndpointProgram.events.PacketSentEvent + +export interface TestContext { + umi: Context + connection: Connection + executor: KeypairSigner + program: Program + programRepo: ProgramRepositoryInterface + pda: OftPDA + lookupTable?: AddressLookupTableInput + keys?: OftKeySets +} + +export interface OftKeySets { + native: OftKeys + adapter: OftKeys +} + +export interface OftKeys { + escrow: KeypairSigner + mint: KeypairSigner + tokenMintAuthority: PublicKey + oappAdmin: KeypairSigner + oappAdminTokenAccount?: PublicKey + oftStore: PublicKey + delegate: KeypairSigner + pauser: KeypairSigner + unpauser: KeypairSigner +} diff --git a/examples/oft-solana/test/anchor/utils.ts b/examples/oft-solana/test/anchor/utils.ts new file mode 100755 index 0000000000..bc24a7afbb --- /dev/null +++ b/examples/oft-solana/test/anchor/utils.ts @@ -0,0 +1,359 @@ +import { hexlify } from '@ethersproject/bytes' +import { + AddressLookupTableInput, + Context, + ProgramRepositoryInterface, + PublicKey, + RpcConfirmTransactionResult, + Signer, + TransactionBuilder, + Umi, + WrappedInstruction, + createNoopSigner, + publicKeyBytes, + some, +} from '@metaplex-foundation/umi' +import { + fromWeb3JsInstruction, + fromWeb3JsPublicKey, + toWeb3JsKeypair, + toWeb3JsPublicKey, +} from '@metaplex-foundation/umi-web3js-adapters' +import { sign, utils } from '@noble/secp256k1' +import { + createAssociatedTokenAccountInstruction, + createInitializeMintInstruction, + createMintToInstruction, + createMultisig, + getAssociatedTokenAddressSync, + getMintLen, +} from '@solana/spl-token' +import * as web3 from '@solana/web3.js' + +import { UMI } from '@layerzerolabs/lz-solana-sdk-v2' +import { Options, PacketSerializer, PacketV1Codec } from '@layerzerolabs/lz-v2-utilities' +import { OftPDA, oft } from '@layerzerolabs/oft-v2-solana-sdk' + +import { DST_EID, DVN_SIGNERS, OFT_DECIMALS, SRC_EID, dvns, endpoint, executor, uln } from './constants' +import { callSurfnetRpc } from './index.test' +import { OftKeys, PacketSentEvent, TestContext } from './types' + +async function signWithECDSA( + data: Buffer, + privateKey: Uint8Array +): Promise<{ signature: Uint8Array; recoveryId: number }> { + const [signature, recoveryId] = await sign(Uint8Array.from(data), utils.bytesToHex(privateKey), { + canonical: true, + recovered: true, + der: false, + }) + return { + signature, + recoveryId, + } +} + +export async function initMint( + context: TestContext, + keys: OftKeys, + tokenProgram: PublicKey, + decimals: number = OFT_DECIMALS +): Promise { + const { connection } = context + const multiSigKey = await createMultisig( + connection, + toWeb3JsKeypair(keys.oappAdmin), + [toWeb3JsPublicKey(keys.oftStore), toWeb3JsPublicKey(keys.oappAdmin.publicKey)], + 1, + undefined, + { + commitment: 'confirmed', + preflightCommitment: 'confirmed', + }, + toWeb3JsPublicKey(tokenProgram) + ) + keys.tokenMintAuthority = fromWeb3JsPublicKey(multiSigKey) + + const mintLen = getMintLen([]) + const mintLamports = await connection.getMinimumBalanceForRentExemption(mintLen) + const mintAmount = 100000 * 10 ** decimals + + const tokenAccount = getAssociatedTokenAddressSync( + toWeb3JsPublicKey(keys.mint.publicKey), + toWeb3JsPublicKey(keys.oappAdmin.publicKey), + false, + toWeb3JsPublicKey(tokenProgram) + ) + keys.oappAdminTokenAccount = fromWeb3JsPublicKey(tokenAccount) + + const createMintIx = [ + web3.SystemProgram.createAccount({ + fromPubkey: toWeb3JsPublicKey(keys.oappAdmin.publicKey), + newAccountPubkey: toWeb3JsPublicKey(keys.mint.publicKey), + space: mintLen, + lamports: mintLamports, + programId: toWeb3JsPublicKey(tokenProgram), + }), + ] + + createMintIx.push( + createInitializeMintInstruction( + toWeb3JsPublicKey(keys.mint.publicKey), + decimals, + toWeb3JsPublicKey(keys.tokenMintAuthority), + null, + toWeb3JsPublicKey(tokenProgram) + ), + createAssociatedTokenAccountInstruction( + toWeb3JsPublicKey(keys.oappAdmin.publicKey), + tokenAccount, + toWeb3JsPublicKey(keys.oappAdmin.publicKey), + toWeb3JsPublicKey(keys.mint.publicKey), + toWeb3JsPublicKey(tokenProgram) + ), + createMintToInstruction( + toWeb3JsPublicKey(keys.mint.publicKey), + tokenAccount, + toWeb3JsPublicKey(keys.tokenMintAuthority), + mintAmount, + [toWeb3JsKeypair(keys.oappAdmin)], + toWeb3JsPublicKey(tokenProgram) + ) + ) + + await sendAndConfirm(context.umi, createMintIx, [keys.oappAdmin, keys.mint]) +} + +export async function setPeerConfig( + umi: Umi, + keys: OftKeys, + pda: OftPDA, + programRepo: ProgramRepositoryInterface, + peerAddress: Uint8Array, + dstEid: number = DST_EID +): Promise { + const [peer] = pda.peer(keys.oftStore, dstEid) + + const ix = oft.setPeerConfig( + { + admin: keys.oappAdmin, + oftStore: keys.oftStore, + }, + { + __kind: 'PeerAddress', + remote: dstEid, + peer: peerAddress, + }, + programRepo + ) + await sendAndConfirm(umi, ix, keys.oappAdmin) + return peer +} + +export async function verifyByDvn(context: TestContext, packetSentEvent: PacketSentEvent): Promise { + const packetBytes = packetSentEvent.encodedPacket + + const expiration = BigInt(Math.floor(new Date().getTime() / 1000 + 120)) + const { umi } = context + for (const programId of dvns) { + const dvn = new UMI.DVNProgram.DVN(programId) + const [requiredDVN] = dvn.pda.config() + await new TransactionBuilder( + [ + uln.initVerify(umi.payer, { + dvn: requiredDVN, + packetBytes, + }), + await dvn.invoke( + umi.rpc, + umi.payer, + { + vid: DST_EID % 30000, + instruction: uln.verify(createNoopSigner(requiredDVN), { packetBytes, confirmations: 1 }) + .instruction, + expiration, + }, + { + sign: async (message: Buffer): Promise<{ signature: Uint8Array; recoveryId: number }[]> => { + return Promise.all(DVN_SIGNERS.map(async (s) => signWithECDSA(message, s))) + }, + } + ), + ], + { addressLookupTables: context.lookupTable === undefined ? undefined : [context.lookupTable] } + ).sendAndConfirm(umi, { + send: { preflightCommitment: 'confirmed', commitment: 'confirmed' }, + }) + } +} + +async function ensureConfirmationsReady(context: TestContext, packetBytes: Uint8Array): Promise { + const packet = PacketV1Codec.fromBytes(packetBytes) + const payloadHashBytes = Uint8Array.from(Buffer.from(packet.payloadHash().slice(2), 'hex')) + const headerHashBytes = Uint8Array.from(Buffer.from(packet.headerHash().slice(2), 'hex')) + const serializer = UMI.UlnProgram.accounts.getConfirmationsAccountDataSerializer() + const receiverBytes = Buffer.from(packet.receiver().slice(2), 'hex') + const receiver = fromWeb3JsPublicKey(new web3.PublicKey(receiverBytes)) + const receiveConfigState = await uln.getFinalReceiveConfigState(context.umi.rpc, receiver, packet.srcEid()) + const dvnConfigs = receiveConfigState.requiredDvns.concat(receiveConfigState.optionalDvns) + + for (const dvnConfig of dvnConfigs) { + const [confirmationsPda] = uln.pda.confirmations(headerHashBytes, payloadHashBytes, dvnConfig) + const accountInfo = await context.connection.getAccountInfo(toWeb3JsPublicKey(confirmationsPda)) + if (!accountInfo) { + continue + } + const [state] = serializer.deserialize(accountInfo.data) + const data = Buffer.from(serializer.serialize({ ...state, value: some(1000n) })) + const safeLamports = await context.connection.getMinimumBalanceForRentExemption(data.length) + await callSurfnetRpc('surfnet_setAccount', [ + confirmationsPda.toString(), + { + data: data.toString('hex'), + executable: accountInfo.executable, + lamports: safeLamports, + owner: accountInfo.owner.toBase58(), + rentEpoch: 0, + }, + ]) + } +} + +export async function commitVerification( + context: TestContext, + sender: Uint8Array, + receiver: PublicKey, + packetSentEvent: PacketSentEvent +): Promise { + const packetBytes = packetSentEvent.encodedPacket + const deserializedPacket = PacketV1Codec.fromBytes(packetSentEvent.encodedPacket) + const { umi } = context + const expiration = BigInt(Math.floor(new Date().getTime() / 1000 + 120)) + + await ensureConfirmationsReady(context, packetBytes) + + await new TransactionBuilder([ + endpoint.initVerify(umi.payer, { + srcEid: SRC_EID, + sender, + receiver, + nonce: BigInt(deserializedPacket.nonce()), + }), + await uln.commitVerification(umi.rpc, packetBytes, endpoint.programId), + ]).sendAndConfirm(umi, { send: { preflightCommitment: 'confirmed', commitment: 'confirmed' } }) + + for (const programId of dvns) { + const dvn = new UMI.DVNProgram.DVN(programId) + const [requiredDVN] = dvn.pda.config() + await new TransactionBuilder([ + await dvn.invoke( + umi.rpc, + umi.payer, + { + vid: DST_EID % 30000, + instruction: uln.closeVerify(createNoopSigner(requiredDVN), { + receiver, + packetBytes, + }).instruction, + expiration, + }, + { + sign: async (message: Buffer): Promise<{ signature: Uint8Array; recoveryId: number }[]> => { + return Promise.all(DVN_SIGNERS.map(async (s) => signWithECDSA(message, s))) + }, + } + ), + ]).sendAndConfirm(umi, { send: { preflightCommitment: 'confirmed', commitment: 'confirmed' } }) + } +} + +export async function verifyAndReceive( + context: TestContext, + oftKeys: OftKeys, + packetSentEvent: PacketSentEvent +): Promise { + const { umi } = context + await verifyByDvn(context, packetSentEvent) + await commitVerification(context, publicKeyBytes(oftKeys.oftStore), oftKeys.oftStore, packetSentEvent) + return receive(context, umi, packetSentEvent) +} + +export async function receive(context: TestContext, umi: Context, packetSentEvent: PacketSentEvent): Promise { + const deserializedPacket = PacketSerializer.deserialize(packetSentEvent.encodedPacket) + const { options } = packetSentEvent + const lzReceiveOptions = Options.fromOptions(hexlify(options)).decodeExecutorLzReceiveOption() + const { instructions, signers, addressLookupTables } = await executor.execute(umi.rpc, umi.payer, { + packet: deserializedPacket, + extraData: new Uint8Array(2).fill(0), + value: lzReceiveOptions?.value, + }) + const newAddressLookupTables = [ + ...(context.lookupTable ? [context.lookupTable] : []), + ...(addressLookupTables || []), + ] + const { signature } = await sendAndConfirm( + umi, + instructions.map((ix, index) => ({ + instruction: ix, + signers: index === 0 ? signers : [], + bytesCreatedOnChain: 0, + })), + [umi.payer, ...signers], + 200_000, + newAddressLookupTables + ) + return signature +} + +export async function sendAndConfirm( + umi: Pick, + instructions: WrappedInstruction | WrappedInstruction[] | web3.TransactionInstruction[], + signers: Signer | Signer[], + computeUnitsLimit = 0, + addressLookupTables?: AddressLookupTableInput[] +): Promise<{ + signature: Uint8Array + result: RpcConfirmTransactionResult +}> { + if (!Array.isArray(instructions)) { + instructions = [instructions] + } + if (instructions[0] instanceof web3.TransactionInstruction) { + instructions = (instructions as web3.TransactionInstruction[]).map((ix) => { + return { + instruction: fromWeb3JsInstruction(ix), + signers: [], + bytesCreatedOnChain: 0, + } + }) + } else { + instructions = instructions as WrappedInstruction[] + } + const feePayer = Array.isArray(signers) ? signers[0] : signers + if (Array.isArray(signers) && signers.length > 1) { + const ixSigners = signers.slice(1) + instructions.forEach((ix) => { + ix.signers = ixSigners + }) + } + if (computeUnitsLimit > 0) { + const computeUnitsBudgetIX = web3.ComputeBudgetProgram.setComputeUnitLimit({ + units: computeUnitsLimit, + }) + instructions = [ + { + instruction: fromWeb3JsInstruction(computeUnitsBudgetIX), + signers: [], + bytesCreatedOnChain: 0, + }, + ...instructions, + ] + } + return new TransactionBuilder(instructions, { feePayer: feePayer, addressLookupTables }) + .sendAndConfirm(umi, { + send: { preflightCommitment: 'confirmed', commitment: 'confirmed' }, + }) + .then((result) => { + return { signature: result.signature, result: result.result } + }) +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 82aef3137a..7db9d7b43e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -2497,6 +2497,9 @@ importers: '@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) + '@noble/secp256k1': + specifier: ^1.7.1 + version: 1.7.1 '@nomicfoundation/hardhat-ethers': specifier: ^3.0.5 version: 3.0.5(ethers@5.7.2)(hardhat@2.22.12) @@ -2548,6 +2551,9 @@ importers: '@types/node': specifier: ~18.18.14 version: 18.18.14 + axios: + specifier: ^1.6.2 + version: 1.8.4(debug@4.3.7) bs58: specifier: ^6.0.0 version: 6.0.0 @@ -2605,6 +2611,9 @@ importers: solidity-bytes-utils: specifier: ^0.8.2 version: 0.8.2 + ts-mocha: + specifier: ^10.0.0 + version: 10.1.0(mocha@10.2.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) @@ -4347,7 +4356,7 @@ importers: version: 22.15.3 axios: specifier: ^1.7.2 - version: 1.8.4 + version: 1.8.4(debug@4.3.7) cli-table3: specifier: ^0.6.5 version: 0.6.5 @@ -6649,7 +6658,7 @@ packages: resolution: {integrity: sha512-kJsoy4fAPTOhzVr7Vwq8s/AUg6BQiJDa7WOqRzev4zsuIS3+JCuIZ6vUd7UBsjnxtmguJJulMRs9qWCzVBt2XA==} engines: {node: '>=15.10.0'} dependencies: - axios: 1.7.4(debug@4.3.7) + axios: 1.7.4 got: 11.8.6 transitivePeerDependencies: - debug @@ -9126,7 +9135,7 @@ packages: '@ledgerhq/hw-transport-webhid': 6.30.0 '@ledgerhq/hw-transport-webusb': 6.29.4 '@mysten/bcs': 1.2.0 - axios: 1.8.4 + axios: 1.8.4(debug@4.3.7) bech32: 2.0.0 bignumber.js: 9.1.2 bip32: 5.0.0-rc.0(typescript@5.5.3) @@ -9154,7 +9163,7 @@ packages: '@ledgerhq/hw-transport-webhid': 6.30.0 '@ledgerhq/hw-transport-webusb': 6.29.4 '@mysten/bcs': 1.2.0 - axios: 1.8.4 + axios: 1.8.4(debug@4.3.7) bech32: 2.0.0 bignumber.js: 9.1.2 bip32: 5.0.0-rc.0(typescript@5.5.3) @@ -9182,7 +9191,7 @@ packages: '@ledgerhq/hw-transport-webhid': 6.30.0 '@ledgerhq/hw-transport-webusb': 6.29.4 '@mysten/bcs': 1.2.0 - axios: 1.8.4 + axios: 1.8.4(debug@4.3.7) bech32: 2.0.0 bignumber.js: 9.1.2 bip32: 5.0.0-rc.0(typescript@5.5.3) @@ -12330,7 +12339,7 @@ packages: '@ton/crypto': 3.3.0 '@ton/sandbox': 0.22.0(@ton/core@0.59.0)(@ton/crypto@3.3.0) '@ton/test-utils': 0.4.2(@jest/globals@29.7.0)(@ton/core@0.59.0)(chai@4.5.0) - axios: 1.7.9 + axios: 1.8.4(debug@4.3.7) dataloader: 2.2.2 symbol.inspect: 1.0.1 teslabot: 1.5.0 @@ -12358,7 +12367,7 @@ packages: '@ton/crypto': 3.3.0 '@ton/sandbox': 0.22.0(@ton/core@0.59.0)(@ton/crypto@3.3.0) '@ton/test-utils': 0.4.2(@ton/core@0.59.0)(chai@4.4.1) - axios: 1.7.9 + axios: 1.8.4(debug@4.3.7) dataloader: 2.2.2 symbol.inspect: 1.0.1 teslabot: 1.5.0 @@ -12387,7 +12396,7 @@ packages: '@ton/crypto': 3.3.0 '@ton/sandbox': 0.22.0(@ton/core@0.59.0)(@ton/crypto@3.3.0) '@ton/test-utils': 0.4.2(@jest/globals@29.7.0)(@ton/core@0.59.0)(chai@4.5.0) - axios: 1.7.9 + axios: 1.8.4(debug@4.3.7) dataloader: 2.2.2 symbol.inspect: 1.0.1 teslabot: 1.5.0 @@ -12415,7 +12424,7 @@ packages: '@ton/crypto': 3.3.0 '@ton/sandbox': 0.22.0(@ton/core@0.59.0)(@ton/crypto@3.3.0) '@ton/test-utils': 0.4.2(@jest/globals@29.7.0)(@ton/core@0.59.0)(chai@4.5.0) - axios: 1.7.9 + axios: 1.8.4(debug@4.3.7) dataloader: 2.2.2 symbol.inspect: 1.0.1 teslabot: 1.5.0 @@ -12693,7 +12702,7 @@ packages: '@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) - axios: 1.7.4(debug@4.3.7) + axios: 1.8.4(debug@4.3.7) cbor: 9.0.2 chai: 4.5.0 chalk: 4.1.2 @@ -14888,7 +14897,7 @@ packages: '@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) '@tonconnect/sdk': 2.2.0 arg: 5.0.2 - axios: 1.8.4 + axios: 1.8.4(debug@4.3.7) chalk: 4.1.2 dotenv: 16.4.7 inquirer: 8.2.6 @@ -14919,7 +14928,7 @@ packages: '@ton/ton': /@layerzerolabs/ton@15.2.0-rc.3(@jest/globals@29.7.0)(@layerzerolabs/ton@15.2.0-rc.3)(@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 + axios: 1.8.4(debug@4.3.7) chalk: 4.1.2 dotenv: 16.4.7 inquirer: 8.2.6 @@ -14950,7 +14959,7 @@ packages: '@ton/ton': /@layerzerolabs/ton@15.2.0-rc.3(@layerzerolabs/ton@15.2.0-rc.3)(@ton/core@0.59.0)(@ton/crypto@3.3.0)(@types/node@22.15.3)(typescript@5.5.3) '@tonconnect/sdk': 2.2.0 arg: 5.0.2 - axios: 1.8.4 + axios: 1.8.4(debug@4.3.7) chalk: 4.1.2 dotenv: 16.4.7 inquirer: 8.2.6 @@ -16302,6 +16311,11 @@ packages: is-shared-array-buffer: 1.0.2 dev: true + /arrify@1.0.1: + resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} + engines: {node: '>=0.10.0'} + dev: true + /arrify@2.0.1: resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==} engines: {node: '>=8'} @@ -16430,7 +16444,7 @@ packages: - debug dev: true - /axios@1.7.4(debug@4.3.7): + /axios@1.7.4: resolution: {integrity: sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==} dependencies: follow-redirects: 1.15.9(debug@4.3.7) @@ -16439,28 +16453,19 @@ packages: transitivePeerDependencies: - debug - /axios@1.7.9: - resolution: {integrity: sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==} - dependencies: - follow-redirects: 1.15.9(debug@4.3.7) - form-data: 4.0.1 - proxy-from-env: 1.1.0 - transitivePeerDependencies: - - debug - - /axios@1.8.4: + /axios@1.8.4(debug@4.3.5): resolution: {integrity: sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==} dependencies: - follow-redirects: 1.15.9(debug@4.3.7) + follow-redirects: 1.15.9(debug@4.3.5) form-data: 4.0.1 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug - /axios@1.8.4(debug@4.3.5): + /axios@1.8.4(debug@4.3.7): resolution: {integrity: sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==} dependencies: - follow-redirects: 1.15.9(debug@4.3.5) + follow-redirects: 1.15.9(debug@4.3.7) form-data: 4.0.1 proxy-from-env: 1.1.0 transitivePeerDependencies: @@ -18075,6 +18080,11 @@ packages: resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + /diff@3.5.0: + resolution: {integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==} + engines: {node: '>=0.3.1'} + dev: true + /diff@4.0.2: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} @@ -19186,7 +19196,7 @@ packages: optional: true dependencies: '@solidity-parser/parser': 0.14.5 - axios: 1.8.4 + axios: 1.8.4(debug@4.3.7) cli-table3: 0.5.1 colors: 1.4.0 ethereum-cryptography: 1.2.0 @@ -26374,7 +26384,7 @@ packages: '@babel/runtime': 7.25.6 '@ethersproject/abi': 5.8.0 '@tronweb3/google-protobuf': 3.21.4 - axios: 1.8.4 + axios: 1.8.4(debug@4.3.7) bignumber.js: 9.1.2 ethereum-cryptography: 2.1.3 ethers: 5.7.2 @@ -26501,6 +26511,19 @@ packages: yargs-parser: 21.1.1 dev: true + /ts-mocha@10.1.0(mocha@10.2.0): + resolution: {integrity: sha512-T0C0Xm3/WqCuF2tpa0GNGESTBoKZaiqdUP8guNv4ZY316AFXlyidnrzQ1LUrCT0Wb1i3J0zFTgOh/55Un44WdA==} + engines: {node: '>= 6.X.X'} + hasBin: true + peerDependencies: + mocha: ^3.X.X || ^4.X.X || ^5.X.X || ^6.X.X || ^7.X.X || ^8.X.X || ^9.X.X || ^10.X.X || ^11.X.X + dependencies: + mocha: 10.2.0 + ts-node: 7.0.1 + optionalDependencies: + tsconfig-paths: 3.15.0 + 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'} @@ -26616,6 +26639,21 @@ packages: yn: 3.1.1 dev: true + /ts-node@7.0.1: + resolution: {integrity: sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==} + engines: {node: '>=4.2.0'} + hasBin: true + dependencies: + arrify: 1.0.1 + buffer-from: 1.1.2 + diff: 3.5.0 + make-error: 1.3.6 + minimist: 1.2.8 + mkdirp: 0.5.6 + source-map-support: 0.5.21 + yn: 2.0.0 + dev: true + /tsconfig-paths@3.15.0: resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} dependencies: @@ -27987,6 +28025,11 @@ packages: yargs-parser: 2.4.1 dev: true + /yn@2.0.0: + resolution: {integrity: sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==} + engines: {node: '>=4'} + dev: true + /yn@3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} engines: {node: '>=6'}