diff --git a/README.md b/README.md index 4b22d0549..4791212d5 100644 --- a/README.md +++ b/README.md @@ -9,8 +9,9 @@ Let's Move 一项学Move获得SUI的激励计划,鼓励更多的人学习Move - QQ群: 79489587 ## bootcamp视频 -| 期数 | 视频 | 源码 | -|:-----------------|-------------------------------------------------|:----------------------------------------:| +| 期数 | 视频 | 源码 | +|:-----------------|---------------------------------------------------|:--------------------------------------------------:| +| 2024年11-12月 HOH | [B站](https://www.bilibili.com/video/BV1BMD8Y2EfE) | [课程源码](https://github.com/hoh-zone/move-bootcamp) | | 2024年4-6月 TinTin | [B站](https://www.bilibili.com/video/BV1Rm42177Kx) | [课程源码](https://github.com/move-cn/tintin-bootcamp) | @@ -27,7 +28,6 @@ Let's Move 一项学Move获得SUI的激励计划,鼓励更多的人学习Move | Move Master | [中文](https://master.sui-book.com/) | [move master](https://metaschool.so/sui) | | | move castle | [中文](https://movecastle.sui-book.com/) | [move castle](https://learn.movecastle.info/courses/move-on-sui) | | -[学习路径](learning_map.md) ### 文档 - [官方文档](https://docs.sui.io/) @@ -35,19 +35,3 @@ Let's Move 一项学Move获得SUI的激励计划,鼓励更多的人学习Move ### 代码库 - [Sui](https://github.com/MystenLabs/sui) - -### SDK - -- [Rust SDK](https://docs.sui.io/devnet/build/rust-sdk) (official) -- [TS/JS SDK](https://github.com/MystenLabs/sui/tree/main/sdk/typescript) (official) -- [Sui Typescript SDK (community)](https://github.com/scallop-io/sui-kit) -- [Golang SDK 1 by block vision](https://github.com/block-vision/sui-go-sdk) (community) -- [Golang SDK 2 by coming chat](https://github.com/coming-chat/go-sui-sdk) (community) -- [Python SDK](https://github.com/FrankC01/pysui) (community) -- [Java SDK](https://github.com/GrapeBaBa/sui4j) (community) -- [Kotlin SDK](https://github.com/cosmostation/suikotlin) (community) -- [C# SDK](https://github.com/naami-finance/SuiNet) (community) -- [Sui Dart SDK](https://github.com/mofalabs/sui) (community) -- [Sui dApp Kit Vue](https://github.com/SuiCraftTeam/Sui-dApp-Kit-Vue/) (community) -### 生态项目源码 - diff --git a/learning_map.md b/learning_map.md deleted file mode 100644 index fc5322f40..000000000 --- a/learning_map.md +++ /dev/null @@ -1,52 +0,0 @@ -# 学习路径 - -## 步骤一:前置安装 - -### 安装Sui Wallet -采用Google插件 -https://chromewebstore.google.com/detail/sui-wallet/opcgpfmipidbgpenhmajoajpbobppdil - -### 安装Nodejs -具体安装过程需要自行探索 -https://nodejs.org/en - -### 安装编译器 -VSCODE 和 RustRover 二选一即可 -#### RustRover -RustRover的报错和提示比较友好,也有成熟的插件 -https://www.jetbrains.com.cn/rust/ -#### VSCODE -容易上手,通用性强 -https://code.visualstudio.com/ - -### 配置开发环境 -https://docs.sui.io/guides/developer/getting-started/sui-install -建议采用从Github下载二进制文件,对小白更友好 - - -## 步骤二:基本语法学习 -[bilibili教学视频](https://www.bilibili.com/video/BV1Rm42177Kx/) (视频包括基本语法的学习和实战演练 ) -课程相关代码库: -- https://github.com/404ll/letsmove/tree/main/tutorial/bootcamp -- Swap以及Coin的代码库 https://github.com/uvd/sui-swap-course - -完整入门手册,非常详细 -- [轻松入门move](https://easy.sui-book.com/chapter_1.htm) - - -## 步骤三:深入学习以及完成task - -区块链浏览器:https://suivision.xyz/ - -由于教学视频的时间限制,手把手教学来完成每一个task基本是不现实的,同时已有的学习资料已经完全足够从入门到熟练掌握 -因此需要学员有强大的内驱力和学习能力,从已有的文档和代码库中,寻找和学习所需的知识点 - -基于官方标准库,可以查询和了解每一个函数的功能及使用方法 -- https://github.com/MystenLabs/sui/tree/main/crates/sui-framework - -探索官方文档(包括Coin协议等等) -- https://docs.sui.io - - - - diff --git a/mover/Jamie-Jan/code/readme.md b/mover/Jamie-Jan/code/readme.md index e69de29bb..2b25c8a7e 100644 --- a/mover/Jamie-Jan/code/readme.md +++ b/mover/Jamie-Jan/code/readme.md @@ -0,0 +1,31 @@ +# 设置网络与切换 +```shell +# 设置mainnet主网 +sui client new-env --alias testnet --rpc https://fullnode.testnet.sui.io:443 + +# 切换当前使用的网络 +sui client switch --env mainnet +``` + +# 导入已有地址Address与切换 +```shell +# 通过助记词导入已有地址address +sui keytool import "12个助记词" ed25519 + +# 切换address +sui client switch --address 0xe3c97815e1d899293c2dc11fdde713b28294d621d49bbc3557add8e937c2ac65 +``` + +# 发布上链 +```shell +sui client publish --gas-budget 100000000 --skip-fetch-latest-git-deps +``` + +# 调用合约中的某个方法 +```shell +## 方法名称 合约名称 合约上链后的地址address 合约方法接收的 参数1 参数2 +sui client call --function mint --module faucet_coin --package 0x458446d261dff12681934d1a0f890fc341a522794007400279cce10ec16002e3 --args 0x30ee475266140f97fbbcc98ae37e9d3f093fdb1e4978b3ac83fe99ec90a0fd07 100 --gas-budget 10000000 + +# mint nft +sui client call --function mint --module JANMIE_JAN_NFT --package 0x88eeddd2a7f1cd119741d22c8491a016aa0b89f5abcf356707d37ca96518475b --args 0x7b8e0864967427679b4e129f79dc332a885c6087ec9e187b53451a9006ee15f2 --gas-budget 5000000 +``` \ No newline at end of file diff --git a/mover/Jamie-Jan/code/task2/faucet_coin/Move.lock b/mover/Jamie-Jan/code/task2/faucet_coin/Move.lock new file mode 100644 index 000000000..e4a51f575 --- /dev/null +++ b/mover/Jamie-Jan/code/task2/faucet_coin/Move.lock @@ -0,0 +1,34 @@ +# @generated by Move, please check-in and do not edit manually. + +[move] +version = 3 +manifest_digest = "6CA6BA8684E52C7425AB87DEB7B8D2BFF9FE2442552828717AC503B9C50DD72B" +deps_digest = "F8BBB0CCB2491CA29A3DF03D6F92277A4F3574266507ACD77214D37ECA3F3082" +dependencies = [ + { id = "Sui", name = "Sui" }, +] + +[[move.package]] +id = "MoveStdlib" +source = { git = "https://gitee.com/MystenLabs/sui.git", rev = "framework/testnet", subdir = "crates\\sui-framework\\packages\\move-stdlib" } + +[[move.package]] +id = "Sui" +source = { git = "https://gitee.com/MystenLabs/sui.git", rev = "framework/testnet", subdir = "crates/sui-framework/packages/sui-framework" } + +dependencies = [ + { id = "MoveStdlib", name = "MoveStdlib" }, +] + +[move.toolchain-version] +compiler-version = "1.37.1" +edition = "2024.beta" +flavor = "sui" + +[env] + +[env.mainnet] +chain-id = "35834a8a" +original-published-id = "0x458446d261dff12681934d1a0f890fc341a522794007400279cce10ec16002e3" +latest-published-id = "0x458446d261dff12681934d1a0f890fc341a522794007400279cce10ec16002e3" +published-version = "1" diff --git a/mover/Jamie-Jan/code/task2/faucet_coin/Move.toml b/mover/Jamie-Jan/code/task2/faucet_coin/Move.toml new file mode 100644 index 000000000..02ca76f9d --- /dev/null +++ b/mover/Jamie-Jan/code/task2/faucet_coin/Move.toml @@ -0,0 +1,37 @@ +[package] +name = "faucet_coin" +edition = "2024.beta" # edition = "legacy" to use legacy (pre-2024) Move +# license = "" # e.g., "MIT", "GPL", "Apache 2.0" +# authors = ["..."] # e.g., ["Joe Smith (joesmith@noemail.com)", "John Snow (johnsnow@noemail.com)"] + +[dependencies] +Sui = { git = "https://gitee.com/MystenLabs/sui.git", subdir = "crates/sui-framework/packages/sui-framework", rev = "framework/testnet" } + +# For remote import, use the `{ git = "...", subdir = "...", rev = "..." }`. +# Revision can be a branch, a tag, and a commit hash. +# MyRemotePackage = { git = "https://some.remote/host.git", subdir = "remote/path", rev = "main" } + +# For local dependencies use `local = path`. Path is relative to the package root +# Local = { local = "../path/to" } + +# To resolve a version conflict and force a specific version for dependency +# override use `override = true` +# Override = { local = "../conflicting/version", override = true } + +[addresses] +faucet_coin = "0x0" + +# Named addresses will be accessible in Move as `@name`. They're also exported: +# for example, `std = "0x1"` is exported by the Standard Library. +# alice = "0xA11CE" + +[dev-dependencies] +# The dev-dependencies section allows overriding dependencies for `--test` and +# `--dev` modes. You can introduce test-only dependencies here. +# Local = { local = "../path/to/dev-build" } + +[dev-addresses] +# The dev-addresses section allows overwriting named addresses for the `--test` +# and `--dev` modes. +# alice = "0xB0B" + diff --git a/mover/Jamie-Jan/code/task2/faucet_coin/sources/faucet_coin.move b/mover/Jamie-Jan/code/task2/faucet_coin/sources/faucet_coin.move new file mode 100644 index 000000000..8dcfb6a40 --- /dev/null +++ b/mover/Jamie-Jan/code/task2/faucet_coin/sources/faucet_coin.move @@ -0,0 +1,50 @@ +/// Module: faucet_coin +module faucet_coin::faucet_coin { + use sui::coin::{Self, Coin, TreasuryCap}; + use sui::balance; + + public struct FAUCET_COIN has drop {} + + public struct MySupply has key, store { + id: UID, + supply: balance::Supply + } + + + #[allow(lint(share_owned))] + fun init(witness: FAUCET_COIN, ctx: &mut TxContext) { + let (treasury_cap, coin_metadata) = coin::create_currency( + witness, + 6, + b"JAMIE_JAN_FAUCET", + b"JAMIE_JAN_FAUCET", + b"JAMIE_JAN Faucet Coin", + option::none(), + ctx + ); + + // https://zh.blog.sui.io/linter-compile-warnings-update/ + sui::transfer::public_share_object(coin_metadata); + + let supply = coin::treasury_into_supply(treasury_cap); + transfer::public_transfer(MySupply { + id: object::new(ctx), + supply + }, ctx.sender()); + } + + public entry fun mint(supply: &mut MySupply, value: u64, ctx: &mut TxContext) { + let balance = balance::increase_supply(&mut supply.supply, value); + let coin = coin::from_balance(balance, ctx); + transfer::public_transfer(coin, ctx.sender()); + } + + public fun burn(treasury_cap: &mut TreasuryCap, coin: Coin) { + coin::burn(treasury_cap, coin); + } + + #[test_only] + public fun test_init(ctx: &mut tx_context::TxContext) { + init(FAUCET_COIN{}, ctx); + } +} diff --git a/mover/Jamie-Jan/code/task2/faucet_coin/tests/faucet_coin_tests.move b/mover/Jamie-Jan/code/task2/faucet_coin/tests/faucet_coin_tests.move new file mode 100644 index 000000000..74b01751a --- /dev/null +++ b/mover/Jamie-Jan/code/task2/faucet_coin/tests/faucet_coin_tests.move @@ -0,0 +1,18 @@ +/* +#[test_only] +module faucet_coin::faucet_coin_tests; +// uncomment this line to import the module +// use faucet_coin::faucet_coin; + +const ENotImplemented: u64 = 0; + +#[test] +fun test_faucet_coin() { + // pass +} + +#[test, expected_failure(abort_code = ::faucet_coin::faucet_coin_tests::ENotImplemented)] +fun test_faucet_coin_fail() { + abort ENotImplemented +} +*/ diff --git a/mover/Jamie-Jan/code/task2/my_coin/Move.lock b/mover/Jamie-Jan/code/task2/my_coin/Move.lock new file mode 100644 index 000000000..14653d645 --- /dev/null +++ b/mover/Jamie-Jan/code/task2/my_coin/Move.lock @@ -0,0 +1,34 @@ +# @generated by Move, please check-in and do not edit manually. + +[move] +version = 3 +manifest_digest = "837E1BE1E9D777A88A7A690D7144460A4BEF0543655FA617878BE8FEFDC1AD1A" +deps_digest = "F8BBB0CCB2491CA29A3DF03D6F92277A4F3574266507ACD77214D37ECA3F3082" +dependencies = [ + { id = "Sui", name = "Sui" }, +] + +[[move.package]] +id = "MoveStdlib" +source = { git = "https://gitee.com/MystenLabs/sui.git", rev = "framework/testnet", subdir = "crates\\sui-framework\\packages\\move-stdlib" } + +[[move.package]] +id = "Sui" +source = { git = "https://gitee.com/MystenLabs/sui.git", rev = "framework/testnet", subdir = "crates/sui-framework/packages/sui-framework" } + +dependencies = [ + { id = "MoveStdlib", name = "MoveStdlib" }, +] + +[move.toolchain-version] +compiler-version = "1.37.1" +edition = "2024.beta" +flavor = "sui" + +[env] + +[env.mainnet] +chain-id = "35834a8a" +original-published-id = "0xaf01f79b811630aaba9568132599368ef365b90fa254e5d2f91efbf3cf629f8e" +latest-published-id = "0xaf01f79b811630aaba9568132599368ef365b90fa254e5d2f91efbf3cf629f8e" +published-version = "1" diff --git a/mover/Jamie-Jan/code/task2/my_coin/Move.toml b/mover/Jamie-Jan/code/task2/my_coin/Move.toml new file mode 100644 index 000000000..b89ab5dd4 --- /dev/null +++ b/mover/Jamie-Jan/code/task2/my_coin/Move.toml @@ -0,0 +1,37 @@ +[package] +name = "my_coin" +edition = "2024.beta" # edition = "legacy" to use legacy (pre-2024) Move +# license = "" # e.g., "MIT", "GPL", "Apache 2.0" +# authors = ["..."] # e.g., ["Joe Smith (joesmith@noemail.com)", "John Snow (johnsnow@noemail.com)"] + +[dependencies] +Sui = { git = "https://gitee.com/MystenLabs/sui.git", subdir = "crates/sui-framework/packages/sui-framework", rev = "framework/testnet" } + +# For remote import, use the `{ git = "...", subdir = "...", rev = "..." }`. +# Revision can be a branch, a tag, and a commit hash. +# MyRemotePackage = { git = "https://some.remote/host.git", subdir = "remote/path", rev = "main" } + +# For local dependencies use `local = path`. Path is relative to the package root +# Local = { local = "../path/to" } + +# To resolve a version conflict and force a specific version for dependency +# override use `override = true` +# Override = { local = "../conflicting/version", override = true } + +[addresses] +my_coin = "0x0" + +# Named addresses will be accessible in Move as `@name`. They're also exported: +# for example, `std = "0x1"` is exported by the Standard Library. +# alice = "0xA11CE" + +[dev-dependencies] +# The dev-dependencies section allows overriding dependencies for `--test` and +# `--dev` modes. You can introduce test-only dependencies here. +# Local = { local = "../path/to/dev-build" } + +[dev-addresses] +# The dev-addresses section allows overwriting named addresses for the `--test` +# and `--dev` modes. +# alice = "0xB0B" + diff --git a/mover/Jamie-Jan/code/task2/my_coin/sources/my_coin.move b/mover/Jamie-Jan/code/task2/my_coin/sources/my_coin.move new file mode 100644 index 000000000..054368360 --- /dev/null +++ b/mover/Jamie-Jan/code/task2/my_coin/sources/my_coin.move @@ -0,0 +1,34 @@ +module my_coin::my_coin { + use sui::coin::{Self, Coin, TreasuryCap}; + + public struct MY_COIN has drop {} + + fun init(witness: MY_COIN, ctx: &mut TxContext) { + let (treasury, metadata) = coin::create_currency( + witness, + 6, + b"JAMIE_JAN_COIN", + b"JAMIE_JAN_COIN", + b"JAMIE_JAN coin", + option::none(), + ctx + ); + transfer::public_freeze_object(metadata); + transfer::public_transfer(treasury, ctx.sender()); + } + + public fun mint( + treasury_cap: &mut TreasuryCap, amount: u64, recipient: address, ctx: &mut TxContext + ) { + coin::mint_and_transfer(treasury_cap, amount, recipient, ctx) + } + + public fun burn(treasury_cap: &mut TreasuryCap, coin: Coin) { + coin::burn(treasury_cap, coin); + } + + #[test_only] + public fun test_init(ctx: &mut TxContext) { + init(MY_COIN {}, ctx) + } +} diff --git a/mover/Jamie-Jan/code/task2/my_coin/tests/my_coin_tests.move b/mover/Jamie-Jan/code/task2/my_coin/tests/my_coin_tests.move new file mode 100644 index 000000000..cd5b36060 --- /dev/null +++ b/mover/Jamie-Jan/code/task2/my_coin/tests/my_coin_tests.move @@ -0,0 +1,18 @@ +/* +#[test_only] +module my_coin::my_coin_tests; +// uncomment this line to import the module +// use my_coin::my_coin; + +const ENotImplemented: u64 = 0; + +#[test] +fun test_my_coin() { + // pass +} + +#[test, expected_failure(abort_code = ::my_coin::my_coin_tests::ENotImplemented)] +fun test_my_coin_fail() { + abort ENotImplemented +} +*/ diff --git a/mover/Jamie-Jan/code/task3/jamie_jan_nft/Move.lock b/mover/Jamie-Jan/code/task3/jamie_jan_nft/Move.lock new file mode 100644 index 000000000..8dfdbdfd4 --- /dev/null +++ b/mover/Jamie-Jan/code/task3/jamie_jan_nft/Move.lock @@ -0,0 +1,34 @@ +# @generated by Move, please check-in and do not edit manually. + +[move] +version = 3 +manifest_digest = "9F86EC3002C38200506D338FEC8D19980A7EAD9D4207EEBC9D6EC023BE6951D2" +deps_digest = "F8BBB0CCB2491CA29A3DF03D6F92277A4F3574266507ACD77214D37ECA3F3082" +dependencies = [ + { id = "Sui", name = "Sui" }, +] + +[[move.package]] +id = "MoveStdlib" +source = { git = "https://gitee.com/MystenLabs/sui.git", rev = "framework/testnet", subdir = "crates\\sui-framework\\packages\\move-stdlib" } + +[[move.package]] +id = "Sui" +source = { git = "https://gitee.com/MystenLabs/sui.git", rev = "framework/testnet", subdir = "crates/sui-framework/packages/sui-framework" } + +dependencies = [ + { id = "MoveStdlib", name = "MoveStdlib" }, +] + +[move.toolchain-version] +compiler-version = "1.37.1" +edition = "2024.beta" +flavor = "sui" + +[env] + +[env.mainnet] +chain-id = "35834a8a" +original-published-id = "0x88eeddd2a7f1cd119741d22c8491a016aa0b89f5abcf356707d37ca96518475b" +latest-published-id = "0x88eeddd2a7f1cd119741d22c8491a016aa0b89f5abcf356707d37ca96518475b" +published-version = "1" diff --git a/mover/Jamie-Jan/code/task3/jamie_jan_nft/Move.toml b/mover/Jamie-Jan/code/task3/jamie_jan_nft/Move.toml new file mode 100644 index 000000000..f5639d3eb --- /dev/null +++ b/mover/Jamie-Jan/code/task3/jamie_jan_nft/Move.toml @@ -0,0 +1,37 @@ +[package] +name = "jamie_jan_nft" +edition = "2024.beta" # edition = "legacy" to use legacy (pre-2024) Move +# license = "" # e.g., "MIT", "GPL", "Apache 2.0" +# authors = ["..."] # e.g., ["Joe Smith (joesmith@noemail.com)", "John Snow (johnsnow@noemail.com)"] + +[dependencies] +Sui = { git = "https://gitee.com/MystenLabs/sui.git", subdir = "crates/sui-framework/packages/sui-framework", rev = "framework/testnet" } + +# For remote import, use the `{ git = "...", subdir = "...", rev = "..." }`. +# Revision can be a branch, a tag, and a commit hash. +# MyRemotePackage = { git = "https://some.remote/host.git", subdir = "remote/path", rev = "main" } + +# For local dependencies use `local = path`. Path is relative to the package root +# Local = { local = "../path/to" } + +# To resolve a version conflict and force a specific version for dependency +# override use `override = true` +# Override = { local = "../conflicting/version", override = true } + +[addresses] +jamie_jan_nft = "0x0" + +# Named addresses will be accessible in Move as `@name`. They're also exported: +# for example, `std = "0x1"` is exported by the Standard Library. +# alice = "0xA11CE" + +[dev-dependencies] +# The dev-dependencies section allows overriding dependencies for `--test` and +# `--dev` modes. You can introduce test-only dependencies here. +# Local = { local = "../path/to/dev-build" } + +[dev-addresses] +# The dev-addresses section allows overwriting named addresses for the `--test` +# and `--dev` modes. +# alice = "0xB0B" + diff --git a/mover/Jamie-Jan/code/task3/jamie_jan_nft/sources/jamie_jan_nft.move b/mover/Jamie-Jan/code/task3/jamie_jan_nft/sources/jamie_jan_nft.move new file mode 100644 index 000000000..ef2e0370a --- /dev/null +++ b/mover/Jamie-Jan/code/task3/jamie_jan_nft/sources/jamie_jan_nft.move @@ -0,0 +1,56 @@ +module jamie_jan_nft::JANMIE_JAN_NFT; +use std::string; +use std::string::{String, utf8}; +use sui::transfer::transfer; +use sui::package; +use sui::display; + + +public struct MyNFT has key{ + id:UID, + name:String, + image_url:String, +} + +public struct JANMIE_JAN_NFT has drop{} + +fun init(otw:JANMIE_JAN_NFT,ctx:&mut TxContext){ + let keys=vector[ + utf8(b"name"), + utf8(b"image_url"), + ]; + + let values=vector[ + utf8(b"{name}"), + utf8(b"{image_url}"), + ]; + + let publisher = package::claim(otw, ctx); + + let mut display = display::new_with_fields( + &publisher, keys, values, ctx + ); + + display::update_version(&mut display); + + transfer::public_transfer(publisher, ctx.sender()); + transfer::public_transfer(display, ctx.sender()); +} + +public entry fun mint(url:String, recipient:address, ctx:&mut TxContext){ + let jamie_jan_nft=MyNFT{ + id:object::new(ctx), + name:string::utf8(b"JANMIE_JAN NFT"), + image_url:url, + }; + + let send_nft=MyNFT{ + id:object::new(ctx), + name:string::utf8(b"send_nft"), + image_url:string::utf8(b"https://s1.imagehub.cc/images/2024/12/06/f2f657ee77dd947a09732e86afd886ac.jpg"), + }; + + transfer(jamie_jan_nft,ctx.sender()); + + transfer(send_nft,recipient); +} \ No newline at end of file diff --git a/mover/Jamie-Jan/code/task3/jamie_jan_nft/tests/jamie_jan_nft_tests.move b/mover/Jamie-Jan/code/task3/jamie_jan_nft/tests/jamie_jan_nft_tests.move new file mode 100644 index 000000000..0940ffa8b --- /dev/null +++ b/mover/Jamie-Jan/code/task3/jamie_jan_nft/tests/jamie_jan_nft_tests.move @@ -0,0 +1,18 @@ +/* +#[test_only] +module jamie_jan_nft::jamie_jan_nft_tests; +// uncomment this line to import the module +// use jamie_jan_nft::jamie_jan_nft; + +const ENotImplemented: u64 = 0; + +#[test] +fun test_jamie_jan_nft() { + // pass +} + +#[test, expected_failure(abort_code = ::jamie_jan_nft::jamie_jan_nft_tests::ENotImplemented)] +fun test_jamie_jan_nft_fail() { + abort ENotImplemented +} +*/ diff --git a/mover/Jamie-Jan/images/sui_nfts.png b/mover/Jamie-Jan/images/sui_nfts.png new file mode 100644 index 000000000..863bb60ff Binary files /dev/null and b/mover/Jamie-Jan/images/sui_nfts.png differ diff --git "a/mover/Jamie-Jan/images/task2-deployed\346\210\252\345\233\276.png" "b/mover/Jamie-Jan/images/task2-deployed\346\210\252\345\233\276.png" new file mode 100644 index 000000000..26c4a6e42 Binary files /dev/null and "b/mover/Jamie-Jan/images/task2-deployed\346\210\252\345\233\276.png" differ diff --git a/mover/Jamie-Jan/readme.md b/mover/Jamie-Jan/readme.md index 0750e53f2..efae8dcae 100644 --- a/mover/Jamie-Jan/readme.md +++ b/mover/Jamie-Jan/readme.md @@ -19,17 +19,17 @@ - [√] package id 在 scan上的查看截图:![Scan截图](./images/sui_scan.png) ## 02 move coin -- [] My Coin package id : -- [] Faucet package id : -- [] 转账 `My Coin` hash: -- [] `Faucet Coin` address1 mint hash: -- [] `Faucet Coin` address2 mint hash: +- [√] My Coin package id : 0xaf01f79b811630aaba9568132599368ef365b90fa254e5d2f91efbf3cf629f8e +- [√] Faucet package id : 0x458446d261dff12681934d1a0f890fc341a522794007400279cce10ec16002e3 +- [√] 转账 `My Coin` hash: 14auH62ZAqwz5bdJZod61Qqmv8mwUVUHb74yeUhKXWx8 +- [√] `Faucet Coin` address1 mint hash: 8ANyAkjwoFeFvHNqigpTVnC4pizb752td1injuu4rjZe +- [√] `Faucet Coin` address2 mint hash: FZLcqYNDvSAf4yTbnM4aKePx1oeiUx1jT8eAYn6SkjAj ## 03 move NFT -- [] nft package id : -- [] nft object id : -- [] 转账 nft hash: -- [] scan上的NFT截图:![Scan截图](./images/你的图片地址) +- [] nft package id : 0x88eeddd2a7f1cd119741d22c8491a016aa0b89f5abcf356707d37ca96518475b +- [] nft object id : 0xe7ddada450f00a7ba5c4df241718a44696b4951ed6951a4050b996e79440f247 +- [] 转账 nft hash: GzQ4Tc4jbgpJbLT4LQ2jYSwg3PxtGAxPWCwkreFPAAcp +- [] scan上的NFT截图:![Scan截图](./images/sui_nfts.png) ## 04 Move Game - [] game package id : diff --git a/mover/ctianming/co-learn-2411/images/lesson_3.png b/mover/ctianming/co-learn-2411/images/lesson_3.png new file mode 100644 index 000000000..5ed526e59 Binary files /dev/null and b/mover/ctianming/co-learn-2411/images/lesson_3.png differ diff --git a/mover/ctianming/co-learn-2411/images/meeting_3.jpg b/mover/ctianming/co-learn-2411/images/meeting_3.jpg new file mode 100644 index 000000000..b841587ef Binary files /dev/null and b/mover/ctianming/co-learn-2411/images/meeting_3.jpg differ diff --git a/mover/ctianming/co-learn-2411/images/note_share_7.png b/mover/ctianming/co-learn-2411/images/note_share_7.png new file mode 100644 index 000000000..1cb71389f Binary files /dev/null and b/mover/ctianming/co-learn-2411/images/note_share_7.png differ diff --git a/mover/ctianming/co-learn-2411/images/readme.md b/mover/ctianming/co-learn-2411/images/readme.md index 95853bd58..7ced025bb 100644 --- a/mover/ctianming/co-learn-2411/images/readme.md +++ b/mover/ctianming/co-learn-2411/images/readme.md @@ -38,4 +38,13 @@ b站关注 第五篇笔记分享 ![alt text](image.png) -第六篇笔记分享 \ No newline at end of file +第六篇笔记分享 + +![](image.png) +第七篇笔记分享 + +![alt text](image.png) +第三周学课程学习 + +![alt text](Screenshot_2024-12-02-20-05-18-395_com.tencent.we.jpg) +12.3会议 \ No newline at end of file diff --git a/mover/ctianming/co-learn-2411/readme.md b/mover/ctianming/co-learn-2411/readme.md index 163cb2e3c..9f67ab1b9 100644 --- a/mover/ctianming/co-learn-2411/readme.md +++ b/mover/ctianming/co-learn-2411/readme.md @@ -12,14 +12,14 @@ - [x] 第一周:![学习记录截图](./images/lesson_1.png) - [x] 第二周:![学习记录截图](./images/lesson_2.png) -- [] 第三周:![学习记录截图](./images/你的图片地址) +- [x] 第三周:![学习记录截图](./images/lesson_3.png) - [] 第四周:![学习记录截图](./images/你的图片地址) ## 参加直播答疑 - [x] 第一周:![学习记录截图](./images/meeting_1.jpg) - [x] 第二周:![学习记录截图](./images/meeting_2.png) -- [] 第三周:![学习记录截图](./images/你的图片地址) +- [x] 第三周:![学习记录截图](./images/meeting_3.jpg) - [] 第四周:![学习记录截图](./images/你的图片地址) ## 群里分享学习笔记 @@ -30,6 +30,7 @@ - [x] 第四篇笔记: ![第四篇笔记分享](./images/note_share_4.png) - [x] 第五篇笔记: ![第五篇笔记分享](./images/note_share_5.png) - [x] 第六篇笔记: ![第六篇笔记分享](./images/note_share_6.png) +- [x] 第七篇笔记: ![第七篇笔记分享](./images/note_share_7.png) ## 对外输出学习笔记 @@ -38,7 +39,8 @@ - [x] 第三篇笔记【https://learnblockchain.cn/article/9912】 - [x] 第四篇笔记【https://learnblockchain.cn/article/9938】 - [x] 第五篇笔记【https://learnblockchain.cn/article/9969】 -- [x] 第五篇笔记【https://learnblockchain.cn/article/10021】 +- [x] 第六篇笔记【https://learnblockchain.cn/article/10021】 +- [x] 第七篇笔记【https://learnblockchain.cn/article/10171】 ## 在HOH社区公众号发布自己的技术文章 diff --git "a/mover/ctianming/notes/sui-move\345\237\272\347\241\200\357\274\210\344\270\203\357\274\211\357\274\232letsmove-task6.md" "b/mover/ctianming/notes/sui-move\345\237\272\347\241\200\357\274\210\344\270\203\357\274\211\357\274\232letsmove-task6.md" new file mode 100644 index 000000000..e225a77d1 --- /dev/null +++ "b/mover/ctianming/notes/sui-move\345\237\272\347\241\200\357\274\210\344\270\203\357\274\211\357\274\232letsmove-task6.md" @@ -0,0 +1,426 @@ +--- +title: sui-move基础(六):letsmove-task5 +date: 2024-11-24 17:27:00 +tags: +--- + +# sui-move基础(七):letsmove-task6 + +### 需求 + +- 完成 dapp-kit 学习 +- 完成 Sui SDK 学习 +- 完成 PTB的概念学习 +- 完成 Navi Protocol 学习 +- 在 dapp-kit里面用chrome钱包签名提交 +- 完成 必须在同一个PTB完成 Navi SDK 1.[存入Navi Protocol 1 SUI] 2.[借出当前日期的USDC 0.[月][天][小时] 的 USDC ] + 3.[然后在存入等额的USDC] + +### 写在前面 + +在任务描述中,已经给了我们一些进行学习的相关资料。 + +因为task6涉及到的内容比较多,所以还是建议都大致浏览一下,其中的NAVI book和dapp-kit部分更是需要着重关注,仔细阅读一下。 + +其实,如果相关经验的话,例如将训练营task作为起点的程序员,想要完成本节任务是十分困难的。而在task之外,补充相关知识也是非常重要的。毕竟,学习才是主要的目的(在拥有足够赚取报酬的代码和知识水平之前),task只是一个引导我们学习的路径罢了。 + +在这里,我仍然将任务指南贴出来: + +- [sui sdk](https://sdk.mystenlabs.com/typescript) +- [ptb sdk](https://sdk.mystenlabs.com/typescript/transaction-building/basics) +- [ptb concepts](https://docs.sui.io/concepts/transactions/prog-txn-blocks) +- [navi-sdk](https://github.com/naviprotocol/navi-sdk) +- [navi-docs](https://naviprotocol.gitbook.io/navi-protocol-developer-docs/how-to-interact-with-the-contract/navi-sdk/api-interface) + +另外,尤其推荐观看uvd老师的相关视频教程,这里我贴出与本节最相关的一个教程: + +https://www.bilibili.com/video/BV1DmmyYvEnC/?spm_id_from=333.999.0.0&vd_source=e4ecd9395f6e61a139c766490968f125 + +### 概述 + +在最开始,对于如何进行一个dapp的开发,我们肯定是十分迷茫的。 + +幸运的是,我们相对而言不用这么迷茫,sui已经有了dapp开发的脚手架,我们不用像最开始的冒险家那样面对一片陌生的新大陆。 + +在上述uvd老师的视频里,介绍了dapp开发的脚手架:dapp-kit , 我在这里对如何下载进行一个简要的介绍: + +#### dapp-kit + +1. 准备工作 + + - 安装必要的工具 + 确保你有以下开发环境: + + Node.js (版本不宜过旧) + npm 或 yarn + + - 安装 dapp-kit + 在项目目录中运行以下命令: + npm i --save @mysten/dapp-kit @mysten/sui @tanstack/react-query + +2. 创建项目 + + 在终端运行: + + npm create @mysten/dapp + + 控制台会引导你创建一个新的 dApp 项目。 + + 创建新的 dApp 时,你有以下模板可供选择: + + - react-client-dapp:一个基本的 React dApp,用于获取连接的钱包拥有的对象列表。 + + - react-e2e-counter:一个端到端示例,其中包含 Move 代码和简单计数器应用程序的 UI。 + + 就本task而言,选择react-client-dapp即可。 + +3. 项目结构 + + 创建项目后,你将看到: + + ```bash + my-first-sui-dapp$ tree + . + ├── README.md + ├── index.html + ├── package.json + ├── prettier.config.cjs + ├── src + │ ├── App.tsx + │ ├── OwnedObjects.tsx + │ ├── WalletStatus.tsx + │ ├── main.tsx + │ ├── networkConfig.ts + │ └── vite-env.d.ts + ├── tsconfig.json + ├── tsconfig.node.json + └── vite.config.ts + + 1 directory, 13 files + ``` + + 这是为我们自动创建的模板,我们可以在它的基础上进行修改。 + +### PTB与NAVI + +那么在正式开始编码之前,我们先了解一下Programmable Transaction Block (PTB)和Sui上的NAVI Protocol。 + +#### PTB + +Programmable Transaction Block (PTB) 是 Sui 网络中的一种强大工具,允许开发者在单个交易中包含多个操作。PTB 通过将多个交易命令链接在一起,提供了一个灵活且高效的方式来生成交易。每个 PTB 可以执行多达 1024 个独特的操作,显著降低了 gas 费用并加快了执行速度。PTB 的设计保证了交易的原子性,如果其中一个命令失败,整个块将失败,且不会应用任何效果。 + +PTB 的主要特性 + +- 模块化设计: + + PTB 是由一组操作和指令组成的事务单元,每个操作可以执行独立的功能,如调用 Move 合约、转账资产等。 + 通过组合多个操作,开发者可以实现复杂的逻辑,同时保持事务的原子性。 + +- 原子性: + + PTB 中的所有操作要么全部成功执行,要么全部回滚。这种设计保证了状态的一致性,非常适合构建需要强一致性保证的应用。 + +- 灵活的组合性: + + PTB 可以包含多个输入(如代币、对象)和多个输出(如新生成的对象或资产)。 + 支持跨模块调用,实现合约之间的互操作。 + +- 高性能: + + PTB 的设计充分利用了 Sui 的并行执行引擎。通过对事务依赖的静态分析,PTB 能够最大化并行度,提升执行效率。 + +#### NAVI Protocol + +NAVI Protocol 是构建于 Sui 区块链之上的一站式去中心化流动性协议,为用户提供高效的资产借贷和流动性管理服务。NAVI 的设计目标是通过创新的去中心化金融(DeFi)基础设施,为用户提供无中介的资产操作,同时优化安全性和资本效率。 + +核心功能 + +- 借贷市场: + + 用户可以通过 NAVI 提供或借入多种数字资产,收益来源于利息。 + 提供流动性时,用户会获得“Navi 收据代币”(例如 nSUI),作为其在流动性池中的份额证明,这些代币可以用作抵押品​。 + +- 自动杠杆金库(Automatic Leverage Vaults): + + 用户可以在 NAVI 中使用低利率资产借贷进行杠杆操作,优化资产收益,比如参与质押奖励或流动性挖矿​。 + +- 隔离模式(Isolation Market): + + NAVI 支持在特定的隔离市场中列出新资产,设定债务上限(Debt Ceiling)以限制波动性资产的借贷风险。这种机制增强了平台的安全性​。 + +- 灵活的治理机制: + + 持有原生治理代币 NAVX 的用户可以参与投票,决定如利率设定、新资产支持和抵押率调整等关键事项​。 + +### 任务指南 + +那么如何完成要求的任务呢? + +我们可以分两个模块来完成: + +- 第一个模块用于构建PTB,我们将PTB进行的操作都在这个模块定义。 + +- 第二个模块用于调用执行PTB,在这个模块中,我们进行钱包连接和前端调用等操作。 + +而对于第一个模块,可以分为以下几个步骤: + +- 定义 PTB + + - Step 1: 存入 1 SUI 到 Navi Protocol + + - Step 2: 借出 USDC + + - Step 3: 再次存入等量的 USDC + + - Step 4: 提交 PTB ,签名并执行交易 + +任务要求我们进行日期计算,我们可以将计算放在PTB中,但为了模块化考虑,我们在另一个模块中完成它。 + +对于这个模块,我们作此建构: + +- 动态金额计算: + + 调用 calculateBorrowAmount 根据当前时间生成借贷金额,格式为 0.MMDDHH。 + +- 连接钱包: + + 使用 useWallets 获取支持的钱包列表。 + 用户选择钱包后,通过 connect 方法完成连接。 + 在连接成功后显示用户的钱包地址。 + +- 交易 UI: + + 展示用户需要完成的交易流程。 + 通过按钮点击触发 mainAction,完成 PTB 事务的签名与提交。 + +- PTB 提交: + + mainAction 是具体实现事务的核心逻辑,负责: + 组合事务(如存入 SUI、借出 USDC 等)。 + 调用 signAndExecuteTransaction 提交事务。 + +### 代码实现 + +因为之前我们使用dap-kit进行了初步的预构建, +这时我们只需要在其基础上进行修改即可。 + +#### PTB实现 + +我们新增一个文件,NAVI.ts: + +```typescript +import { Transaction } from '@mysten/sui/transactions'; +import { depositCoin, borrowCoin, } from 'navi-sdk/dist/libs/PTB' +import { Sui, wUSDC } from "navi-sdk/dist/address"; +import { Pool, PoolConfig } from "navi-sdk/dist/types"; +import { pool } from 'navi-sdk/dist/address' + + +export const mainAction = async (account: any, { signAndExecute, usdcAmount, onSuccess = () => { } }: { + signAndExecute: any; + usdcAmount: number; + onSuccess?: (result: any) => void; + onError?: (result: any) => void; +}) => { + + if (!account) { + postMessage("Please connect your wallet first"); + return; + } + + + const tx = new Transaction(); + + tx.setSender(account.address); + + // 获取池配置 + const SuiPool: PoolConfig = pool[Sui.symbol as keyof Pool]; + const wUSDCPool: PoolConfig = pool[wUSDC.symbol as keyof Pool]; + + if (!SuiPool || !wUSDCPool) { + throw new Error("Invalid pool configuration"); + } + + // 设置gas + tx.setGasBudget(1e9); + + try { + // 分离出1sui + const [sui] = tx.splitCoins(tx.gas, [1e9]); + + console.log("Checking object existence..."); + const suiObject = await tx.object(sui); + if (!suiObject) { + throw new Error(`Object ${sui} does not exist`); + } + + // 将其存入navi + await depositCoin(tx as any, SuiPool, sui, 1e9); + + // 借出 usdc + const [usdc_coin] = await borrowCoin(tx as any, wUSDCPool, usdcAmount); + + // 存入 usdc + await depositCoin(tx as any, wUSDCPool, usdc_coin, usdcAmount); + + // 签名执行交易 + await signAndExecute({ + transaction: tx, chain: "sui:mainnet" + }, { + onSuccess, + onError: (error: any) => { // 为 error 参数指定类型 + console.error("Transaction failed:", error); + postMessage(error.message || "Transaction failed"); + }, + }); + } catch (error) { + console.error("Transaction failed:", error); + postMessage(error instanceof Error ? error.message : "An unknown error occurred"); + } + +} + +``` + +简而言之,在这个 `NAVI.ts` 中,我们构建了一个PTB,并在其中 +编写了所有我们需要进行的交易,并最终签名并执行。 + +#### 前端实现 + +前端调用模块我们可以直接改造App.tsx: + +```typescript +import { useCurrentAccount, useSignAndExecuteTransaction } from "@mysten/dapp-kit"; +import { Container, Flex, Heading, Text, Button } from "@radix-ui/themes"; +import { ConnectButton, useConnectWallet, useWallets } from '@mysten/dapp-kit'; +import { wUSDC } from "navi-sdk/dist/address"; +import { mainAction } from "./NAVI.ts"; + +const calculateBorrowAmount = (month: number, day: number, hour: number): number => { + const borrowAmountStr = `0.${month.toString().padStart(2, "0")}${day.toString().padStart(2, "0")}${hour.toString().padStart(2, "0")}`; + return parseFloat(borrowAmountStr) * 10 ** wUSDC.decimal; +}; + +const Execute = () => { + + const wallets = useWallets(); + const { mutate: connect } = useConnectWallet(); + + const account = useCurrentAccount(); + const { mutate: signAndExecute } = useSignAndExecuteTransaction(); + + const date = new Date(); + const usdcAmount = calculateBorrowAmount(date.getMonth() + 1, date.getDate(), date.getHours()); + + return ( + + + + Wallet Status + +
+ +
    + {wallets.map((wallet) => ( +
  • + +
  • + ))} +
+
+ + {account ? ( + + Wallet connected + Address: {account.address} + + ) : ( + Wallet not connected + )} + + Transaction Action + {account ? ( + + 执行交易 + + 1. [存入Navi Protocol 1 SUI] + {`2.[借出当前日期的USDC ${usdcAmount} 的 USDC ]`} + 3.[然后在存入等额的USDC] + + + + ) : null} +
+ ); +} + +export default Execute; + +``` + +我们定义一个 `calculateBorrowAmount` 用于计算需要存入的金额,注意需要乘以wUSDC的精度 `10 ** wUSDC.decimal`。 + +由于需要使用chrome钱包进行交易,我们编写一个连接钱包的逻辑: + +```typescript +
+ +
    + {wallets.map((wallet) => ( +
  • + +
  • + ))} +
+
+``` + +这一部分的代码可以直接在官方文档中找到:https://sdk.mystenlabs.com/dapp-kit/wallet-hooks/useConnectWallet。 + +下面的Wallet Status代码可以直接从已经存在的WalletStatus.tsx中迁移过来。 + +最后就是打印一些log,并执行调用`mainAction`的逻辑。 + +至此,task6的编写便告完成。 + +### 调用 + +在相应路径下运行 `npm run`,然后来到前端页面进行调用即可。 + +如果你发现调用失败的话,或许你需要注意main.tsx中的 defaultNetwork 定义。 \ No newline at end of file diff --git a/mover/dravenlove/code/task01/hello_move/Move.lock b/mover/dravenlove/code/task01/hello_move/Move.lock new file mode 100644 index 000000000..bc644463d --- /dev/null +++ b/mover/dravenlove/code/task01/hello_move/Move.lock @@ -0,0 +1,34 @@ +# @generated by Move, please check-in and do not edit manually. + +[move] +version = 3 +manifest_digest = "8B7DC3EDF1D81F9E2D46D8251E70F4B8D7097878F02438454C30AEF9F05D81D0" +deps_digest = "F8BBB0CCB2491CA29A3DF03D6F92277A4F3574266507ACD77214D37ECA3F3082" +dependencies = [ + { id = "Sui", name = "Sui" }, +] + +[[move.package]] +id = "MoveStdlib" +source = { git = "https://github.com/MystenLabs/sui.git", rev = "framework/testnet", subdir = "crates\\sui-framework\\packages\\move-stdlib" } + +[[move.package]] +id = "Sui" +source = { git = "https://github.com/MystenLabs/sui.git", rev = "framework/testnet", subdir = "crates/sui-framework/packages/sui-framework" } + +dependencies = [ + { id = "MoveStdlib", name = "MoveStdlib" }, +] + +[move.toolchain-version] +compiler-version = "1.38.2" +edition = "2024.beta" +flavor = "sui" + +[env] + +[env.testnet] +chain-id = "4c78adac" +original-published-id = "0xa6b5ab1f160a1c6cf4f00a016f7b10089848c9c1da1469cc8cd8dc6401fff6e7" +latest-published-id = "0xa6b5ab1f160a1c6cf4f00a016f7b10089848c9c1da1469cc8cd8dc6401fff6e7" +published-version = "1" diff --git a/mover/dravenlove/code/task01/hello_move/Move.toml b/mover/dravenlove/code/task01/hello_move/Move.toml new file mode 100644 index 000000000..f99a76a8d --- /dev/null +++ b/mover/dravenlove/code/task01/hello_move/Move.toml @@ -0,0 +1,37 @@ +[package] +name = "hello_move" +edition = "2024.beta" # edition = "legacy" to use legacy (pre-2024) Move +# license = "" # e.g., "MIT", "GPL", "Apache 2.0" +# authors = ["..."] # e.g., ["Joe Smith (joesmith@noemail.com)", "John Snow (johnsnow@noemail.com)"] + +[dependencies] +Sui = { git = "https://github.com/MystenLabs/sui.git", subdir = "crates/sui-framework/packages/sui-framework", rev = "framework/testnet" } + +# For remote import, use the `{ git = "...", subdir = "...", rev = "..." }`. +# Revision can be a branch, a tag, and a commit hash. +# MyRemotePackage = { git = "https://some.remote/host.git", subdir = "remote/path", rev = "main" } + +# For local dependencies use `local = path`. Path is relative to the package root +# Local = { local = "../path/to" } + +# To resolve a version conflict and force a specific version for dependency +# override use `override = true` +# Override = { local = "../conflicting/version", override = true } + +[addresses] +hello_move = "0x0" + +# Named addresses will be accessible in Move as `@name`. They're also exported: +# for example, `std = "0x1"` is exported by the Standard Library. +# alice = "0xA11CE" + +[dev-dependencies] +# The dev-dependencies section allows overriding dependencies for `--test` and +# `--dev` modes. You can introduce test-only dependencies here. +# Local = { local = "../path/to/dev-build" } + +[dev-addresses] +# The dev-addresses section allows overwriting named addresses for the `--test` +# and `--dev` modes. +# alice = "0xB0B" + diff --git a/mover/dravenlove/code/task01/hello_move/sources/hello_move.move b/mover/dravenlove/code/task01/hello_move/sources/hello_move.move new file mode 100644 index 000000000..c7a79fff6 --- /dev/null +++ b/mover/dravenlove/code/task01/hello_move/sources/hello_move.move @@ -0,0 +1,19 @@ +module hello_move::hello { + use std::ascii::{String, string}; + use sui::object::{Self,UID}; + use sui::transfer::transfer; + use sui::tx_context::{TxContext, sender}; + + public struct Hello has key{ + id:UID, + say: String + } + + fun init(ctx: &mut TxContext) { + let hello_move = Hello { + id:object::new(ctx), + say: string(b"move"), + }; + transfer(hello_move, sender(ctx)); + } +} \ No newline at end of file diff --git a/mover/dravenlove/code/task01/hello_move/tests/hello_move_tests.move b/mover/dravenlove/code/task01/hello_move/tests/hello_move_tests.move new file mode 100644 index 000000000..7798d8dda --- /dev/null +++ b/mover/dravenlove/code/task01/hello_move/tests/hello_move_tests.move @@ -0,0 +1,18 @@ +/* +#[test_only] +module hello_move::hello_move_tests; +// uncomment this line to import the module +// use hello_move::hello_move; + +const ENotImplemented: u64 = 0; + +#[test] +fun test_hello_move() { + // pass +} + +#[test, expected_failure(abort_code = ::hello_move::hello_move_tests::ENotImplemented)] +fun test_hello_move_fail() { + abort ENotImplemented +} +*/ diff --git "a/mover/dravenlove/images/Scan\346\210\252\345\233\276.png" "b/mover/dravenlove/images/Scan\346\210\252\345\233\276.png" new file mode 100644 index 000000000..89ab18966 Binary files /dev/null and "b/mover/dravenlove/images/Scan\346\210\252\345\233\276.png" differ diff --git "a/mover/dravenlove/images/Sui\351\222\261\345\214\205\346\210\252\345\233\276.png" "b/mover/dravenlove/images/Sui\351\222\261\345\214\205\346\210\252\345\233\276.png" new file mode 100644 index 000000000..913abcf7b Binary files /dev/null and "b/mover/dravenlove/images/Sui\351\222\261\345\214\205\346\210\252\345\233\276.png" differ diff --git a/mover/dravenlove/notes/readme.md b/mover/dravenlove/notes/readme.md new file mode 100644 index 000000000..2de6226a2 --- /dev/null +++ b/mover/dravenlove/notes/readme.md @@ -0,0 +1,3 @@ +# 学习笔记 + +## task1 \ No newline at end of file diff --git a/mover/dravenlove/readme.md b/mover/dravenlove/readme.md new file mode 100644 index 000000000..60d73d5c4 --- /dev/null +++ b/mover/dravenlove/readme.md @@ -0,0 +1,57 @@ +- 基本信息 + + - Sui钱包地址: `0xa84f16f762bc28da3d250af2d111e6adf70fae64c4d0345a502cb5d5c95286f3` + + - github: `dravenlove` + + ## 个人简介 + - 工作经验: 3年 + - 技术栈: Erlang,Mysql,C++ + + + + - 区块链爱好者,想通过Move理解区块链 + - 联系方式: tg: 'Drdraven' + + ## 任务 + + ## 01 hello move + - [x] Sui cli version: sui 1.38.2-99fcadf4f738 + - [x] Sui钱包截图: Sui钱包截图 + - [x] package id: 0xa6b5ab1f160a1c6cf4f00a016f7b10089848c9c1da1469cc8cd8dc6401fff6e7 + - [x] package id 在 scan上的查看截图:Scan截图 + + ## 02 move coin + - [] My Coin package id : + - [] Faucet package id : + - [] 转账 `My Coin` hash: + - [] `Faucet Coin` address1 mint hash: + - [] `Faucet Coin` address2 mint hash: + + ## 03 move NFT + - [] nft package id : + - [] nft object id : + - [] 转账 nft hash: + - [] scan上的NFT截图:![Scan截图](./images/你的图片地址) + + ## 04 Move Game + - [] game package id : + - [] deposit Coin hash: + - [] withdraw `Coin` hash: + - [] play game hash: + + ## 05 Move Swap + - [] swap package id : + - [] call swap CoinA-> CoinB hash : + - [] call swap CoinB-> CoinA hash : + + ## 06 Dapp-kit SDK PTB + - [] save hash : + + ## 07 Move CTF Check In + - [] CLI call 截图 : ![截图](./images/你的图片地址) + - [] flag hash : + + ## 08 Move CTF Lets Move + - [] proof : + - [] flag hash : diff --git "a/mover/gracecampo/co-learn-2411/images/\347\233\264\346\222\255\347\255\224\347\226\221/\347\254\254\345\233\233\345\221\250\347\233\264\346\222\255\347\255\224\347\226\221.png" "b/mover/gracecampo/co-learn-2411/images/\347\233\264\346\222\255\347\255\224\347\226\221/\347\254\254\345\233\233\345\221\250\347\233\264\346\222\255\347\255\224\347\226\221.png" new file mode 100644 index 000000000..e7dc4da28 Binary files /dev/null and "b/mover/gracecampo/co-learn-2411/images/\347\233\264\346\222\255\347\255\224\347\226\221/\347\254\254\345\233\233\345\221\250\347\233\264\346\222\255\347\255\224\347\226\221.png" differ diff --git a/mover/gracecampo/co-learn-2411/readme.md b/mover/gracecampo/co-learn-2411/readme.md index 0e3dbd8d4..37c64bfdf 100644 --- a/mover/gracecampo/co-learn-2411/readme.md +++ b/mover/gracecampo/co-learn-2411/readme.md @@ -20,7 +20,7 @@ - [√] 第一周:![学习记录截图](images/直播答疑/第一周直播答疑.jpg):参与第一周直播答疑并积极互动 - [√] 第二周:![学习记录截图](images/直播答疑/第二周直播答疑.png):参与第二周直播答疑并积极互动 - [√] 第三周:![学习记录截图](images/直播答疑/第三周直播答疑.png):参与第三周直播答疑并积极互动 -- [] 第四周:![学习记录截图](images/直播答疑/第) +- [√] 第四周:![学习记录截图](images/直播答疑/第四周直播答疑.png):参与第三周直播答疑并积极互动 ## 群里分享学习笔记 @@ -37,6 +37,9 @@ - [√] 第十一篇笔记[move入门之泛型](https://learnblockchain.cn/article/10036) - [√] 第十二篇笔记[move入门之集合(一)](https://learnblockchain.cn/article/10090) - [√] 第十三篇笔记[move入门之集合(二)](https://learnblockchain.cn/article/10091) +- [√] 第十四篇笔记[move入门之集合(三)](https://learnblockchain.cn/article/10167) +- [√] 第十五篇笔记[如何使用dapp-kit构建应用](https://learnblockchain.cn/article/10163) +- [√] 第十六篇笔记[SUI中的PTB编程入门](https://learnblockchain.cn/article/10166) ## 对外输出学习笔记 - [√] 第一篇笔记[Git入门到精通](https://blog.csdn.net/jinpeng741143592/article/details/143261589?spm=1001.2014.3001.5502) @@ -55,9 +58,12 @@ - [√] 第十四篇笔记[move入门之泛型](https://learnblockchain.cn/article/10036) - [√] 第十五篇笔记[move入门之集合(一)](https://learnblockchain.cn/article/10090) - [√] 第十六篇笔记[move入门之集合(二)](https://learnblockchain.cn/article/10091) +- [√] 第十七篇笔记[move入门之集合(三)](https://learnblockchain.cn/article/10167) +- [√] 第十八篇笔记[如何使用dapp-kit构建应用](https://learnblockchain.cn/article/10163) +- [√] 第十九篇笔记[SUI中的PTB编程入门](https://learnblockchain.cn/article/10166) ## 在HOH社区公众号发布自己的技术文章 -- [] 第一篇笔记【公众号文章链接】 +- [] 第一篇笔记【https://mp.weixin.qq.com/s/sBanVURGcIEXKSO5ddx2fg】 - [] 第二篇笔记【公众号文章链接】 - [] 第三篇笔记【公众号文章链接】 - [] 第四篇笔记【公众号文章链接】 diff --git "a/mover/gracecampo/notes/\344\273\273\345\212\241\346\225\231\347\250\213/task3\346\225\231\347\250\213.md" "b/mover/gracecampo/notes/\344\273\273\345\212\241\346\225\231\347\250\213/task3\346\225\231\347\250\213.md" index eae30dfe6..796ecdd88 100644 --- "a/mover/gracecampo/notes/\344\273\273\345\212\241\346\225\231\347\250\213/task3\346\225\231\347\250\213.md" +++ "b/mover/gracecampo/notes/\344\273\273\345\212\241\346\225\231\347\250\213/task3\346\225\231\347\250\213.md" @@ -31,11 +31,24 @@ Sui 的 NFT 可以直接在链上存储和管理,提供了比传统区块链 store使得这个对象可以进行全局传输和传递。 -接下来,我们创建一个GRACECAMPO_NFT的结构体体,它拥有key和store能力,并且拥有4个属性,分别是: id 作为链上索引地址,name作为NFT结构体名称, +接下来,我们创建一个GRACECAMPO_NFT的结构体体,它拥有key和store能力 + +当我们需要在链上储存对象时,结构体应该具备key + store 能力,当我们赋予该结构体这两个能力时 + +此结构体对于move虚拟机来说,此对象将可以被发布在链上储存。 + +该结构体拥有4个属性,分别是: + +1. id 作为链上索引地址 + +2. name作为NFT结构体名称, + +3. description作为一个NFT描述 + +4. url是NFT对象的外部图像链接地址 -description作为一个NFT描述,url是NFT对象的外部图像链接地址。 > 定义NFT结构体 -```sui move +```move public struct GRACECAMPO_NFT has store, key { id: UID, name: string::String, @@ -46,24 +59,38 @@ description作为一个NFT描述,url是NFT对象的外部图像链接地址。 监听事件:通过监听事件,我们可以对链上事件进行分析,例如跟踪 NFT 的铸造次数或智能合约生成的交易金额。这对于分析和统计非常有用。 -例如向下的例子,当我们在铸造函数中添加这个事件的时候,我们在应用程序中就可以订阅这个事件,方便我们对铸造人数进行分析,也可用于在铸造完成后,对用户 +例如下面的例子,当我们在铸造函数中添加这个事件的时候,我们在应用程序中就可以订阅这个事件,方便我们对铸造人数进行分析,也可用于在铸造完成后,对用户 进行通知。当然这个任务我们将不会对这个事件进行采集和统计,只是作为一个代码规范进行引入。 >定义铸造监听事件 -```sui move +```move public struct GRACECAMPO_NFT_Minted has copy, drop { object_id: ID, creator: address, name: string::String, } ``` -接下来,我们将声明一个铸造函数,可以看到mint_to_sender函数中,我们传入了用户初始化NFT对象的信息,比如name、description、url以及上下文ctx信息,这个函数作为公开函数,可以使任何人调用,当我们调用这个函数时,我们将从上线问中获取调用者信息,将传入的参数信息用于进行NFT对象的初始化,同时我们在代码中注册上面的监听事件。 -当用户调用mint_to_sender,将为用户铸造一个GRACECAMPO_NFT的NFT,以及发送铸造事件,当订阅这个事件的应用,接收到事件,将通知用户(这一步我们将不做实践,感兴趣的朋友可以手动实践下) +接下来,我们将声明一个铸造函数,可以看到mint_to_sender函数中,我们传入了用户初始化NFT对象的信息,比如name、description、url以及上下文ctx信息, -transfer::public_transfer 是 Sui 网络中的一个函数,用于将对象的所有权从一个地址转移到另一个地址。这个函数允许对象在其定义模块之外进行转移, 但前提是对象具有 store 和 key 能力。 +这个函数作为公开函数,可以使任何人调用,当我们调用这个函数时,我们将从上线问中获取调用者信息, -```sui move +将传入的参数信息用于进行NFT对象的初始化,同时我们在代码中注册上面的监听事件。 + +当用户调用mint_to_sender,将为用户铸造一个GRACECAMPO_NFT的NFT,以及发送铸造事件 + +当订阅这个事件的应用,接收到事件,将通知用户(这一步我们将不做实践,感兴趣的朋友可以手动实践下) + +transfer::public_transfer 是 Sui 网络中的一个函数,用于将对象的所有权从一个地址转移到另一个地址。 + +这个函数允许对象在其定义模块之外进行转移, 但前提是对象具有 store 和 key 能力。 + +public_transfer 是我们对于NFT进行铸造以及转移时,用到的重要的官方库中的函数方法。 + +此方法接受的为交易对象,接受地址,并要求交易对象,必须拥有key + store 能力,这也是我们在前面定义NFT结构体时,要求NFT结构体必须拥有key + store + +的原因之一。 +```move public fun public_transfer(obj: T, recipient: address) ``` @@ -92,7 +119,23 @@ public entry fun mint_to_sender( transfer::public_transfer(nft, sender); } ``` -接下来,我们声明一个转移函数,用于用户对NFT的转移,此函数,我们可以看到,需要传入的参数依次为:nft(用户拥有的nft对象),address(接收人地址),此函数未用到上下文对象,此处我们以 _ 形式进行忽略。我们在此函数中调用transfer::public_transfer进行对象转移。 +**铸造函数** + +函数参数有 `name(nft的名称),description(nft的描述信息),url(nft的图像地址),ctx(上下文)` + +我们从上下文中获取调用者的地址信息:`let sender = tx_context::sender(ctx);` + +通过构造一个`GRACECAMPO_NFT`对象,并将参数依次赋值给对象元素 + +接下来,我们通过`transfer::public_transfer(nft, sender);` 将声明的对象发送给调用者地址。 + +当链上打包成功后,调用者就可以在地址中看到对应的NFT对象以及信息。 + +**转移函数** + +接下来,我们声明一个转移函数,用于用户对NFT的转移,此函数,我们可以看到,需要传入的参数依次为:nft(用户拥有的nft对象),address(接收人地址) + +此函数未用到上下文对象,此处我们以 _ 形式进行忽略。我们在此函数中调用transfer::public_transfer进行对象转移 >定义转移函数 ```sui move @@ -111,11 +154,14 @@ public entry fun mint_to_sender( 发布前,可以先在测试网进行调试,无问题后,将环境切换到主网环境(这一点需要注意,测试完成后,因任务要求,必须在主网部署) -```sui move +打开命令行工具,在命令行中输入 + +```move sui client publish ``` +在执行完发布后,我们将在控制台看到 部署的包信息,以及交易信息。 -发布之后,控制台将显示我们部署模块的PACKAGEID,记录下来。 +发布之后,控制台将显示我们部署模块的PACKAGEID,此数据记录下来,用于我们之后调用该包下的模块函数。 之后我们将频繁使用到(下文中的PACKAGEID,在运行时,请替换为发布后记录的PACKAGEID) @@ -123,7 +169,12 @@ sui client publish 调用铸造函数: 此命令,需要替换PACKAGEID,GRACECAMPO_NFT替换为你定义的NFT对象名,mint_to_sender替换为你的铸造函数名 -args 后跟你铸造的NFT名称 NFT描述 NFT图片地址,任务要求NFT图片地址必须是自己 github 的头像作为图片,故你需要替换为你的github 的头像URL +args +1. 铸造的NFT名称 +2. NFT描述 +3. NFT图片地址 + +**任务要求NFT图片地址必须是自己 github 的头像作为图片,故你需要替换为你的github 的头像URL** ```shell sui client call --package PACKAGEID --module GRACECAMPO_NFT --function mint_to_sender args NFT名称 NFT描述 NFT图片地址 @@ -131,6 +182,10 @@ sui client call --package PACKAGEID --module GRACECAMPO_NFT --function mint_to_s 调用成功后,需要记录NFT的OBJECTID,方便区块浏览器查看 +我们可以通过 `https://suiscan.xyz/testnet/object/NFT-OBJECTID` ,将NFT-OBJECTID替换为调用函数,在控制台输出的 `OBJECTID`, + +我们就可以看到我们铸造的NFT了 + ### 3. 转移NFT 调用转移函数: @@ -149,7 +204,7 @@ recipient-address 替换为0x7b8e0864967427679b4e129f79dc332a885c6087ec9e187b534 sui client call --package PACKAGEID --module GRACECAMPO_NFT --function transfer args NFT-OBJECTID recipient-address ``` -调用成功后,需要记录交易hash,方便区块浏览器查看 +调用成功后,需要记录`交易hash`,方便区块浏览器查看 合约中的铸造和转移函数声明为entry,如果不熟悉命令行调用也可支持在区块浏览器调用 diff --git "a/mover/gracecampo/notes/\345\267\245\345\205\267\344\275\277\347\224\250/SUI\344\270\255\347\232\204PTB\347\274\226\347\250\213\345\205\245\351\227\250.md" "b/mover/gracecampo/notes/\345\267\245\345\205\267\344\275\277\347\224\250/SUI\344\270\255\347\232\204PTB\347\274\226\347\250\213\345\205\245\351\227\250.md" new file mode 100644 index 000000000..ff669dcaa --- /dev/null +++ "b/mover/gracecampo/notes/\345\267\245\345\205\267\344\275\277\347\224\250/SUI\344\270\255\347\232\204PTB\347\274\226\347\250\213\345\205\245\351\227\250.md" @@ -0,0 +1,284 @@ +# SUI中的PTB编程入门 + +🧑‍💻作者:gracecampo +## 什么是PTB + +### PTB定义 +PTB(Building Programmable Transaction Blocks) 的中文直译是可编程的事物块,这种描述对于sui新人来说很具备迷惑性。 + +[官方释义] + +可编程交易块(PTB)是 Sui 区块链中的一种交易形式,允许在单个交易中执行多个命令。PTB 可以在不发布新的 Move 包的情况下调用多个 Move 函数、管理对象和管理代币。 +它们设计为轻量级且灵活,适用于自动化和交易构建器。 + +PTB 的特点包括: + +- 由多个按顺序链接的命令组成,但是*命令的执行时串行的*。 +- 交易是原子的,如果一个命令失败,整个块都会失败。 +- 可以在一次执行中执行多达 1024 个独特的操作,这比传统区块链上的单独交易更具成本效益。 + +有关 PTB 的更多详细信息,请参阅 [Programmable Transaction Blocks](https://docs.sui.io/concepts/transactions/prog-txn-blocks)。 + +### PTB如何提高交易的效率和降低费用? + +可编程交易块(PTB)通过以下方式提高交易效率和降低费用: + +1. **批量操作**:PTB 可以在单个交易中执行多达 1024 个操作,这意味着可以将多个交易合并为一个交易块。这种批量处理减少了单独执行每个交易所需的时间和资源。 + +2. **原子性**:所有命令在一个交易中执行,如果一个命令失败,整个交易块都会失败。这确保了交易的一致性和可靠性,避免了部分执行的情况。 + +3. **降低 gas 费用**:由于多个操作被合并为一个交易执行,PTB 的 gas 费用通常低于在传统区块链上单独执行每个交易的费用。这是因为合并交易减少了重复的操作和资源消耗。 + +4. **并行化**:PTB 支持并行执行多个独立的交易,这提高了网络的吞吐量和效率,进一步降低了交易费用。 + +[个人理解] +相比单命令执行,PTB可以为我们节省gas,但是也相对对于开发人员的水平提高了要求,要求开发人员需要有足够的知识储备,以及对代码逻辑的理解。 + +我们可以简单的理解为PTB是一种在SUI上的构建交易工具,它允许我们在一个事务内,执行多条命令,将之前我们操作区块链时,复杂的交易流程,组合为多条命令的 +命令集合,然后统一在一个交易区块内进行执行。 + +PTB内部命令是按照顺序执行的,就是说PTB的执行是串行的。 后一步的命令依赖于前一步命令的结果,故而说是保持了交易的一致性和可靠性。 + +但PTB是并行化的,这个好像又是和上面的冲突,实际PTB并行的意思是在sui网络中,可以并行执行多个PTB块,就是说PTB内部命令是串行的,但是网路支持并行的 +执行多个PTB块。 + +## 如何使用 + +我们使用PTB可以有两种方式: + +使用命令行构建一个PTB块 + +使用TypeScript SDK构建PTB块 + +### 命令行使用PTB + +我们可以先来查看命令行关于PTB的帮助信息 + +```text + +sui client ptb -h + +Build, preview, and execute programmable transaction blocks. Depending on your shell, you might have to use quotes around arrays or other passed values. Use --help to see examples for how to use the core functionality of this +command. + +Usage: sui client ptb [OPTIONS] + +Options: + --assign 定义一个变量,可以在之后的命令中引用 + --dry-run PTB模拟运行 + --dev-inspect 对PTB执行dev检查 + --gas-coin 要使用的汽油币的对象ID。如果没有指定,它将尝试使用它发现的第一个至少具有所需天然气预算余额的天然气币。 + --gas-budget 此PTB的可选气体预算(在MIST中)。如果没有提供天然气预算,该工具将首先进行模拟运行以估算天然气成本,然后执行交易。 + 请注意,由于额外的模拟运行调用,这会带来较小的性能成本。 + --make-move-vec <[VALUES]> 给定相同类型的n个值,它构造一个向量。对于非对象或空向量,必须指定类型标记。 + --merge-coins <[COIN OBJECTS]> 将N个硬币合并到提供的硬币中。 + --move-call 对函数进行移动调用。 + --split-coins <[AMOUNT]> 根据给定的金额数组将硬币分成N个硬币。 + --transfer-objects <[OBJECTS]> 将对象传输到指定地址。 + --publish 发布Move包:源码所在的文件夹路径作为输入。 + --upgrade 升级Move软件包:源码所在的文件夹路径作为输入。 + --preview 预览PTB事务列表,而不是执行它们。 + --serialize-unsigned-transaction 不执行事务,而是使用base64编码对未签名事务数据的bcs字节进行序列化。 + --serialize-signed-transaction 不执行事务,而是使用base64编码对已签名事务数据的bcs字节进行序列化。 + --summary 仅显示简短摘要(摘要、执行状态、气体成本)。当您需要所有事务数据和执行效果时,不要使用此标志。 + --warn-shadows 当多次声明同一变量名时,启用阴影警告。默认情况下为关闭。 + --json 以json格式返回命令输出。 + -h, --help 打印帮助(详见“--help”) +``` + +命令结果截图: + + +![ptb-help.png](https://img.learnblockchain.cn/attachments/2024/12/RnQjCZZC67542e98896fa.png) + +#### PTB示例: 将分割一个 gas coin 并将其转移到指定地址: + +```bash +sui client ptb \ +--assign to_address @0x49e8d1c3e6596eb7926b2d1b22cd03eb12962d4ea5b5df8572da3e6fcfe60af5 \ +--split-coins gas [1000,2000,3000] \ +--assign coins \ +--transfer-objects [coins.0,coins.1,coins.2] to_address \ +--gas-budget 5000000 \ +--summary +``` +### 解释: +- `--assign to_address @0x...`:指定接收地址。 +- `--split-coins gas [1000,2000,3000]`:将 gas coin 分割成三个不同的值。 +- `--assign coins`:将分割后的 coin 结果赋值给变量 `coins`。 +- `--transfer-objects to_address [coins.0, coins.1, coins.2]`:将分割后的 coins 转移到指定地址。 +- `--gas-budget 5000000`:设置 gas 预算。 +- `--summary`:仅显示执行摘要。 + +执行结果: +```text +[warn] Client/Server api version mismatch, client api version : 1.37.2, server api version : 1.38.3 +╭──────────────────────────────────────────────────────╮ +│ PTB Execution Summary │ +├──────────────────────────────────────────────────────┤ +│ Digest: 45AzyKXq3F8bfHmiD33iA5YdoPqVQuz2zftX6h6N7BRs │ +│ Status: success │ +│ Gas Cost Summary: │ +│ Storage Cost: 3952000 │ +│ Computation Cost: 1000000 │ +│ Storage Rebate: 978120 │ +│ Non-refundable Storage Fee: 9880 │ +╰──────────────────────────────────────────────────────╯ +``` + +这个示例展示了如何使用 Sui CLI 构建和执行一个简单的 PTB,此PTB执行了两个命令,--split-coins,--transfer-objects。 + +并使用--assign 声明了一个地址变量:`to_address` 和 `coins`变量,在使用--transfer-objects命令时,将coins和to_address变量作为入参。 + +#### PTB示例: 发布合约,并调用合约,然后铸造一个NFT,并将其转移到指定地址 + +>>发布合约 + +```shell +sui client ptb \ +--move-call sui::tx_context::sender \ +--assign sender \ +--publish "包路径" \ +--assign upgrade_cap \ +--transfer-objects [upgrade_cap] sender \ +--gas-budget \ +--summary +``` + +此PTB块,执行了发布合约的命令,并将upgrade_cap对象转移至调用者地址 +```text +╭──────────────────────────────────────────────────────╮ +│ PTB Execution Summary │ +├──────────────────────────────────────────────────────┤ +│ Digest: FPMBYZNReDpFLSSosTcoEZnWbsNZzDq6UeLnod6iFqMq │ +│ Status: success │ +│ Gas Cost Summary: │ +│ Storage Cost: 12084000 │ +│ Computation Cost: 1000000 │ +│ Storage Rebate: 978120 │ +│ Non-refundable Storage Fee: 9880 │ +╰──────────────────────────────────────────────────────╯ +``` +>> 调用合约 + +```shell +sui client ptb \ +--move-call :::: \ +--assign result \ +--transfer-objects [result] sender \ +--gas-budget 5000000 \ +--summary +``` +命令例子: +```shell +sui client ptb \ +--move-call 0xc90615c1cbbc245cb6696c4164878aa89441f7531ec9654e9a0e5b3b839477fd::gracecampo_nft::mint_to_sender "'ptbnft'" "'ptb-desc'" "'https://pics0.baidu.com/feed/c8ea15ce36d3d539ff5971f5df97085e352ab0bb.jpeg'" \ +--gas-budget 5000000 \ +--summary +``` +此命令调用了gracecampo_nft模块的mint_to_sender函数,并传入NFT名称,NFT描述,NFT的URL链接 + +其他的命令都可以使用这种方式调用,感兴趣的可以自行尝试。 + +### TypeScript SDK 使用PTB +#### 初始化一个node项目 + +创建并进入项目目录,初始化项目 +```shell + mkdir ptb-project && cd ptb-project && npm init -y +``` + +![ptb-typeScript.png](https://img.learnblockchain.cn/attachments/2024/12/pBizZlWH67542ec146a97.png) + +#### 引入依赖 +```shell +npm install @mysten/sui +``` +安装后查看package.json,此时已经引入了sui的sdk依赖。 + +![ptb-package.png](https://img.learnblockchain.cn/attachments/2024/12/pdub75x367542eaf73465.png) + +#### 编写PTB函数 +创建一个app.js代码 +```typescript +import { Transaction } from '@mysten/sui/transactions'; +import { getFullnodeUrl, SuiClient } from '@mysten/sui/client'; +import { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519'; +import { getFaucetHost, requestSuiFromFaucetV0 } from '@mysten/sui/faucet'; +// 创建一个账号 +const keypair = new Ed25519Keypair(); +const secretKey = keypair.getSecretKey(); +console.log('Secret Key:', secretKey); +const address = keypair.getPublicKey().toSuiAddress(); + +//获取水龙头代币 +await requestSuiFromFaucetV0({ + host: getFaucetHost('testnet'), + recipient: address, +}); + +//创建一个客户端 +const client = new SuiClient({ url: getFullnodeUrl('testnet') }); + +//获取地址余额 +let balance = await client.getCoins({ + owner: address, +}); +console.log(balance); +//创建交易 +const tx = new Transaction(); +//分割coin +const [coin] = tx.splitCoins(tx.gas, [100]); +// 执行函数 +tx.transferObjects([coin], address); +//调用铸造NFT +tx.moveCall({ + target: '0xc90615c1cbbc245cb6696c4164878aa89441f7531ec9654e9a0e5b3b839477fd::gracecampo_nft::mint_to_public', + arguments: [ + tx.pure.string('ptbnft1'), + tx.pure.string('ptb-desc'), + tx.pure.string('https://pics0.baidu.com/feed/c8ea15ce36d3d539ff5971f5df97085e352ab0bb.jpeg'), + tx.pure.address('0x5a684e30c7760309906a4ed7b25e2d0c4bbeff74a3995a8ccbfe49be084d16d0') + ] +}); +//设置gas费 +tx.setGasPrice(1000); +tx.setGasBudget(10000000); +//签名并发送事务到链上 +const result =await client.signAndExecuteTransaction({ signer: keypair, transaction: tx }); + +console.log(result); +``` + +该代码使用使用`new Ed25519Keypair()` 创建一个地址,并通过`requestSuiFromFaucetV0`获取水龙头代币,并调用`splitCoins`分割代币,在通过 +tx.moveCall调用合约铸造NFT。 + +此代码通过PTB编程,将三个命令进行组合,在一个事务块中执行。 + + +![ptb-tran.png](https://img.learnblockchain.cn/attachments/2024/12/3EjFpiJk67542ecf32cbb.png) + +## 总结 +Programmable Transaction Blocks (PTBs) 在 Sui 中提供了许多优点: + +1. **高效的批处理**:PTBs 允许在单个交易中调用多达 1024 个不同的 Move 函数。这种批处理能力显著提高了交易的效率和降低了 gas 费用。[了解更多](https://docs.sui.io/concepts/transactions/prog-txn-blocks) + +2. **原子性**:PTBs 确保所有命令的效果在交易结束时原子性地应用。如果其中一个命令失败,整个块将失败,不会应用任何效果。[了解更多](https://github.com/sui-foundation/sui-move-intro-course/blob/ea12e0a1141763a1c4666b19ffe56fcfd07662cb/unit-five/lessons/1_programmable_transaction_block.md) + +3. **灵活性和可组合性**:PTBs 允许开发者在不发布新的 Move 包的情况下管理对象和调用多个 Move 函数,为开发者提供了更大的灵活性。[了解更多](https://blog.sui.io/programmable-transaction-blocks-explained/) + +4. **降低费用**:通过将多个交易合并为一个 PTB,开发者可以显著降低交易费用,特别是在 DeFi 应用中,这种优势尤为明显。[了解更多](https://blog.sui.io/defi-programmable-transaction-blocks/) + +5. **简化代码**:PTBs 将组合从智能合约级别移到交易级别,简化了代码结构,提高了可读性。[了解更多](https://sui.io/move) + +这些特性使得 PTBs 成为在 Sui 上开发高效、复杂应用的强大工具。 + +通过学习PTB编程将在我们之后的编程活动中,提供便利性。 + +💧  [HOH水分子公众号](https://mp.weixin.qq.com/s/d0brr-ao6cZ5t8Z5OO1Mog) + +🌊  [HOH水分子X账号](https://x.com/0xHOH) + +📹  [课程B站账号](https://space.bilibili.com/3493269495352098) + +💻  Github仓库 https://github.com/move-cn/letsmove \ No newline at end of file diff --git "a/mover/gracecampo/notes/\345\267\245\345\205\267\344\275\277\347\224\250/image/create_dapp.png" "b/mover/gracecampo/notes/\345\267\245\345\205\267\344\275\277\347\224\250/image/create_dapp.png" new file mode 100644 index 000000000..dff2b5470 Binary files /dev/null and "b/mover/gracecampo/notes/\345\267\245\345\205\267\344\275\277\347\224\250/image/create_dapp.png" differ diff --git "a/mover/gracecampo/notes/\345\267\245\345\205\267\344\275\277\347\224\250/image/my_dapp.png" "b/mover/gracecampo/notes/\345\267\245\345\205\267\344\275\277\347\224\250/image/my_dapp.png" new file mode 100644 index 000000000..97a445727 Binary files /dev/null and "b/mover/gracecampo/notes/\345\267\245\345\205\267\344\275\277\347\224\250/image/my_dapp.png" differ diff --git "a/mover/gracecampo/notes/\345\267\245\345\205\267\344\275\277\347\224\250/image/ptb-help.png" "b/mover/gracecampo/notes/\345\267\245\345\205\267\344\275\277\347\224\250/image/ptb-help.png" new file mode 100644 index 000000000..d41b648a5 Binary files /dev/null and "b/mover/gracecampo/notes/\345\267\245\345\205\267\344\275\277\347\224\250/image/ptb-help.png" differ diff --git "a/mover/gracecampo/notes/\345\267\245\345\205\267\344\275\277\347\224\250/image/ptb-package.png" "b/mover/gracecampo/notes/\345\267\245\345\205\267\344\275\277\347\224\250/image/ptb-package.png" new file mode 100644 index 000000000..2c0db2a9a Binary files /dev/null and "b/mover/gracecampo/notes/\345\267\245\345\205\267\344\275\277\347\224\250/image/ptb-package.png" differ diff --git "a/mover/gracecampo/notes/\345\267\245\345\205\267\344\275\277\347\224\250/image/ptb-tran.png" "b/mover/gracecampo/notes/\345\267\245\345\205\267\344\275\277\347\224\250/image/ptb-tran.png" new file mode 100644 index 000000000..f77f0488e Binary files /dev/null and "b/mover/gracecampo/notes/\345\267\245\345\205\267\344\275\277\347\224\250/image/ptb-tran.png" differ diff --git "a/mover/gracecampo/notes/\345\267\245\345\205\267\344\275\277\347\224\250/image/ptb-typeScript.png" "b/mover/gracecampo/notes/\345\267\245\345\205\267\344\275\277\347\224\250/image/ptb-typeScript.png" new file mode 100644 index 000000000..11e9bb8b6 Binary files /dev/null and "b/mover/gracecampo/notes/\345\267\245\345\205\267\344\275\277\347\224\250/image/ptb-typeScript.png" differ diff --git "a/mover/gracecampo/notes/\345\267\245\345\205\267\344\275\277\347\224\250/image/start-dev.png" "b/mover/gracecampo/notes/\345\267\245\345\205\267\344\275\277\347\224\250/image/start-dev.png" new file mode 100644 index 000000000..241ff3cd5 Binary files /dev/null and "b/mover/gracecampo/notes/\345\267\245\345\205\267\344\275\277\347\224\250/image/start-dev.png" differ diff --git "a/mover/gracecampo/notes/\345\267\245\345\205\267\344\275\277\347\224\250/image/yarn-install.png" "b/mover/gracecampo/notes/\345\267\245\345\205\267\344\275\277\347\224\250/image/yarn-install.png" new file mode 100644 index 000000000..89bc2c21a Binary files /dev/null and "b/mover/gracecampo/notes/\345\267\245\345\205\267\344\275\277\347\224\250/image/yarn-install.png" differ diff --git "a/mover/gracecampo/notes/\345\267\245\345\205\267\344\275\277\347\224\250/\345\246\202\344\275\225\344\275\277\347\224\250dapp-kit\346\236\204\345\273\272\345\272\224\347\224\250.md" "b/mover/gracecampo/notes/\345\267\245\345\205\267\344\275\277\347\224\250/\345\246\202\344\275\225\344\275\277\347\224\250dapp-kit\346\236\204\345\273\272\345\272\224\347\224\250.md" index e67e6b24b..3c2207dec 100644 --- "a/mover/gracecampo/notes/\345\267\245\345\205\267\344\275\277\347\224\250/\345\246\202\344\275\225\344\275\277\347\224\250dapp-kit\346\236\204\345\273\272\345\272\224\347\224\250.md" +++ "b/mover/gracecampo/notes/\345\267\245\345\205\267\344\275\277\347\224\250/\345\246\202\344\275\225\344\275\277\347\224\250dapp-kit\346\236\204\345\273\272\345\272\224\347\224\250.md" @@ -1,3 +1,7 @@ +## 如何使用dapp-kit构建应用 + +🧑‍💻作者:gracecampo + `dApp Kit` 是一组 React 组件、hooks 和工具,旨在帮助您在 Sui 区块链上构建去中心化应用程序(dApps)。它简化了连接钱包、签署交易和从 RPC 节点获取数据等任务。 ### 主要功能: @@ -14,61 +18,284 @@ ### 安装: 要开始使用 dApp Kit,您需要安装必要的包: -使用npm安装 +- 可以使用两种方式安装: + +**使用npm安装** ```bash -npm install --save @mysten/dapp-kit @mysten/sui.js @tanstack/react-query +npm i --save @mysten/dapp-kit @mysten/sui @tanstack/react-query ``` -使用yarn安装 +****使用yarn安装**** ```bash yarn add @mysten/dapp-kit @mysten/sui @tanstack/react-query ``` +当然官方还提供了pnpm,bun 方式安装,此步只需要按照自己的需要来使用那种工具即可。 + + +### 如何初始化一个前端模板 +![img.png](https://img.learnblockchain.cn/attachments/2024/12/tMJaq8Q96752f1c0cbe65.png) +![image.png](https://img.learnblockchain.cn/attachments/2024/12/CS7uSPp06752f1d484ac4.png) +#### 安装依赖 +进入到初始化项目中: +```shell +yarn install +``` + + + +#### 启动项目 +启动项目命令 +![img_2.png](https://img.learnblockchain.cn/attachments/2024/12/0gcuiR4A6752f1edda6a0.png) -### 设置 Providers: -使用所需的 providers 包装您的应用,以使用 hooks 和组件: - -```javascript -import '@mysten/dapp-kit/dist/index.css'; -import { SuiClientProvider, WalletProvider } from '@mysten/dapp-kit'; -import { getFullnodeUrl } from '@mysten/sui.js/client'; -import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; - -const queryClient = new QueryClient(); -const networks = { - localnet: { url: getFullnodeUrl('localnet') }, - devnet: { url: getFullnodeUrl('devnet') }, - testnet: { url: getFullnodeUrl('testnet') }, - mainnet: { url: getFullnodeUrl('mainnet') }, -}; - -ReactDOM.createRoot(document.getElementById('root')!).render( - - - - - - - , -); +启动后页面 + +![img_3.png](https://img.learnblockchain.cn/attachments/2024/12/MtC0sayg6752f1fd32cdf.png) + +#### 网络设置文件 +```typescript +import { getFullnodeUrl } from "@mysten/sui/client"; +import { createNetworkConfig } from "@mysten/dapp-kit"; + +const { networkConfig, useNetworkVariable, useNetworkVariables } = + createNetworkConfig({ + devnet: { + url: getFullnodeUrl("devnet"), + }, + testnet: { + url: getFullnodeUrl("testnet"), + }, + mainnet: { + url: getFullnodeUrl("mainnet"), + }, + }); + +export { useNetworkVariable, useNetworkVariables, networkConfig }; + ``` +使用 `@mysten/dapp-kit` 和 `@mysten/sui/client` 来配置网络连接。 + +- **getFullnodeUrl**:从 `@mysten/sui/client` 导入的函数,用于获取指定网络(如 `devnet`、`testnet`、`mainnet`)的完整节点 URL。 + +- **createNetworkConfig**:从 `@mysten/dapp-kit` 导入的函数,用于创建网络配置。它接受一个对象,其中包含不同网络的配置。 + +- **networkConfig**:包含了不同网络的配置,使用 `createNetworkConfig` 创建。 + +- **useNetworkVariable 和 useNetworkVariables**:从 `createNetworkConfig` 返回的钩子,用于在应用中访问和使用网络配置变量。 + +这个配置允许在应用中轻松切换和使用不同的 Sui 网络 + +钱包状态组件 +```typescript jsx +import { useCurrentAccount } from "@mysten/dapp-kit"; +import { Container, Flex, Heading, Text } from "@radix-ui/themes"; +import { OwnedObjects } from "./OwnedObjects"; + +export function WalletStatus() { + const account = useCurrentAccount(); + + return ( + + Wallet Status + + {account ? ( + + Wallet connected + Address: {account.address} + + ) : ( + Wallet not connected + )} + + + ); +} + +``` +React 组件 `WalletStatus`,用于显示钱包的连接状态以及当前连接钱包所拥有的对象。 + +- **useCurrentAccount**:从 `@mysten/dapp-kit` 导入的钩子,用于获取当前连接的钱包账户信息。 + +- **条件渲染**: + - 如果 `account` 存在,显示“Wallet connected”和钱包地址。 + - 如果 `account` 不存在,显示“Wallet not connected”。 + +- **OwnedObjects**:调用 `OwnedObjects` 组件以显示当前连接钱包所拥有的对象。 + +- **UI 布局**:使用 `Container`、`Flex` 和 `Text` 组件来组织和显示数据。 + +地址查询组件 +```typescript jsx +import { useCurrentAccount, useSuiClientQuery } from "@mysten/dapp-kit"; +import { Flex, Heading, Text } from "@radix-ui/themes"; + +export function OwnedObjects() { + const account = useCurrentAccount(); + const { data, isPending, error } = useSuiClientQuery( + "getOwnedObjects", + { + owner: account?.address as string, + }, + { + enabled: !!account, + }, + ); -### 连接钱包: -添加 `ConnectButton` 以使用户能够连接他们的 Sui 钱包: + if (!account) { + return; + } -```javascript -import { ConnectButton } from '@mysten/dapp-kit'; + if (error) { + return Error: {error.message}; + } + + if (isPending || !data) { + return Loading...; + } + + return ( + + {data.data.length === 0 ? ( + No objects owned by the connected wallet + ) : ( + Objects owned by the connected wallet + )} + {data.data.map((object) => ( + + Object ID: {object.data?.objectId} + + ))} + + ); +} + +``` +React 组件 `OwnedObjects`,用于显示当前连接钱包所拥有的对象。 + +- **useCurrentAccount**:从 `@mysten/dapp-kit` 导入的钩子,用于获取当前连接的钱包账户信息。 + +- **useSuiClientQuery**:用于查询 Sui 区块链上的数据。在这里,它被用来获取当前账户拥有的对象。查询只有在 `account` 存在时才会启用。 + +- **条件渲染**: + - 如果没有连接账户,组件将不返回任何内容。 + - 如果查询出错,显示错误信息。 + - 如果查询正在进行或数据尚未加载,显示“Loading...”。 + - 如果数据加载完成,显示拥有的对象列表。如果没有对象,显示一条消息。 + +- **UI 布局**:使用 `Flex` 和 `Text` 组件来组织和显示数据。 + app组件: +```typescript jsx +import { ConnectButton } from "@mysten/dapp-kit"; +import { Box, Container, Flex, Heading } from "@radix-ui/themes"; +import { WalletStatus } from "./WalletStatus"; + +function App() { + return ( + <> + + + dApp Starter Template + + + + + + + + + + + + + ); +} + +export default App; + +``` +定义了一个 React 组件 App,使用了 @mysten/dapp-kit 和 @radix-ui/themes 库。以下是代码的关键部分: + +ConnectButton:从 @mysten/dapp-kit 导入的组件,用于连接用户的钱包。它会在用户点击后处理连接逻辑,并显示钱包地址。 + +WalletStatus:这个组件应该用于显示钱包的连接状态或详细信息。 + +UI 布局: + +使用 Flex、Box 和 Container 组件来组织布局。 +Flex 用于创建一个粘性头部,包含应用标题和连接按钮。 +Container 用于包裹 WalletStatus,并设置一些样式,比如背景颜色和最小高度。 + +入口页 +```typescript jsx +import { ConnectButton } from "@mysten/dapp-kit"; +import { Box, Container, Flex, Heading } from "@radix-ui/themes"; +import { WalletStatus } from "./WalletStatus"; function App() { return ( -
- -
Hello, world
-
+ <> + + + dApp Starter Template + + + + + + + + + + + + ); } + +export default App; + ``` +代码使用了 @mysten/dapp-kit 和 @radix-ui/themes 库来设置一个基本的 React 组件。它包含一个用于钱包连接的 ConnectButton 和一个显示钱包相关信息的 WalletStatus 组件。 + +ConnectButton:从 @mysten/dapp-kit 导入的组件,提供一个按钮供用户连接他们的钱包。它处理连接逻辑,并在连接后显示用户的钱包地址。 + +WalletStatus:预计用于显示已连接钱包的状态或详细信息的组件 +### 总结 +此章是作为使用dapp-kit的构建应用的入门教程,介绍了根据模板创建一个项目,启动并运行项目。 +也通过定义几个组件简单的实践,并介绍下如何使用dapp-kit框架中的几个组件。 + +[dApp Kit 文档](https://sdk.mystenlabs.com/dapp-kit)。 + +💧  [HOH水分子公众号](https://mp.weixin.qq.com/s/d0brr-ao6cZ5t8Z5OO1Mog) + +🌊  [HOH水分子X账号](https://x.com/0xHOH) + +📹  [课程B站账号](https://space.bilibili.com/3493269495352098) -有关更详细的信息和高级功能,您可以查看 [dApp Kit 文档](https://sdk.mystenlabs.com/dapp-kit)。 \ No newline at end of file +💻  Github仓库 https://github.com/move-cn/letsmove \ No newline at end of file diff --git "a/mover/gracecampo/notes/\350\257\255\346\263\225\346\225\231\347\250\213/image/from_keys_values.png" "b/mover/gracecampo/notes/\350\257\255\346\263\225\346\225\231\347\250\213/image/from_keys_values.png" new file mode 100644 index 000000000..8c74dd28e Binary files /dev/null and "b/mover/gracecampo/notes/\350\257\255\346\263\225\346\225\231\347\250\213/image/from_keys_values.png" differ diff --git "a/mover/gracecampo/notes/\350\257\255\346\263\225\346\225\231\347\250\213/image/into_keys_values.png" "b/mover/gracecampo/notes/\350\257\255\346\263\225\346\225\231\347\250\213/image/into_keys_values.png" new file mode 100644 index 000000000..269611880 Binary files /dev/null and "b/mover/gracecampo/notes/\350\257\255\346\263\225\346\225\231\347\250\213/image/into_keys_values.png" differ diff --git "a/mover/gracecampo/notes/\350\257\255\346\263\225\346\225\231\347\250\213/image/vec_map.png" "b/mover/gracecampo/notes/\350\257\255\346\263\225\346\225\231\347\250\213/image/vec_map.png" new file mode 100644 index 000000000..3a0949ab8 Binary files /dev/null and "b/mover/gracecampo/notes/\350\257\255\346\263\225\346\225\231\347\250\213/image/vec_map.png" differ diff --git "a/mover/gracecampo/notes/\350\257\255\346\263\225\346\225\231\347\250\213/move\345\205\245\351\227\250\344\271\213\351\233\206\345\220\210(\344\270\211).md" "b/mover/gracecampo/notes/\350\257\255\346\263\225\346\225\231\347\250\213/move\345\205\245\351\227\250\344\271\213\351\233\206\345\220\210(\344\270\211).md" index 77f4aaa24..3f5143acd 100644 --- "a/mover/gracecampo/notes/\350\257\255\346\263\225\346\225\231\347\250\213/move\345\205\245\351\227\250\344\271\213\351\233\206\345\220\210(\344\270\211).md" +++ "b/mover/gracecampo/notes/\350\257\255\346\263\225\346\225\231\347\250\213/move\345\205\245\351\227\250\344\271\213\351\233\206\345\220\210(\344\270\211).md" @@ -1,13 +1,285 @@ -# move入门之集合(二) : Vector数据衍生类型VecMap深度分析 +# move入门之集合(三) : Vector数据衍生类型VecMap深度分析 **🧑‍💻作者:gracecampo** ## 概述 + +之前的文章中,我们学习了vector,vecSet两种常用的集合数据结构,此章我们通过对前两种数据结构的回顾以及对比,探究下vecSet这种集合类型。 + ## VecMap是什么? + +所属模块及包: Module 0x2::vec_map + +**VecSet的特点:** + +由向量支持的map(即key-value)数据结构。 + +**在此数据中键(key)是唯一的,不允许重复。 + +数据是按照插入顺序排序,可根据key值获取相关value值。 + +时间复杂度与vecSet一致,均为O(N),vecSet不同是是vecMap是一种键值对的数据结构,而vecSet是值即是key,key也是值。 + ### 定义和语法 +#### 如何去声明一个vecSet: +```move + let vec_map = vec_map::empty<>(); +``` + +我们通过调用vec_map的empty函数,可以声明一个空的vec_map集合。 +```move +let vec_map = vec_map::empty(); +``` + +当然,我们可以显式指定该集合种key与value的类型。 + +#### + ## VecMap是如何实现的? +接下来,我们通过对源码层面的刨析,探究它是如何实现的。 +### 结构体的声明 +```move +public struct VecMap has copy, drop, store { + contents: vector>, +} + +/// An entry in the map +public struct Entry has copy, drop, store { + key: K, + value: V, +} +``` +我们可以看到,在源码中,声明了一个Entry结构体,它包含两个元素,分别的key,value,而key,value都定义为一个泛型对象K ,V + +而主要结构体(即定义vecMap)中实际是通过将Entry放入到Vector容器中,从而实现map类型的支持。 + +需要注意的点是: key必须是拥有copy能力的类型。 + ### 异常码定义 +可以看到,在VecMap中声明了6种常量,来标识不同的异常信息 +```move +///当插入map中已经存在key时异常码 +const EKeyAlreadyExists: u64 = 0; + +/// 用户在获取不存在key时异常码 +const EKeyDoesNotExist: u64 = 1; + +/// 销毁不为空的map时的异常码 +const EMapNotEmpty: u64 = 2; + +/// 当获取或者移除的数据下标超出map集合时的异常码 +const EIndexOutOfBounds: u64 = 3; + +/// 当尝试移除空集合末尾数据时的异常码 +const EMapEmpty: u64 = 4; + +/// 当尝试通过keys 和values组装maps时,传入的keys 和values不一致时的异常码 +const EUnequalLengths: u64 = 5; +``` ### 函数定义 + +创建一个空的map集合 +```move +public fun empty(): VecMap { + VecMap { contents: vector[] } +} +``` +向map中添加元素 : 参数为: 1.可变引用map,2. 添加元素的key 3.添加元素的value +当元素中已存在传入的key时,将提示异常码:`EKeyAlreadyExists` +**注意点: 传入的map必须为可变引用类型 key 必须时用户copy能力的类型** +```move +public fun insert(self: &mut VecMap, key: K, value: V) { + assert!(!self.contains(&key), EKeyAlreadyExists); + self.contents.push_back(Entry { key, value }) +} +``` +根据key移除相关元素 +通过调用get_idx函数,获取相关key的小标,通过下标将数据移除,并返回移除元素信息 +当传入key不存在时,将提示异常码:`EKeyDoesNotExist` +```move +/// Remove the entry `key` |-> `value` from self. Aborts if `key` is not bound in `self`. +public fun remove(self: &mut VecMap, key: &K): (K, V) { + let idx = self.get_idx(key); + let Entry { key, value } = self.contents.remove(idx); + (key, value) +} +``` + +根据key,判断map元素中,是否存在相同的key元素 +```move +/// Return true if `self` contains an entry for `key`, false otherwise +public fun contains(self: &VecMap, key: &K): bool { + get_idx_opt(self, key).is_some() +} +``` + +返回map的长度 参数:引用map +```move +public fun size(self: &VecMap): u64 { + self.contents.length() +} +``` + +析构map的key和value,并返回key集合和value集合 +```move +public fun into_keys_values(self: VecMap): (vector, vector) { + let VecMap { mut contents } = self; + contents.reverse(); + let mut i = 0; + let n = contents.length(); + let mut keys = vector[]; + let mut values = vector[]; + while (i < n) { + let Entry { key, value } = contents.pop_back(); + keys.push_back(key); + values.push_back(value); + i = i + 1; + }; + contents.destroy_empty(); + (keys, values) +} +``` +用于将两个vector向量合并为一个vecMap +```move +public fun from_keys_values(mut keys: vector, mut values: vector): VecMap { + assert!(keys.length() == values.length(), EUnequalLengths); + //通过反转keys和values元素顺序,保证在处理过程中,最终返回的元素顺序 + //是按照keys和values添加顺序组合 + keys.reverse(); + values.reverse(); + let mut map = empty(); + while (keys.length() != 0) map.insert(keys.pop_back(), values.pop_back()); + keys.destroy_empty(); + values.destroy_empty(); + map +} +``` +当然,Module 0x2::vec_map中,对于vecMap的操作函数还有很多,比如获取下标,判断map是否为空,销毁空的map等等, + +如果同学感兴趣,可以进行自行翻阅相关源码。本节只对日常使用频繁的函数做下说明。 + ## VecMap应该如何使用? +接下来,我们开始实战环节 + +声明一个空map,并添加元素进入 + +**insert函数** + +```move +//声明一个空的map对象 +let mut vec_map = vec_map::empty(); +//添加一个键值对 +vec_map.insert(string(b"key1"),string(b"value1")); +vec_map.insert(string(b"key2"),string(b"value2")); +debug::print(&vec_map); +``` +我们通过debug::print 打印出vec_map中的元素: + +![img.png](image/vec_map.png) + +可以看到,我们已经将键值对`key1,key2`添加进入。 +insert需要注意的是,不能存放相同key的数据,不然抛出错误信息。 + +```move +vec_map.insert(string(b"key1"),string(b"value1")); +vec_map.insert(string(b"key1"),string(b"value2")); +``` +比如,我们将`key2`改为`key1`,在进行测试时,测试将会失败。 + +>>Test result: FAILED. Total tests: 1; passed: 0; failed: 1 + +**remove函数** +```move +//声明一个空的map对象 +let mut vec_map = vec_map::empty(); +//添加一个键值对 +vec_map.insert(string(b"key1"),string(b"value1")); +//删除key=key1的数据 +vec_map.remove(&string(b"key1")); +debug::print(&vec_map); +``` +我们通过先添加一个`string(b"key1"),string(b"value1")`,然后通过`remove`函数进行移除元素`key1`。 +当我们运行测试时,vec_map容器内元素`key1`已经被移除: + +>> Running Move unit tests +>> [debug] 0x2::vec_map::VecMap<0x1::ascii::String, 0x1::ascii::String> { +>> contents: [] +>> } +>> [ PASS ] hello::hello::test_vec_map +>> Test result: OK. Total tests: 1; passed: 1; failed: 0 + +**contains函数** +```move +//声明一个空的map对象 +let mut vec_map = vec_map::empty(); +//添加一个键值对 +vec_map.insert(string(b"key1"),string(b"value1")); +//通过调用contains函数,并传入key值,判断map容器中是否包含元素key1 +let contains = vec_map.contains(&string(b"key1")); +debug::print(&contains); +``` + +>> Running Move unit tests +>> [debug] true +>> [ PASS ] hello::hello::test_vec_map +>> Test result: OK. Total tests: 1; passed: 1; failed: 0 + + +**size函数** +```move +//声明一个空的map对象 +let mut vec_map = vec_map::empty(); +//添加一个键值对 +vec_map.insert(string(b"key1"),string(b"value1")); +//通过调用map_size函数,返回map中元素个数 +let map_size = vec_map.size(); +debug::print(&map_size); +``` +通过调用map_size函数,返回map中元素个数 + +debug打印出的元素个数符合我们预期 `1` + +>>Running Move unit tests +>>[debug] 1 +>>[ PASS ] hello::hello::test_vec_map +>>Test result: OK. Total tests: 1; passed: 1; failed: 0 + +**from_keys_values函数** +```move +//声明两个向量,将vec_key元素作为key,vec_value元素作为value,将两向量合并为一个vec_maps +let mut vec_key = vector[string(b"key1"),string(b"key2")]; +let mut vec_value = vector[string(b"value1"),string(b"value2")]; +let s = vec_map::from_keys_values(vec_key,vec_value); +debug::print(&s); +``` +通过声明两个向量,将vec_key元素作为map的key,vec_value元素作为map的value,将两向量合并为一个vec_maps + +**需要注意的时:vec_key元素 和vec_value 必须长度一致,否则将抛出异常** + +![img.png](image/from_keys_values.png) + +**into_keys_values** +```move +//声明两个向量,将vec_key元素作为key,vec_value元素作为value,将两向量合并为一个vec_maps +let mut vec_key = vector[string(b"key1"),string(b"key2")]; +let mut vec_value = vector[string(b"value1"),string(b"value2")]; +let s = vec_map::from_keys_values(vec_key,vec_value); +//调用into_keys_values函数,将map的key和value拆分,并以元组形式返回 +let (keys, values) = s.into_keys_values(); +debug::print(&keys); +debug::print(&values); +``` +我们先通过`from_keys_values` 组装一个vec_map,然后通过`into_keys_values`将map中的key和value进行拆分,并通过元组的形式返回 +此方法用于当我们需要分开获取key 和value时比较有用 + +![img.png](image/into_keys_values.png) + ## 总结 +通过对vec_map的语法以及函数方法的学习,我们可以对map元素进行修改,也可以在需要组装一个map对象,一个析构一个map对象的函数,进行的讲解和实战, + +在日常的开发中,我们可能需要对一些向量对象进行处理,此时vec_map将是不二的数据类型,方便我们声明一些关系型的数据,不需要辛苦维护数据关系, + +通过将对象封装为一个vec_map对象,我们可以方便的进行数据操作。 + + 💧  [HOH水分子公众号](https://mp.weixin.qq.com/s/d0brr-ao6cZ5t8Z5OO1Mog) diff --git "a/mover/gracecampo/notes/\350\257\255\346\263\225\346\225\231\347\250\213/move\345\237\272\346\234\254\346\225\260\346\215\256\347\261\273\345\236\213(\344\272\214).md" "b/mover/gracecampo/notes/\350\257\255\346\263\225\346\225\231\347\250\213/move\345\237\272\346\234\254\346\225\260\346\215\256\347\261\273\345\236\213(\344\272\214).md" index 5d67753a9..611283bb9 100644 --- "a/mover/gracecampo/notes/\350\257\255\346\263\225\346\225\231\347\250\213/move\345\237\272\346\234\254\346\225\260\346\215\256\347\261\273\345\236\213(\344\272\214).md" +++ "b/mover/gracecampo/notes/\350\257\255\346\263\225\346\225\231\347\250\213/move\345\237\272\346\234\254\346\225\260\346\215\256\347\261\273\345\236\213(\344\272\214).md" @@ -1,45 +1,97 @@ # move的基本数据类型 + 🧑‍💻作者:gracecampo + ## 向量/引用/元组与单位类型 + ### 向量类型(vector) 向量(vector)是move中提供的唯一集合类型的数据,向量类型支持泛型vector,move也提供了一系列函数进行对向量类型的数据进行操作。 -T可以是整型,地址型,包类型,甚至是向量类型。 + +T是一个泛型类型,可以是整型,地址型,包类型,甚至是向量类型。 + 如果要在包中调用,需要导入std::vector ### 向量声明 -``` - // 泛型为布尔型的空集合 - let empty: vector = vector[]; +```move - // 泛型为u8类型的集合 - let v: vector = vector[10, 20, 30]; +// 泛型为布尔型的空集合 +let empty: vector = vector[]; - // 泛型为集合是u8的集合 - let vv: vector> = vector[ - vector[10, 20], - vector[30, 40] - ]; +// 泛型为u8类型的集合 +let v: vector = vector[10, 20, 30]; + +// 泛型为集合是u8的集合 +let vv: vector> = vector[ + vector[10, 20], + vector[30, 40] +]; ``` ### 向量操作函数 -push_back: 在向量末尾添加一个元素。 +push_back: 在向量末尾添加一个元素 +```move +public native fun push_back(v: &mut vector, e: Element); +``` pop_back: 移除向量的最后一个元素。 +```move +public native fun pop_back(v: &mut vector): Element; +``` length: 返回向量中元素的数量。 +```move +public native fun length(v: &vector): u64; +``` is_empty: 如果向量为空则返回 true。 +```move +public fun is_empty(v: &vector): bool +``` remove: 移除给定索引处的元素。 - +```move +public fun remove(v: &mut vector, mut i: u64): Element ``` +可以注意都以上代码,**当对向量做出改变时,传入的都必须为可变引用,当只是对向量进行查找是要求必须为不可变引用** + +接下来我们来编写一个测试类,用于加强方法的学习: +```move + #[test] + // Create an instance of the `IgnoreMe` struct and ignore it. + // Even though we constructed the instance, we don't need to unpack it. + fun test_vec() { + //声明一个具有三个元素的向量 let mut v = vector[10, 20, 30]; + //通过push_back方法,添加值为5的元素 vector::push_back(&mut v, 5); + //通过push_back方法,添加值为6的元素 vector::push_back(&mut v, 6); - vector::pop_back(&mut v); - vector::length(&mut v); - vector::is_empty(&mut v); - vector::removetest(&mut v, 1); + //通过pop_back方法,取出末尾数据 + let last_value = vector::pop_back(&mut v); + debug::print(&last_value); + //获取向量长度 + let vec_length = vector::length(&mut v); + debug::print(&vec_length); + //判断向量是否为空 + let is_empty = vector::is_empty(&mut v); + debug::print(&is_empty); + //根据下标移除向量并返回移除向量的值 + let remove_value = v.remove(1); + debug::print(&remove_value); + } ``` +运行测试用例后的输出: + +![img.png](image/vec_test.png) + + +vector模块,还有很多基础方法,比如 insert, swap_remove 等,此节只为基础入门,就不做过多讲解。 ### 向量复制及销毁 +因为向量中元素是泛型的,可以接受任何类型 + +但是如果我们需要对向量进行复制时,要求向量元素是拥有copy的能力,当我们复制了一个向量时,必须要进行处理,否则编译会失败。 + +因为从一开始,我们就强调过,move是一种面向对象,面向资源的编程。 + +如果我们需要对元素进行复制时,如果向量被复制的,复制后的资源必须进行处理 ``` /*当且仅当T具有copy能力时,vector才具有copy能力*/ @@ -47,28 +99,29 @@ let x = vector[10]; let y = x; // 隐式复制 let z = x; (y, z) - - -/*如果不具备drop能力的泛型需要显式销毁*/ -let v = vector[]; -v.destroy_empty(); ``` + ## 引用类型 -move中声明引用类型方式有两种:&e(不可变) 和 &mut e(可变) 。 +接下来,我们进入对于引用类型的使用,在开发过程中,我们希望去使用一些已经存在的数据。 -区别: +对于面向资源编程的语言来说,我们需要区分,在某个方法函数中,我们是对数据做修改还是只读。 -不可变引用为只读,不能修改值 +所以引出了,可变引用与不可变引用。 -可变引用可以进行修改值。**通常用于将值传递,但是保留对象的所有权** +move中声明引用类型方式有两种:`&e(不可变)` 和 `&mut e(可变)` 。 -接下来我们定义两个函数来说明: +我们通常在数据前加 & 符号,用以给虚拟机标识,这个数据时怎样的引用类型。 +当我们需要对数据进行修改时,声明一个数据为 `&mut`,当我们只需要读取数据,而不对数据做变更时,只需要添加 `&` 符号即可 +区别: + +1. 不可变引用为只读,不能修改值 + +2. 可变引用可以进行修改值,**通常用于将值传递,但是保留对象的所有权** -```sui move -module movetest::test { - use std::string; +接下来我们定义两个函数来说明: +```move /*定义一商品库存结构体,我们规定商品名称不可修改,库存数量可以修改*/ public struct Shop{ shopName:string::String, @@ -83,10 +136,13 @@ module movetest::test { public fun editNum(shop: &mut Shop){ shop.num = shop.num - 1; } -} + ``` + 总结来说,& 用于只读访问,而 &mut 用于读写访问。 +可以直观的看到,当我们需要对引用数据,进行修改操作时,需要声明引用数据为可变的 + ## 元组与单位类型 元组释义: 拥有0或者多个元素的数组,可用于变量定义以及函数返回值 定义元组:元组通过在括号内使用逗号分隔的表达式列表创建。 @@ -98,20 +154,58 @@ module movetest::test { () 空元组 (e1, ..., en) 包含N个元素的元组 +如何理解: +元组,我们可以理解为拥有多个元素的数组,多用于函数方法的返回值中,比如函数需要返回多个元素时,我们就可以将其包装为一个元组类型, + +调用者可以根据我们的返回值,对返回值进行解构,进行自主获取需要的结果。 变量应用 -```sui move +```move + //声明两个元素的元组,并返回,以下类似 let (x0, x1) = (0, 1); let (y0, y1, y2) = (0, 1, 2); let (z0, z1, z2, z3) = (0, 1, 2, 3); ``` 函数应用 -```sui move - - fun returns_unit() {} +```move + //返回一个拥有两个bool元素的元组 fun returns_2_values(): (bool, bool) { (true, false) } + //返回一个拥有4个元素的元组: 元组中元素可以是数值类型,也可以是向量类型 fun returns_4_values(x: &u64): (&u64, u8, u128, vector) { (x, 0, 1, b"foobar") } ``` +接下来,我们可以参考以下源码,看一下,官方是如何使用的 +```move +public fun index_of(v: &vector, e: &Element): (bool, u64) { + let mut i = 0; + let len = v.length(); + while (i < len) { + if (&v[i] == e) return (true, i); + i = i + 1; + }; + (false, 0) +} +``` +以vector模块中的(index_of)为例,我们可以看到, + +通过对输入向量以及元素的判断 + +当向量中存在e元素时,返回元素是否存在以及元素在向量中的下标为 (true, i) + +当向量中不存在e元素时,返回元素是否存在以及元素在向量中的下标为 (false, 0) + +这是我们通过返回的元组结果,进行业务逻辑判断。 + +总结: + +我们通过向量/引用/元组 的基本类型进行学习,进一步增加对move中的各个基本类型的理解以及使用 + +此节是基础入门,是学习复杂数据结构的基础,复杂的数据类型,都是以此为基础发展而来的 + +因为在接下来的文章中,我们将对复杂的数据类型进行详细的讲解,并进行相关函数的学习 + +希望大家通过此节,可以学有所获。 + + 💧  [HOH水分子公众号](https://mp.weixin.qq.com/s/d0brr-ao6cZ5t8Z5OO1Mog) 🌊  [HOH水分子X账号](https://x.com/0xHOH) diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index d124eada3..000000000 --- a/package-lock.json +++ /dev/null @@ -1,3932 +0,0 @@ -{ - "name": "letsmove", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "dependencies": { - "@mysten/create-dapp": "^0.3.40", - "@mysten/dapp-kit": "^0.14.39", - "@mysten/sui": "^1.16.0", - "@tanstack/react-query": "^5.62.0", - "dotenv": "^16.4.5", - "navi-sdk": "^1.4.3" - } - }, - "node_modules/@0no-co/graphql.web": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@0no-co/graphql.web/-/graphql.web-1.0.11.tgz", - "integrity": "sha512-xuSJ9WXwTmtngWkbdEoopMo6F8NLtjy84UNAMsAr5C3/2SgAL/dEU10TMqTIsipqPQ8HA/7WzeqQ9DEQxSvPPA==", - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" - }, - "peerDependenciesMeta": { - "graphql": { - "optional": true - } - } - }, - "node_modules/@0no-co/graphqlsp": { - "version": "1.12.16", - "resolved": "https://registry.npmjs.org/@0no-co/graphqlsp/-/graphqlsp-1.12.16.tgz", - "integrity": "sha512-B5pyYVH93Etv7xjT6IfB7QtMBdaaC07yjbhN6v8H7KgFStMkPvi+oWYBTibMFRMY89qwc9H8YixXg8SXDVgYWw==", - "dependencies": { - "@gql.tada/internal": "^1.0.0", - "graphql": "^15.5.0 || ^16.0.0 || ^17.0.0" - }, - "peerDependencies": { - "graphql": "^15.5.0 || ^16.0.0 || ^17.0.0", - "typescript": "^5.0.0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz", - "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@digitak/grubber": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@digitak/grubber/-/grubber-3.1.4.tgz", - "integrity": "sha512-pqsnp2BUYlDoTXWG34HWgEJse/Eo1okRgNex8IG84wHrJp8h3SakeR5WhB4VxSA2+/D+frNYJ0ch3yXzsfNDoA==" - }, - "node_modules/@emotion/hash": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz", - "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==" - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", - "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", - "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", - "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", - "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", - "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", - "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", - "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", - "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", - "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", - "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", - "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", - "cpu": [ - "loong64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", - "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", - "cpu": [ - "mips64el" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", - "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", - "cpu": [ - "ppc64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", - "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", - "cpu": [ - "riscv64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", - "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", - "cpu": [ - "s390x" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", - "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", - "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", - "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", - "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", - "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", - "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", - "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@floating-ui/core": { - "version": "1.6.8", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.8.tgz", - "integrity": "sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==", - "dependencies": { - "@floating-ui/utils": "^0.2.8" - } - }, - "node_modules/@floating-ui/dom": { - "version": "1.6.12", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.12.tgz", - "integrity": "sha512-NP83c0HjokcGVEMeoStg317VD9W7eDlGK7457dMBANbKA6GJZdc7rjujdgqzTaz93jkGgc5P/jeWbaCHnMNc+w==", - "dependencies": { - "@floating-ui/core": "^1.6.0", - "@floating-ui/utils": "^0.2.8" - } - }, - "node_modules/@floating-ui/react-dom": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.2.tgz", - "integrity": "sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==", - "dependencies": { - "@floating-ui/dom": "^1.0.0" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "node_modules/@floating-ui/utils": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.8.tgz", - "integrity": "sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==" - }, - "node_modules/@gql.tada/cli-utils": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@gql.tada/cli-utils/-/cli-utils-1.6.3.tgz", - "integrity": "sha512-jFFSY8OxYeBxdKi58UzeMXG1tdm4FVjXa8WHIi66Gzu9JWtCE6mqom3a8xkmSw+mVaybFW5EN2WXf1WztJVNyQ==", - "dependencies": { - "@0no-co/graphqlsp": "^1.12.13", - "@gql.tada/internal": "1.0.8", - "graphql": "^15.5.0 || ^16.0.0 || ^17.0.0" - }, - "peerDependencies": { - "@0no-co/graphqlsp": "^1.12.13", - "@gql.tada/svelte-support": "1.0.1", - "@gql.tada/vue-support": "1.0.1", - "graphql": "^15.5.0 || ^16.0.0 || ^17.0.0", - "typescript": "^5.0.0" - }, - "peerDependenciesMeta": { - "@gql.tada/svelte-support": { - "optional": true - }, - "@gql.tada/vue-support": { - "optional": true - } - } - }, - "node_modules/@gql.tada/internal": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@gql.tada/internal/-/internal-1.0.8.tgz", - "integrity": "sha512-XYdxJhtHC5WtZfdDqtKjcQ4d7R1s0d1rnlSs3OcBEUbYiPoJJfZU7tWsVXuv047Z6msvmr4ompJ7eLSK5Km57g==", - "dependencies": { - "@0no-co/graphql.web": "^1.0.5" - }, - "peerDependencies": { - "graphql": "^15.5.0 || ^16.0.0 || ^17.0.0", - "typescript": "^5.0.0" - } - }, - "node_modules/@graphql-typed-document-node/core": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.2.0.tgz", - "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" - } - }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" - }, - "node_modules/@mysten/bcs": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@mysten/bcs/-/bcs-1.1.1.tgz", - "integrity": "sha512-8X3IwmVfkwgHnNHR4izpi7f7aD0iVDU2B8p2KoIzCA9sCGcl9O2RnFDezHbNGgT+yBT+dKVDpTAczhnwZ6eUkQ==", - "dependencies": { - "bs58": "^6.0.0" - } - }, - "node_modules/@mysten/create-dapp": { - "version": "0.3.40", - "resolved": "https://registry.npmjs.org/@mysten/create-dapp/-/create-dapp-0.3.40.tgz", - "integrity": "sha512-a7hC3TuBeKrqco/MrfqWlm6KzqPLJeavp23AaFOx9S/FF1EgcIONq92ttsBeGvhWa6mMx13d9Fk1fwn6y5dW7A==", - "license": "Apache-2.0", - "dependencies": { - "@mysten/dapp-kit": "0.14.39", - "@mysten/sui": "1.15.1", - "@types/node": "^20.14.10", - "enquirer": "^2.4.1" - }, - "bin": { - "create-dapp": "bin/index.js" - } - }, - "node_modules/@mysten/create-dapp/node_modules/@mysten/sui": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/@mysten/sui/-/sui-1.15.1.tgz", - "integrity": "sha512-q8m+xtuh//rHEwEmk6pr7Dguw6/2ySNye2Oy1w6ivbkeRFgqoEE64+fYuMK+lX/SEPhOTEZtN7fp/Trno0KMnw==", - "license": "Apache-2.0", - "dependencies": { - "@graphql-typed-document-node/core": "^3.2.0", - "@mysten/bcs": "1.1.1", - "@noble/curves": "^1.4.2", - "@noble/hashes": "^1.4.0", - "@scure/bip32": "^1.4.0", - "@scure/bip39": "^1.3.0", - "@suchipi/femver": "^1.0.0", - "bech32": "^2.0.0", - "gql.tada": "^1.8.2", - "graphql": "^16.9.0", - "tweetnacl": "^1.0.3", - "valibot": "^0.36.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@mysten/create-dapp/node_modules/@types/node": { - "version": "20.17.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.9.tgz", - "integrity": "sha512-0JOXkRyLanfGPE2QRCwgxhzlBAvaRdCNMcvbd7jFfpmD4eEXll7LRwy5ymJmyeZqk7Nh7eD2LeUyQ68BbndmXw==", - "license": "MIT", - "dependencies": { - "undici-types": "~6.19.2" - } - }, - "node_modules/@mysten/create-dapp/node_modules/undici-types": { - "version": "6.19.8", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", - "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", - "license": "MIT" - }, - "node_modules/@mysten/dapp-kit": { - "version": "0.14.39", - "resolved": "https://registry.npmjs.org/@mysten/dapp-kit/-/dapp-kit-0.14.39.tgz", - "integrity": "sha512-GcY68M6P+jvjALqy7U9onrCA25ETNlSlRpfsg5AnPpR0PBymnuVP9yYQMYk1aijFchYWNM4kALlazeLQiV2ldQ==", - "license": "Apache-2.0", - "dependencies": { - "@mysten/sui": "1.15.1", - "@mysten/wallet-standard": "0.13.15", - "@mysten/zksend": "0.12.5", - "@radix-ui/react-dialog": "^1.1.1", - "@radix-ui/react-dropdown-menu": "^2.1.1", - "@radix-ui/react-slot": "^1.1.0", - "@vanilla-extract/css": "^1.15.3", - "@vanilla-extract/dynamic": "^2.1.1", - "@vanilla-extract/recipes": "^0.5.3", - "clsx": "^2.1.1", - "zustand": "^4.5.4" - }, - "peerDependencies": { - "@tanstack/react-query": "^5.0.0", - "react": "*" - } - }, - "node_modules/@mysten/dapp-kit/node_modules/@mysten/sui": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/@mysten/sui/-/sui-1.15.1.tgz", - "integrity": "sha512-q8m+xtuh//rHEwEmk6pr7Dguw6/2ySNye2Oy1w6ivbkeRFgqoEE64+fYuMK+lX/SEPhOTEZtN7fp/Trno0KMnw==", - "license": "Apache-2.0", - "dependencies": { - "@graphql-typed-document-node/core": "^3.2.0", - "@mysten/bcs": "1.1.1", - "@noble/curves": "^1.4.2", - "@noble/hashes": "^1.4.0", - "@scure/bip32": "^1.4.0", - "@scure/bip39": "^1.3.0", - "@suchipi/femver": "^1.0.0", - "bech32": "^2.0.0", - "gql.tada": "^1.8.2", - "graphql": "^16.9.0", - "tweetnacl": "^1.0.3", - "valibot": "^0.36.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@mysten/sui": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/@mysten/sui/-/sui-1.16.0.tgz", - "integrity": "sha512-KI4richLtbq4RYbv5SmhWMIFD5BRW0tNOSGxZMLxjDBqBwkTqkQ4WBvmxjpbG/2WsLw0SCNrc7JYmoiaB58aLA==", - "license": "Apache-2.0", - "dependencies": { - "@graphql-typed-document-node/core": "^3.2.0", - "@mysten/bcs": "1.1.1", - "@noble/curves": "^1.4.2", - "@noble/hashes": "^1.4.0", - "@scure/bip32": "^1.4.0", - "@scure/bip39": "^1.3.0", - "@suchipi/femver": "^1.0.0", - "bech32": "^2.0.0", - "gql.tada": "^1.8.2", - "graphql": "^16.9.0", - "jose": "^5.6.3", - "poseidon-lite": "^0.2.0", - "tweetnacl": "^1.0.3", - "valibot": "^0.36.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@mysten/sui.js": { - "version": "0.54.1", - "resolved": "https://registry.npmjs.org/@mysten/sui.js/-/sui.js-0.54.1.tgz", - "integrity": "sha512-TSmGIX7U9O/uS9EKIQdv7/S69KTbBhMJVelXCafJE6IJw8iB9cN9uLu0+uklkBSDrbRmLSEY70jMr3uRFjReIg==", - "deprecated": "This package has been renamed to @mysten/sui, please update to use the renamed package.", - "dependencies": { - "@graphql-typed-document-node/core": "^3.2.0", - "@mysten/bcs": "0.11.1", - "@noble/curves": "^1.1.0", - "@noble/hashes": "^1.3.1", - "@scure/bip32": "^1.3.1", - "@scure/bip39": "^1.2.1", - "@suchipi/femver": "^1.0.0", - "bech32": "^2.0.0", - "gql.tada": "^1.7.0", - "graphql": "^16.8.1", - "superstruct": "^1.0.3", - "tweetnacl": "^1.0.3" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/@mysten/sui.js/node_modules/@mysten/bcs": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/@mysten/bcs/-/bcs-0.11.1.tgz", - "integrity": "sha512-xP85isNSYUCHd3O/g+TmZYmg4wK6cU8q/n/MebkIGP4CYVJZz2wU/G24xIZ3wI+0iTop4dfgA5kYrg/DQKCUzA==", - "dependencies": { - "bs58": "^5.0.0" - } - }, - "node_modules/@mysten/sui.js/node_modules/base-x": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-4.0.0.tgz", - "integrity": "sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw==" - }, - "node_modules/@mysten/sui.js/node_modules/bs58": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-5.0.0.tgz", - "integrity": "sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==", - "dependencies": { - "base-x": "^4.0.0" - } - }, - "node_modules/@mysten/wallet-standard": { - "version": "0.13.15", - "resolved": "https://registry.npmjs.org/@mysten/wallet-standard/-/wallet-standard-0.13.15.tgz", - "integrity": "sha512-kTgwT6a5WolSnaz9r6/B5bvruuWUO8fmnHB9lgITkIraildVpK7NQIYHik2kd4OaAl118tmch0NPW/qoJFT35g==", - "dependencies": { - "@mysten/sui": "1.15.1", - "@wallet-standard/core": "1.0.3" - } - }, - "node_modules/@mysten/wallet-standard/node_modules/@mysten/sui": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/@mysten/sui/-/sui-1.15.1.tgz", - "integrity": "sha512-q8m+xtuh//rHEwEmk6pr7Dguw6/2ySNye2Oy1w6ivbkeRFgqoEE64+fYuMK+lX/SEPhOTEZtN7fp/Trno0KMnw==", - "license": "Apache-2.0", - "dependencies": { - "@graphql-typed-document-node/core": "^3.2.0", - "@mysten/bcs": "1.1.1", - "@noble/curves": "^1.4.2", - "@noble/hashes": "^1.4.0", - "@scure/bip32": "^1.4.0", - "@scure/bip39": "^1.3.0", - "@suchipi/femver": "^1.0.0", - "bech32": "^2.0.0", - "gql.tada": "^1.8.2", - "graphql": "^16.9.0", - "tweetnacl": "^1.0.3", - "valibot": "^0.36.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@mysten/zksend": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/@mysten/zksend/-/zksend-0.12.5.tgz", - "integrity": "sha512-Ghl8CDGDg7fKEIifcRczJUSX/IJzpDHmozp6sTXFVwIiLZTRan9A/uJnDj6oeyBkoEvUxNd17wgm3UO66in/dw==", - "dependencies": { - "@mysten/sui": "1.15.1", - "@mysten/wallet-standard": "0.13.15", - "mitt": "^3.0.1", - "nanostores": "^0.10.3", - "valibot": "^0.36.0" - } - }, - "node_modules/@mysten/zksend/node_modules/@mysten/sui": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/@mysten/sui/-/sui-1.15.1.tgz", - "integrity": "sha512-q8m+xtuh//rHEwEmk6pr7Dguw6/2ySNye2Oy1w6ivbkeRFgqoEE64+fYuMK+lX/SEPhOTEZtN7fp/Trno0KMnw==", - "license": "Apache-2.0", - "dependencies": { - "@graphql-typed-document-node/core": "^3.2.0", - "@mysten/bcs": "1.1.1", - "@noble/curves": "^1.4.2", - "@noble/hashes": "^1.4.0", - "@scure/bip32": "^1.4.0", - "@scure/bip39": "^1.3.0", - "@suchipi/femver": "^1.0.0", - "bech32": "^2.0.0", - "gql.tada": "^1.8.2", - "graphql": "^16.9.0", - "tweetnacl": "^1.0.3", - "valibot": "^0.36.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@noble/curves": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.7.0.tgz", - "integrity": "sha512-UTMhXK9SeDhFJVrHeUJ5uZlI6ajXg10O6Ddocf9S6GjbSBVZsJo88HzKwXznNfGpMTRDyJkqMjNDPYgf0qFWnw==", - "dependencies": { - "@noble/hashes": "1.6.0" - }, - "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@noble/curves/node_modules/@noble/hashes": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.6.0.tgz", - "integrity": "sha512-YUULf0Uk4/mAA89w+k3+yUYh6NrEvxZa5T6SY3wlMvE2chHkxFUUIDI8/XW1QSC357iA5pSnqt7XEhvFOqmDyQ==", - "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@noble/hashes": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.6.1.tgz", - "integrity": "sha512-pq5D8h10hHBjyqX+cfBm0i8JUXJ0UhczFc4r74zbuT9XgewFo2E3J1cOaGtdZynILNmQ685YWGzGE1Zv6io50w==", - "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@pythnetwork/price-service-client": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@pythnetwork/price-service-client/-/price-service-client-1.9.0.tgz", - "integrity": "sha512-SLm3IFcfmy9iMqHeT4Ih6qMNZhJEefY14T9yTlpsH2D/FE5+BaGGnfcexUifVlfH6M7mwRC4hEFdNvZ6ebZjJg==", - "deprecated": "This package is deprecated and is no longer maintained. Please use @pythnetwork/hermes-client instead.", - "dependencies": { - "@pythnetwork/price-service-sdk": "*", - "@types/ws": "^8.5.3", - "axios": "^1.5.1", - "axios-retry": "^3.8.0", - "isomorphic-ws": "^4.0.1", - "ts-log": "^2.2.4", - "ws": "^8.6.0" - } - }, - "node_modules/@pythnetwork/price-service-sdk": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@pythnetwork/price-service-sdk/-/price-service-sdk-1.7.1.tgz", - "integrity": "sha512-xr2boVXTyv1KUt/c6llUTfbv2jpud99pWlMJbFaHGUBoygQsByuy7WbjIJKZ+0Blg1itLZl0Lp/pJGGg8SdJoQ==", - "dependencies": { - "bn.js": "^5.2.1" - } - }, - "node_modules/@pythnetwork/pyth-sui-js": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@pythnetwork/pyth-sui-js/-/pyth-sui-js-2.1.0.tgz", - "integrity": "sha512-oSfpqtLATTEVaac/YbaRQBvOI7DM+Qds5O0GJjEcky7UQRtz/tlU9tjQ6VRn3vm8IXw8P1mKzJcaTIO134X9Sw==", - "dependencies": { - "@mysten/sui": "^1.3.0", - "@pythnetwork/price-service-client": "1.9.0", - "buffer": "^6.0.3" - } - }, - "node_modules/@radix-ui/primitive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.0.tgz", - "integrity": "sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==" - }, - "node_modules/@radix-ui/react-arrow": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.0.tgz", - "integrity": "sha512-FmlW1rCg7hBpEBwFbjHwCW6AmWLQM6g/v0Sn8XbP9NvmSZ2San1FpQeyPtufzOMSIx7Y4dzjlHoifhp+7NkZhw==", - "dependencies": { - "@radix-ui/react-primitive": "2.0.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-collection": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.0.tgz", - "integrity": "sha512-GZsZslMJEyo1VKm5L1ZJY8tGDxZNPAoUeQUIbKeJfoi7Q4kmig5AsgLMYYuyYbfjd8fBmFORAIwYAkXMnXZgZw==", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-slot": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-collection/node_modules/@radix-ui/react-context": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.0.tgz", - "integrity": "sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-compose-refs": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz", - "integrity": "sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-context": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.1.tgz", - "integrity": "sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q==", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dialog": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.2.tgz", - "integrity": "sha512-Yj4dZtqa2o+kG61fzB0H2qUvmwBA2oyQroGLyNtBj1beo1khoQ3q1a2AO8rrQYjd8256CO9+N8L9tvsS+bnIyA==", - "dependencies": { - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.1", - "@radix-ui/react-dismissable-layer": "1.1.1", - "@radix-ui/react-focus-guards": "1.1.1", - "@radix-ui/react-focus-scope": "1.1.0", - "@radix-ui/react-id": "1.1.0", - "@radix-ui/react-portal": "1.1.2", - "@radix-ui/react-presence": "1.1.1", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-slot": "1.1.0", - "@radix-ui/react-use-controllable-state": "1.1.0", - "aria-hidden": "^1.1.1", - "react-remove-scroll": "2.6.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-direction": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.0.tgz", - "integrity": "sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dismissable-layer": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.1.tgz", - "integrity": "sha512-QSxg29lfr/xcev6kSz7MAlmDnzbP1eI/Dwn3Tp1ip0KT5CUELsxkekFEMVBEoykI3oV39hKT4TKZzBNMbcTZYQ==", - "dependencies": { - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-callback-ref": "1.1.0", - "@radix-ui/react-use-escape-keydown": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dropdown-menu": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.2.tgz", - "integrity": "sha512-GVZMR+eqK8/Kes0a36Qrv+i20bAPXSn8rCBTHx30w+3ECnR5o3xixAlqcVaYvLeyKUsm0aqyhWfmUcqufM8nYA==", - "dependencies": { - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.1", - "@radix-ui/react-id": "1.1.0", - "@radix-ui/react-menu": "2.1.2", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-controllable-state": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-focus-guards": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.1.tgz", - "integrity": "sha512-pSIwfrT1a6sIoDASCSpFwOasEwKTZWDw/iBdtnqKO7v6FeOzYJ7U53cPzYFVR3geGGXgVHaH+CdngrrAzqUGxg==", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-focus-scope": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.0.tgz", - "integrity": "sha512-200UD8zylvEyL8Bx+z76RJnASR2gRMuxlgFCPAe/Q/679a/r0eK3MBVYMb7vZODZcffZBdob1EGnky78xmVvcA==", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-callback-ref": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-id": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.0.tgz", - "integrity": "sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-menu": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.2.tgz", - "integrity": "sha512-lZ0R4qR2Al6fZ4yCCZzu/ReTFrylHFxIqy7OezIpWF4bL0o9biKo0pFIvkaew3TyZ9Fy5gYVrR5zCGZBVbO1zg==", - "dependencies": { - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-collection": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.1", - "@radix-ui/react-direction": "1.1.0", - "@radix-ui/react-dismissable-layer": "1.1.1", - "@radix-ui/react-focus-guards": "1.1.1", - "@radix-ui/react-focus-scope": "1.1.0", - "@radix-ui/react-id": "1.1.0", - "@radix-ui/react-popper": "1.2.0", - "@radix-ui/react-portal": "1.1.2", - "@radix-ui/react-presence": "1.1.1", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-roving-focus": "1.1.0", - "@radix-ui/react-slot": "1.1.0", - "@radix-ui/react-use-callback-ref": "1.1.0", - "aria-hidden": "^1.1.1", - "react-remove-scroll": "2.6.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-popper": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.0.tgz", - "integrity": "sha512-ZnRMshKF43aBxVWPWvbj21+7TQCvhuULWJ4gNIKYpRlQt5xGRhLx66tMp8pya2UkGHTSlhpXwmjqltDYHhw7Vg==", - "dependencies": { - "@floating-ui/react-dom": "^2.0.0", - "@radix-ui/react-arrow": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-callback-ref": "1.1.0", - "@radix-ui/react-use-layout-effect": "1.1.0", - "@radix-ui/react-use-rect": "1.1.0", - "@radix-ui/react-use-size": "1.1.0", - "@radix-ui/rect": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-popper/node_modules/@radix-ui/react-context": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.0.tgz", - "integrity": "sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-portal": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.2.tgz", - "integrity": "sha512-WeDYLGPxJb/5EGBoedyJbT0MpoULmwnIPMJMSldkuiMsBAv7N1cRdsTWZWht9vpPOiN3qyiGAtbK2is47/uMFg==", - "dependencies": { - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-layout-effect": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-presence": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.1.tgz", - "integrity": "sha512-IeFXVi4YS1K0wVZzXNrbaaUvIJ3qdY+/Ih4eHFhWA9SwGR9UDX7Ck8abvL57C4cv3wwMvUE0OG69Qc3NCcTe/A==", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-use-layout-effect": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz", - "integrity": "sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==", - "dependencies": { - "@radix-ui/react-slot": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-roving-focus": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.0.tgz", - "integrity": "sha512-EA6AMGeq9AEeQDeSH0aZgG198qkfHSbvWTf1HvoDmOB5bBG/qTxjYMWUKMnYiV6J/iP/J8MEFSuB2zRU2n7ODA==", - "dependencies": { - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-collection": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-direction": "1.1.0", - "@radix-ui/react-id": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-callback-ref": "1.1.0", - "@radix-ui/react-use-controllable-state": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-roving-focus/node_modules/@radix-ui/react-context": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.0.tgz", - "integrity": "sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-slot": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz", - "integrity": "sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-callback-ref": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz", - "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-controllable-state": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz", - "integrity": "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==", - "dependencies": { - "@radix-ui/react-use-callback-ref": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-escape-keydown": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.0.tgz", - "integrity": "sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==", - "dependencies": { - "@radix-ui/react-use-callback-ref": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-layout-effect": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz", - "integrity": "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-rect": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.0.tgz", - "integrity": "sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ==", - "dependencies": { - "@radix-ui/rect": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-size": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.0.tgz", - "integrity": "sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/rect": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.0.tgz", - "integrity": "sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==" - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.28.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.28.0.tgz", - "integrity": "sha512-wLJuPLT6grGZsy34g4N1yRfYeouklTgPhH1gWXCYspenKYD0s3cR99ZevOGw5BexMNywkbV3UkjADisozBmpPQ==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.28.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.28.0.tgz", - "integrity": "sha512-eiNkznlo0dLmVG/6wf+Ifi/v78G4d4QxRhuUl+s8EWZpDewgk7PX3ZyECUXU0Zq/Ca+8nU8cQpNC4Xgn2gFNDA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.28.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.28.0.tgz", - "integrity": "sha512-lmKx9yHsppblnLQZOGxdO66gT77bvdBtr/0P+TPOseowE7D9AJoBw8ZDULRasXRWf1Z86/gcOdpBrV6VDUY36Q==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.28.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.28.0.tgz", - "integrity": "sha512-8hxgfReVs7k9Js1uAIhS6zq3I+wKQETInnWQtgzt8JfGx51R1N6DRVy3F4o0lQwumbErRz52YqwjfvuwRxGv1w==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.28.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.28.0.tgz", - "integrity": "sha512-lA1zZB3bFx5oxu9fYud4+g1mt+lYXCoch0M0V/xhqLoGatbzVse0wlSQ1UYOWKpuSu3gyN4qEc0Dxf/DII1bhQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.28.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.28.0.tgz", - "integrity": "sha512-aI2plavbUDjCQB/sRbeUZWX9qp12GfYkYSJOrdYTL/C5D53bsE2/nBPuoiJKoWp5SN78v2Vr8ZPnB+/VbQ2pFA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.28.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.28.0.tgz", - "integrity": "sha512-WXveUPKtfqtaNvpf0iOb0M6xC64GzUX/OowbqfiCSXTdi/jLlOmH0Ba94/OkiY2yTGTwteo4/dsHRfh5bDCZ+w==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.28.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.28.0.tgz", - "integrity": "sha512-yLc3O2NtOQR67lI79zsSc7lk31xjwcaocvdD1twL64PK1yNaIqCeWI9L5B4MFPAVGEVjH5k1oWSGuYX1Wutxpg==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.28.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.28.0.tgz", - "integrity": "sha512-+P9G9hjEpHucHRXqesY+3X9hD2wh0iNnJXX/QhS/J5vTdG6VhNYMxJ2rJkQOxRUd17u5mbMLHM7yWGZdAASfcg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.28.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.28.0.tgz", - "integrity": "sha512-1xsm2rCKSTpKzi5/ypT5wfc+4bOGa/9yI/eaOLW0oMs7qpC542APWhl4A37AENGZ6St6GBMWhCCMM6tXgTIplw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.28.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.28.0.tgz", - "integrity": "sha512-zgWxMq8neVQeXL+ouSf6S7DoNeo6EPgi1eeqHXVKQxqPy1B2NvTbaOUWPn/7CfMKL7xvhV0/+fq/Z/J69g1WAQ==", - "cpu": [ - "ppc64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.28.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.28.0.tgz", - "integrity": "sha512-VEdVYacLniRxbRJLNtzwGt5vwS0ycYshofI7cWAfj7Vg5asqj+pt+Q6x4n+AONSZW/kVm+5nklde0qs2EUwU2g==", - "cpu": [ - "riscv64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.28.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.28.0.tgz", - "integrity": "sha512-LQlP5t2hcDJh8HV8RELD9/xlYtEzJkm/aWGsauvdO2ulfl3QYRjqrKW+mGAIWP5kdNCBheqqqYIGElSRCaXfpw==", - "cpu": [ - "s390x" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.28.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.28.0.tgz", - "integrity": "sha512-Nl4KIzteVEKE9BdAvYoTkW19pa7LR/RBrT6F1dJCV/3pbjwDcaOq+edkP0LXuJ9kflW/xOK414X78r+K84+msw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.28.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.28.0.tgz", - "integrity": "sha512-eKpJr4vBDOi4goT75MvW+0dXcNUqisK4jvibY9vDdlgLx+yekxSm55StsHbxUsRxSTt3JEQvlr3cGDkzcSP8bw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.28.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.28.0.tgz", - "integrity": "sha512-Vi+WR62xWGsE/Oj+mD0FNAPY2MEox3cfyG0zLpotZdehPFXwz6lypkGs5y38Jd/NVSbOD02aVad6q6QYF7i8Bg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.28.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.28.0.tgz", - "integrity": "sha512-kN/Vpip8emMLn/eOza+4JwqDZBL6MPNpkdaEsgUtW1NYN3DZvZqSQrbKzJcTL6hd8YNmFTn7XGWMwccOcJBL0A==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.28.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.28.0.tgz", - "integrity": "sha512-Bvno2/aZT6usSa7lRDL2+hMjVAGjuqaymF1ApZm31JXzniR/hvr14jpU+/z4X6Gt5BPlzosscyJZGUvguXIqeQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@scure/base": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.2.1.tgz", - "integrity": "sha512-DGmGtC8Tt63J5GfHgfl5CuAXh96VF/LD8K9Hr/Gv0J2lAoRGlPOMpqMpMbCTOoOJMZCk2Xt+DskdDyn6dEFdzQ==", - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@scure/bip32": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.6.0.tgz", - "integrity": "sha512-82q1QfklrUUdXJzjuRU7iG7D7XiFx5PHYVS0+oeNKhyDLT7WPqs6pBcM2W5ZdwOwKCwoE1Vy1se+DHjcXwCYnA==", - "dependencies": { - "@noble/curves": "~1.7.0", - "@noble/hashes": "~1.6.0", - "@scure/base": "~1.2.1" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@scure/bip39": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.5.0.tgz", - "integrity": "sha512-Dop+ASYhnrwm9+HA/HwXg7j2ZqM6yk2fyLWb5znexjctFY3+E+eU8cIWI0Pql0Qx4hPZCijlGq4OL71g+Uz30A==", - "dependencies": { - "@noble/hashes": "~1.6.0", - "@scure/base": "~1.2.1" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==" - }, - "node_modules/@suchipi/femver": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@suchipi/femver/-/femver-1.0.0.tgz", - "integrity": "sha512-bprE8+K5V+DPX7q2e2K57ImqNBdfGHDIWaGI5xHxZoxbKOuQZn4wzPiUxOAHnsUr3w3xHrWXwN7gnG/iIuEMIg==" - }, - "node_modules/@tanstack/query-core": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.62.0.tgz", - "integrity": "sha512-sx38bGrqF9bop92AXOvzDr0L9fWDas5zXdPglxa9cuqeVSWS7lY6OnVyl/oodfXjgOGRk79IfCpgVmxrbHuFHg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - } - }, - "node_modules/@tanstack/react-query": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.62.0.tgz", - "integrity": "sha512-tj2ltjAn2a3fs+Dqonlvs6GyLQ/LKVJE2DVSYW+8pJ3P6/VCVGrfqv5UEchmlP7tLOvvtZcOuSyI2ooVlR5Yqw==", - "license": "MIT", - "dependencies": { - "@tanstack/query-core": "5.62.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "peerDependencies": { - "react": "^18 || ^19" - } - }, - "node_modules/@types/estree": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==" - }, - "node_modules/@types/node": { - "version": "22.10.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.1.tgz", - "integrity": "sha512-qKgsUwfHZV2WCWLAnVP1JqnpE6Im6h3Y0+fYgMTasNQ7V++CBX5OT1as0g0f+OyubbFqhf6XVNIsmN4IIhEgGQ==", - "dependencies": { - "undici-types": "~6.20.0" - } - }, - "node_modules/@types/ws": { - "version": "8.5.13", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.13.tgz", - "integrity": "sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@vanilla-extract/css": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/@vanilla-extract/css/-/css-1.16.1.tgz", - "integrity": "sha512-3jKxH5ty/ZjmGoLAx8liY7e87FRCIJfnuufX/K9fQklu0YHP3ClrNisU++LkZuD+GZleqMSAQMF0r8Otln+OPQ==", - "dependencies": { - "@emotion/hash": "^0.9.0", - "@vanilla-extract/private": "^1.0.6", - "css-what": "^6.1.0", - "cssesc": "^3.0.0", - "csstype": "^3.0.7", - "dedent": "^1.5.3", - "deep-object-diff": "^1.1.9", - "deepmerge": "^4.2.2", - "lru-cache": "^10.4.3", - "media-query-parser": "^2.0.2", - "modern-ahocorasick": "^1.0.0", - "picocolors": "^1.0.0" - } - }, - "node_modules/@vanilla-extract/dynamic": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@vanilla-extract/dynamic/-/dynamic-2.1.2.tgz", - "integrity": "sha512-9BGMciD8rO1hdSPIAh1ntsG4LPD3IYKhywR7VOmmz9OO4Lx1hlwkSg3E6X07ujFx7YuBfx0GDQnApG9ESHvB2A==", - "dependencies": { - "@vanilla-extract/private": "^1.0.6" - } - }, - "node_modules/@vanilla-extract/private": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@vanilla-extract/private/-/private-1.0.6.tgz", - "integrity": "sha512-ytsG/JLweEjw7DBuZ/0JCN4WAQgM9erfSTdS1NQY778hFQSZ6cfCDEZZ0sgVm4k54uNz6ImKB33AYvSR//fjxw==" - }, - "node_modules/@vanilla-extract/recipes": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/@vanilla-extract/recipes/-/recipes-0.5.5.tgz", - "integrity": "sha512-VadU7+IFUwLNLMgks29AHav/K5h7DOEfTU91RItn5vwdPfzduodNg317YbgWCcpm7FSXkuR3B3X8ZOi95UOozA==", - "peerDependencies": { - "@vanilla-extract/css": "^1.0.0" - } - }, - "node_modules/@vitest/expect": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.6.0.tgz", - "integrity": "sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==", - "dependencies": { - "@vitest/spy": "1.6.0", - "@vitest/utils": "1.6.0", - "chai": "^4.3.10" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/runner": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.6.0.tgz", - "integrity": "sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg==", - "dependencies": { - "@vitest/utils": "1.6.0", - "p-limit": "^5.0.0", - "pathe": "^1.1.1" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/snapshot": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.6.0.tgz", - "integrity": "sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==", - "dependencies": { - "magic-string": "^0.30.5", - "pathe": "^1.1.1", - "pretty-format": "^29.7.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/spy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.6.0.tgz", - "integrity": "sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==", - "dependencies": { - "tinyspy": "^2.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/utils": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.6.0.tgz", - "integrity": "sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==", - "dependencies": { - "diff-sequences": "^29.6.3", - "estree-walker": "^3.0.3", - "loupe": "^2.3.7", - "pretty-format": "^29.7.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@wallet-standard/app": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@wallet-standard/app/-/app-1.1.0.tgz", - "integrity": "sha512-3CijvrO9utx598kjr45hTbbeeykQrQfKmSnxeWOgU25TOEpvcipD/bYDQWIqUv1Oc6KK4YStokSMu/FBNecGUQ==", - "dependencies": { - "@wallet-standard/base": "^1.1.0" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/@wallet-standard/base": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@wallet-standard/base/-/base-1.1.0.tgz", - "integrity": "sha512-DJDQhjKmSNVLKWItoKThJS+CsJQjR9AOBOirBVT1F9YpRyC9oYHE+ZnSf8y8bxUphtKqdQMPVQ2mHohYdRvDVQ==", - "engines": { - "node": ">=16" - } - }, - "node_modules/@wallet-standard/core": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@wallet-standard/core/-/core-1.0.3.tgz", - "integrity": "sha512-Jb33IIjC1wM1HoKkYD7xQ6d6PZ8EmMZvyc8R7dFgX66n/xkvksVTW04g9yLvQXrLFbcIjHrCxW6TXMhvpsAAzg==", - "dependencies": { - "@wallet-standard/app": "^1.0.1", - "@wallet-standard/base": "^1.0.1", - "@wallet-standard/features": "^1.0.3", - "@wallet-standard/wallet": "^1.0.1" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/@wallet-standard/features": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@wallet-standard/features/-/features-1.1.0.tgz", - "integrity": "sha512-hiEivWNztx73s+7iLxsuD1sOJ28xtRix58W7Xnz4XzzA/pF0+aicnWgjOdA10doVDEDZdUuZCIIqG96SFNlDUg==", - "dependencies": { - "@wallet-standard/base": "^1.1.0" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/@wallet-standard/wallet": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@wallet-standard/wallet/-/wallet-1.1.0.tgz", - "integrity": "sha512-Gt8TnSlDZpAl+RWOOAB/kuvC7RpcdWAlFbHNoi4gsXsfaWa1QCT6LBcfIYTPdOZC9OVZUDwqGuGAcqZejDmHjg==", - "dependencies": { - "@wallet-standard/base": "^1.1.0" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/acorn": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", - "dependencies": { - "acorn": "^8.11.0" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/aria-hidden": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.4.tgz", - "integrity": "sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==", - "dependencies": { - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "engines": { - "node": "*" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "node_modules/axios": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.8.tgz", - "integrity": "sha512-Uu0wb7KNqK2t5K+YQyVCLM76prD5sRFjKHbJYCP1J7JFGEQ6nN7HWn9+04LAeiJ3ji54lgS/gZCH1oxyrf1SPw==", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/axios-retry": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/axios-retry/-/axios-retry-3.9.1.tgz", - "integrity": "sha512-8PJDLJv7qTTMMwdnbMvrLYuvB47M81wRtxQmEdV5w4rgbTXTt+vtPkXwajOfOdSyv/wZICJOC+/UhXH4aQ/R+w==", - "dependencies": { - "@babel/runtime": "^7.15.4", - "is-retry-allowed": "^2.2.0" - } - }, - "node_modules/base-x": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-5.0.0.tgz", - "integrity": "sha512-sMW3VGSX1QWVFA6l8U62MLKz29rRfpTlYdCqLdpLo1/Yd4zZwSbnUaDfciIAowAqvq7YFnWq9hrhdg1KYgc1lQ==" - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/bech32": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/bech32/-/bech32-2.0.0.tgz", - "integrity": "sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==" - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/bs58": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-6.0.0.tgz", - "integrity": "sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==", - "dependencies": { - "base-x": "^5.0.0" - } - }, - "node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/cac": { - "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/chai": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.5.0.tgz", - "integrity": "sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==", - "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.3", - "deep-eql": "^4.1.3", - "get-func-name": "^2.0.2", - "loupe": "^2.3.6", - "pathval": "^1.1.1", - "type-detect": "^4.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/check-error": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", - "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", - "dependencies": { - "get-func-name": "^2.0.2" - }, - "engines": { - "node": "*" - } - }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/confbox": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", - "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==" - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" - }, - "node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/dedent": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", - "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", - "peerDependencies": { - "babel-plugin-macros": "^3.1.0" - }, - "peerDependenciesMeta": { - "babel-plugin-macros": { - "optional": true - } - } - }, - "node_modules/deep-eql": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz", - "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==", - "dependencies": { - "type-detect": "^4.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/deep-object-diff": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/deep-object-diff/-/deep-object-diff-1.1.9.tgz", - "integrity": "sha512-Rn+RuwkmkDwCi2/oXOFS9Gsr5lJZu/yTGpK7wAaAIE75CC+LCGEZHpY6VQJa/RoJcrmaA/docWJZvYohlNkWPA==" - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/detect-node-es": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", - "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==" - }, - "node_modules/diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/dotenv": { - "version": "16.4.5", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", - "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/enquirer": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", - "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", - "license": "MIT", - "dependencies": { - "ansi-colors": "^4.1.1", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/esbuild": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", - "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.17.19", - "@esbuild/android-arm64": "0.17.19", - "@esbuild/android-x64": "0.17.19", - "@esbuild/darwin-arm64": "0.17.19", - "@esbuild/darwin-x64": "0.17.19", - "@esbuild/freebsd-arm64": "0.17.19", - "@esbuild/freebsd-x64": "0.17.19", - "@esbuild/linux-arm": "0.17.19", - "@esbuild/linux-arm64": "0.17.19", - "@esbuild/linux-ia32": "0.17.19", - "@esbuild/linux-loong64": "0.17.19", - "@esbuild/linux-mips64el": "0.17.19", - "@esbuild/linux-ppc64": "0.17.19", - "@esbuild/linux-riscv64": "0.17.19", - "@esbuild/linux-s390x": "0.17.19", - "@esbuild/linux-x64": "0.17.19", - "@esbuild/netbsd-x64": "0.17.19", - "@esbuild/openbsd-x64": "0.17.19", - "@esbuild/sunos-x64": "0.17.19", - "@esbuild/win32-arm64": "0.17.19", - "@esbuild/win32-ia32": "0.17.19", - "@esbuild/win32-x64": "0.17.19" - } - }, - "node_modules/esrun": { - "version": "3.2.26", - "resolved": "https://registry.npmjs.org/esrun/-/esrun-3.2.26.tgz", - "integrity": "sha512-gDjP87qj4RW0BryZXPY3/L161hPo9uG6luBTjLsuHG3cKnhSMrzB7eNzSzvDyBLg7OgugyvzSgB2ov7mZ/oa7Q==", - "dependencies": { - "@digitak/grubber": "^3.1.4", - "chokidar": "^3.5.1", - "esbuild": "^0.17.4" - }, - "bin": { - "esrun": "bin.js" - }, - "engines": { - "node": ">=14.0" - } - }, - "node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dependencies": { - "@types/estree": "^1.0.0" - } - }, - "node_modules/execa": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", - "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^8.0.1", - "human-signals": "^5.0.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": ">=16.17" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/follow-redirects": { - "version": "1.15.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", - "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/form-data": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", - "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/get-func-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", - "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", - "engines": { - "node": "*" - } - }, - "node_modules/get-nonce": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", - "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", - "engines": { - "node": ">=6" - } - }, - "node_modules/get-stream": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/gql.tada": { - "version": "1.8.10", - "resolved": "https://registry.npmjs.org/gql.tada/-/gql.tada-1.8.10.tgz", - "integrity": "sha512-FrvSxgz838FYVPgZHGOSgbpOjhR+yq44rCzww3oOPJYi0OvBJjAgCiP6LEokZIYND2fUTXzQAyLgcvgw1yNP5A==", - "dependencies": { - "@0no-co/graphql.web": "^1.0.5", - "@0no-co/graphqlsp": "^1.12.13", - "@gql.tada/cli-utils": "1.6.3", - "@gql.tada/internal": "1.0.8" - }, - "bin": { - "gql-tada": "bin/cli.js", - "gql.tada": "bin/cli.js" - }, - "peerDependencies": { - "typescript": "^5.0.0" - } - }, - "node_modules/graphql": { - "version": "16.9.0", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.9.0.tgz", - "integrity": "sha512-GGTKBX4SD7Wdb8mqeDLni2oaRGYQWjWHGKPQ24ZMnUtKfcsVoiv4uX8+LJr1K6U5VW2Lu1BwJnj7uiori0YtRw==", - "engines": { - "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" - } - }, - "node_modules/human-signals": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", - "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", - "engines": { - "node": ">=16.17.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dependencies": { - "loose-envify": "^1.0.0" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-retry-allowed": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-2.2.0.tgz", - "integrity": "sha512-XVm7LOeLpTW4jV19QSH38vkswxoLud8sQ57YwJVTPWdiaI9I8keEhGFpBlslyVsgdQy4Opg8QOLb8YRgsyZiQg==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" - }, - "node_modules/isomorphic-ws": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz", - "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==", - "peerDependencies": { - "ws": "*" - } - }, - "node_modules/jose": { - "version": "5.9.6", - "resolved": "https://registry.npmjs.org/jose/-/jose-5.9.6.tgz", - "integrity": "sha512-AMlnetc9+CV9asI19zHmrgS/WYsWUwCn2R7RzlbJWD7F9eWYUTGyBmU9o6PxngtLGOiDGPRu+Uc4fhKzbpteZQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/panva" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/local-pkg": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.1.tgz", - "integrity": "sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==", - "dependencies": { - "mlly": "^1.7.3", - "pkg-types": "^1.2.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/loupe": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", - "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", - "dependencies": { - "get-func-name": "^2.0.1" - } - }, - "node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" - }, - "node_modules/magic-string": { - "version": "0.30.14", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.14.tgz", - "integrity": "sha512-5c99P1WKTed11ZC0HMJOj6CDIue6F8ySu+bJL+85q1zBEIY8IklrJ1eiKC2NDRh3Ct3FcvmJPyQHb9erXMTJNw==", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" - } - }, - "node_modules/media-query-parser": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/media-query-parser/-/media-query-parser-2.0.2.tgz", - "integrity": "sha512-1N4qp+jE0pL5Xv4uEcwVUhIkwdUO3S/9gML90nqKA7v7FcOS5vUtatfzok9S9U1EJU8dHWlcv95WLnKmmxZI9w==", - "dependencies": { - "@babel/runtime": "^7.12.5" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/mitt": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", - "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==" - }, - "node_modules/mlly": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.3.tgz", - "integrity": "sha512-xUsx5n/mN0uQf4V548PKQ+YShA4/IW0KI1dZhrNrPCLG+xizETbHTkOa1f8/xut9JRPp8kQuMnz0oqwkTiLo/A==", - "dependencies": { - "acorn": "^8.14.0", - "pathe": "^1.1.2", - "pkg-types": "^1.2.1", - "ufo": "^1.5.4" - } - }, - "node_modules/modern-ahocorasick": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/modern-ahocorasick/-/modern-ahocorasick-1.1.0.tgz", - "integrity": "sha512-sEKPVl2rM+MNVkGQt3ChdmD8YsigmXdn5NifZn6jiwn9LRJpWm8F3guhaqrJT/JOat6pwpbXEk6kv+b9DMIjsQ==" - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/nanoid": { - "version": "3.3.8", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", - "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/nanostores": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/nanostores/-/nanostores-0.10.3.tgz", - "integrity": "sha512-Nii8O1XqmawqSCf9o2aWqVxhKRN01+iue9/VEd1TiJCr9VT5XxgPFbF1Edl1XN6pwJcZRsl8Ki+z01yb/T/C2g==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "engines": { - "node": "^18.0.0 || >=20.0.0" - } - }, - "node_modules/navi-sdk": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/navi-sdk/-/navi-sdk-1.4.4.tgz", - "integrity": "sha512-ixam9+OTc6lE8NbM3isL+9vFpYSgZOo5OBDZlUimWZvmdLMmvqyEg/hy+nWHLLyCbwo5rPx9iPIJrLrt6DdjOQ==", - "dependencies": { - "@mysten/sui": "^1.14.3", - "@mysten/sui.js": "^0.54.1", - "@pythnetwork/pyth-sui-js": "^2.1.0", - "axios": "^1.7.7", - "esrun": "^3.2.26", - "navi-sdk": "^1.3.10", - "tsconfig-paths": "^4.2.0", - "vitest": "^1.6.0" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-run-path": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", - "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", - "dependencies": { - "path-key": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-run-path/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dependencies": { - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-limit": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz", - "integrity": "sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==", - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/pathe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==" - }, - "node_modules/pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "engines": { - "node": "*" - } - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pkg-types": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.2.1.tgz", - "integrity": "sha512-sQoqa8alT3nHjGuTjuKgOnvjo4cljkufdtLMnO2LBP/wRwuDlo1tkaEdMxCRhyGRPacv/ztlZgDPm2b7FAmEvw==", - "dependencies": { - "confbox": "^0.1.8", - "mlly": "^1.7.2", - "pathe": "^1.1.2" - } - }, - "node_modules/poseidon-lite": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/poseidon-lite/-/poseidon-lite-0.2.1.tgz", - "integrity": "sha512-xIr+G6HeYfOhCuswdqcFpSX47SPhm0EpisWJ6h7fHlWwaVIvH3dLnejpatrtw6Xc6HaLrpq05y7VRfvDmDGIog==", - "license": "MIT" - }, - "node_modules/postcss": { - "version": "8.4.49", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", - "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" - }, - "node_modules/react": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", - "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" - }, - "peerDependencies": { - "react": "^18.3.1" - } - }, - "node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" - }, - "node_modules/react-remove-scroll": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.6.0.tgz", - "integrity": "sha512-I2U4JVEsQenxDAKaVa3VZ/JeJZe0/2DxPWL8Tj8yLKctQJQiZM52pn/GWFpSp8dftjM3pSAHVJZscAnC/y+ySQ==", - "dependencies": { - "react-remove-scroll-bar": "^2.3.6", - "react-style-singleton": "^2.2.1", - "tslib": "^2.1.0", - "use-callback-ref": "^1.3.0", - "use-sidecar": "^1.1.2" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-remove-scroll-bar": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.6.tgz", - "integrity": "sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==", - "dependencies": { - "react-style-singleton": "^2.2.1", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-style-singleton": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz", - "integrity": "sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==", - "dependencies": { - "get-nonce": "^1.0.0", - "invariant": "^2.2.4", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" - }, - "node_modules/rollup": { - "version": "4.28.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.28.0.tgz", - "integrity": "sha512-G9GOrmgWHBma4YfCcX8PjH0qhXSdH8B4HDE2o4/jaxj93S4DPCIDoLcXz99eWMji4hB29UFCEd7B2gwGJDR9cQ==", - "dependencies": { - "@types/estree": "1.0.6" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.28.0", - "@rollup/rollup-android-arm64": "4.28.0", - "@rollup/rollup-darwin-arm64": "4.28.0", - "@rollup/rollup-darwin-x64": "4.28.0", - "@rollup/rollup-freebsd-arm64": "4.28.0", - "@rollup/rollup-freebsd-x64": "4.28.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.28.0", - "@rollup/rollup-linux-arm-musleabihf": "4.28.0", - "@rollup/rollup-linux-arm64-gnu": "4.28.0", - "@rollup/rollup-linux-arm64-musl": "4.28.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.28.0", - "@rollup/rollup-linux-riscv64-gnu": "4.28.0", - "@rollup/rollup-linux-s390x-gnu": "4.28.0", - "@rollup/rollup-linux-x64-gnu": "4.28.0", - "@rollup/rollup-linux-x64-musl": "4.28.0", - "@rollup/rollup-win32-arm64-msvc": "4.28.0", - "@rollup/rollup-win32-ia32-msvc": "4.28.0", - "@rollup/rollup-win32-x64-msvc": "4.28.0", - "fsevents": "~2.3.2" - } - }, - "node_modules/scheduler": { - "version": "0.23.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", - "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "engines": { - "node": ">=8" - } - }, - "node_modules/siginfo": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==" - }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stackback": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==" - }, - "node_modules/std-env": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.8.0.tgz", - "integrity": "sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==" - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strip-literal": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-2.1.1.tgz", - "integrity": "sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==", - "dependencies": { - "js-tokens": "^9.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/strip-literal/node_modules/js-tokens": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", - "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==" - }, - "node_modules/superstruct": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-1.0.4.tgz", - "integrity": "sha512-7JpaAoX2NGyoFlI9NBh66BQXGONc+uE+MRS5i2iOBKuS4e+ccgMDjATgZldkah+33DakBxDHiss9kvUcGAO8UQ==", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tinybench": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", - "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==" - }, - "node_modules/tinypool": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.8.4.tgz", - "integrity": "sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tinyspy": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.1.tgz", - "integrity": "sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/ts-log": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/ts-log/-/ts-log-2.2.7.tgz", - "integrity": "sha512-320x5Ggei84AxzlXp91QkIGSw5wgaLT6GeAH0KsqDmRZdVWW2OiSeVvElVoatk3f7nicwXlElXsoFkARiGE2yg==" - }, - "node_modules/tsconfig-paths": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", - "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", - "dependencies": { - "json5": "^2.2.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" - }, - "node_modules/tweetnacl": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", - "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" - }, - "node_modules/type-detect": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz", - "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/typescript": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", - "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/ufo": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.4.tgz", - "integrity": "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==" - }, - "node_modules/undici-types": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", - "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==" - }, - "node_modules/use-callback-ref": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.2.tgz", - "integrity": "sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==", - "dependencies": { - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/use-sidecar": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz", - "integrity": "sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==", - "dependencies": { - "detect-node-es": "^1.1.0", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "^16.9.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/use-sync-external-store": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz", - "integrity": "sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/valibot": { - "version": "0.36.0", - "resolved": "https://registry.npmjs.org/valibot/-/valibot-0.36.0.tgz", - "integrity": "sha512-CjF1XN4sUce8sBK9TixrDqFM7RwNkuXdJu174/AwmQUB62QbCQADg5lLe8ldBalFgtj1uKj+pKwDJiNo4Mn+eQ==" - }, - "node_modules/vite": { - "version": "5.4.11", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.11.tgz", - "integrity": "sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==", - "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/vite-node": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.6.0.tgz", - "integrity": "sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw==", - "dependencies": { - "cac": "^6.7.14", - "debug": "^4.3.4", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", - "vite": "^5.0.0" - }, - "bin": { - "vite-node": "vite-node.mjs" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/vite/node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" - } - }, - "node_modules/vitest": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.6.0.tgz", - "integrity": "sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA==", - "dependencies": { - "@vitest/expect": "1.6.0", - "@vitest/runner": "1.6.0", - "@vitest/snapshot": "1.6.0", - "@vitest/spy": "1.6.0", - "@vitest/utils": "1.6.0", - "acorn-walk": "^8.3.2", - "chai": "^4.3.10", - "debug": "^4.3.4", - "execa": "^8.0.1", - "local-pkg": "^0.5.0", - "magic-string": "^0.30.5", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", - "std-env": "^3.5.0", - "strip-literal": "^2.0.0", - "tinybench": "^2.5.1", - "tinypool": "^0.8.3", - "vite": "^5.0.0", - "vite-node": "1.6.0", - "why-is-node-running": "^2.2.2" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@types/node": "^18.0.0 || >=20.0.0", - "@vitest/browser": "1.6.0", - "@vitest/ui": "1.6.0", - "happy-dom": "*", - "jsdom": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - } - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/why-is-node-running": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", - "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", - "dependencies": { - "siginfo": "^2.0.0", - "stackback": "0.0.2" - }, - "bin": { - "why-is-node-running": "cli.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ws": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/yocto-queue": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", - "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/zustand": { - "version": "4.5.5", - "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.5.5.tgz", - "integrity": "sha512-+0PALYNJNgK6hldkgDq2vLrw5f6g/jCInz52n9RTpropGgeAf/ioFUCdtsjCqu4gNhW9D01rUQBROoRjdzyn2Q==", - "dependencies": { - "use-sync-external-store": "1.2.2" - }, - "engines": { - "node": ">=12.7.0" - }, - "peerDependencies": { - "@types/react": ">=16.8", - "immer": ">=9.0.6", - "react": ">=16.8" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "immer": { - "optional": true - }, - "react": { - "optional": true - } - } - } - } -} diff --git a/package.json b/package.json deleted file mode 100644 index b37f243ae..000000000 --- a/package.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "dependencies": { - "@mysten/create-dapp": "^0.3.40", - "@mysten/dapp-kit": "^0.14.39", - "@mysten/sui": "^1.16.0", - "@tanstack/react-query": "^5.62.0", - "dotenv": "^16.4.5", - "navi-sdk": "^1.4.3" - } -} diff --git a/s.html b/s.html deleted file mode 100644 index e69de29bb..000000000 diff --git a/task/readme.md b/task/readme.md index 6b2123e44..97492e05d 100644 --- a/task/readme.md +++ b/task/readme.md @@ -32,12 +32,12 @@ | 任务 | 名称 | 人民币等值Token | 说明 | |:-------------------------------------------|-------------------|:----------:|:-----------------------| -| [task 1](01.hello_move.md) | hello move | ¥20 | 完成第一个合约部署上链 | -| [task 2](02.move_coin.md) | move coin | ¥20 | 完成Coin协议学习,并发布两个Coin上链 | -| [task 3](03.move_nft.md) | move nft | ¥20 | 完成NFT的学习,并发布NFT上链 | -| [task 4](04.move_game.md) | move game | ¥20 | 完成链上游戏学习,并上链交互 | -| [task 5](05.move_swap.md) | move swap | ¥20 | 完成Swap学习,并上链交互 | -| [task 6](06.SDK_PTB_NAVI.md) | sdk ptb | ¥20(NAVX) | 完成SDK学习,并用SDK完成链上交互 | -| [task 7](07.move_ctf_check_in.md) | move ctf check in | ¥20 | 完成move ctf check in | -| [task 8](08.move_ctf_lets_move.md) | move ctf pow | ¥20 | 完成move ctf pow | -| [defi](https://dacade.org/communities/sui) | defi | 35SUI | 完成Defi学习挑战 | \ No newline at end of file +| [task 1](01.hello_move.md) | hello move | ¥10 | 完成第一个合约部署上链 | +| [task 2](02.move_coin.md) | move coin | ¥10 | 完成Coin协议学习,并发布两个Coin上链 | +| [task 3](03.move_nft.md) | move nft | ¥10 | 完成NFT的学习,并发布NFT上链 | +| [task 4](04.move_game.md) | move game | ¥10 | 完成链上游戏学习,并上链交互 | +| [task 5](05.move_swap.md) | move swap | ¥10 | 完成Swap学习,并上链交互 | +| [task 6](06.SDK_PTB_NAVI.md) | sdk ptb | ¥10(NAVX) | 完成SDK学习,并用SDK完成链上交互 | +| [task 7](07.move_ctf_check_in.md) | move ctf check in | ¥10 | 完成move ctf check in | +| [task 8](08.move_ctf_lets_move.md) | move ctf pow | ¥10 | 完成move ctf pow | +| [defi](https://dacade.org/communities/sui) | defi | 14SUI | 完成Defi学习挑战 | \ No newline at end of file