From 5101ae15a8e676879019663fe7731c422c173ac5 Mon Sep 17 00:00:00 2001 From: Marc Espin Date: Mon, 27 Jan 2025 08:02:41 +0100 Subject: [PATCH 01/51] fix(explorer): Fix last rewards metric in validators page (#4964) * fix(explorer): Fix last rewards metric in validators page * clean up * comments --- .../src/pages/validators/Validators.tsx | 35 ++++++++++++------- 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/apps/explorer/src/pages/validators/Validators.tsx b/apps/explorer/src/pages/validators/Validators.tsx index a11a5b69790..1ab8086ff87 100644 --- a/apps/explorer/src/pages/validators/Validators.tsx +++ b/apps/explorer/src/pages/validators/Validators.tsx @@ -20,6 +20,8 @@ import { IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; import { ErrorBoundary, PageLayout, PlaceholderTable, TableCard } from '~/components'; import { generateValidatorsTableColumns } from '~/lib/ui'; import { Warning } from '@iota/apps-ui-icons'; +import { useQuery } from '@tanstack/react-query'; +import { useEnhancedRpcClient } from '~/hooks'; function ValidatorPageResult(): JSX.Element { const { data, isPending, isSuccess, isError } = useIotaClientQuery('getLatestIotaSystemState'); @@ -58,18 +60,27 @@ function ValidatorPageResult(): JSX.Element { return apys.length > 0 ? roundFloat(averageAPY / apys.length) : 0; }, [validatorsApy]); - const lastEpochRewardOnAllValidators = useMemo(() => { - if (!validatorEvents) return null; - let totalRewards = 0; - - validatorEvents.forEach(({ parsedJson }) => { - totalRewards += Number( - (parsedJson as { pool_staking_reward: string }).pool_staking_reward, - ); - }); - - return totalRewards; - }, [validatorEvents]); + const enhancedRpc = useEnhancedRpcClient(); + const { data: epochData } = useQuery({ + queryKey: ['epoch', data?.epoch], + queryFn: async () => { + const epoch = Number(data?.epoch || 0); + // When the epoch is 0 or 1 we show the epoch 0 as the previous epoch + // Otherwise simply use the previous epoch, + // -1 because the cursor starts at `undefined`, and -1 to go the the previous, so -1 -1 = -2 + // This is the mapping between epochs and their cursor: + // epoch 0 = cursor undefined + // epoch 1 = cursor 0 + // epoch 2 = cursor 1 + // ... + return enhancedRpc.getEpochs({ + cursor: epoch === 0 || epoch === 1 ? undefined : (epoch - 2).toString(), + limit: 1, + }); + }, + }); + const lastEpochRewardOnAllValidators = + epochData?.data[0].endOfEpochInfo?.totalStakeRewardsDistributed; const tableData = data ? [...data.activeValidators].sort(() => 0.5 - Math.random()) : []; From 1a36c48a78d94f16c00ffeb383c3483b43e06464 Mon Sep 17 00:00:00 2001 From: DaughterOfMars Date: Mon, 27 Jan 2025 06:56:51 -0500 Subject: [PATCH 02/51] chore(examples): Separate examples from the workspace and check them in CI (#4961) * chore(examples): Separate examples from the workspace and check them in CI * Add `isRustExample` gate * sort * Update patch * remove examples copy from docker files * Loop over glob * patch * Remove failure check * try changin runner * Add missing outputs and remove extra checkouts * Option 1 * add udeps * globstar * Revert checkout steps * slightly improve logging --------- Co-authored-by: Thibault Martinez --- .github/actions/diffs/action.yml | 17 +- .github/workflows/_rust.yml | 3 + .github/workflows/_rust_lints.yml | 22 + .github/workflows/hierarchy.yml | 4 +- Cargo.lock | 280 +- Cargo.toml | 6 +- docker/iota-bridge-indexer/Dockerfile | 1 - docker/iota-data-ingestion/Dockerfile | 1 - docker/iota-graphql-rpc/Dockerfile | 1 - docker/iota-indexer/Dockerfile | 1 - docker/iota-node/Dockerfile | 1 - docker/iota-proxy/Dockerfile | 1 - docker/iota-rosetta/Dockerfile | 1 - .../iota-source-validation-service/Dockerfile | 1 - docker/iota-tools/Dockerfile | 1 - docker/iota/Dockerfile | 1 - docs/examples/rust/Cargo.lock | 8380 +++++++++++++++++ docs/examples/rust/Cargo.toml | 24 +- examples/custom-indexer/rust/Cargo.toml | 14 +- examples/tic-tac-toe/cli/Cargo.toml | 12 +- scripts/simtest/config-patch | 4 +- 21 files changed, 8518 insertions(+), 258 deletions(-) create mode 100644 docs/examples/rust/Cargo.lock diff --git a/.github/actions/diffs/action.yml b/.github/actions/diffs/action.yml index ebfa226d4da..c57bcf335b6 100644 --- a/.github/actions/diffs/action.yml +++ b/.github/actions/diffs/action.yml @@ -7,9 +7,21 @@ outputs: isRust: description: True when changes happened to the Rust code value: "${{ steps.diff.outputs.isRust }}" + isRustExample: + description: True when changes happened to the Rust example code + value: "${{ steps.diff.outputs.isRustExample }}" + isRpc: + description: True when changes happened to the RPC code + value: "${{ steps.diff.outputs.isRpc }}" + isPgIntegration: + description: True when changes happened to the PG integration code + value: "${{ steps.diff.outputs.isPgIntegration }}" isMove: description: True when changes happened to the Move code value: "${{ steps.diff.outputs.isMove }}" + isRosetta: + description: True when changes happened to the rosetta code + value: "${{ steps.diff.outputs.isRosetta }}" isExternalCrates: description: True when changes happened in external crates value: "${{ steps.diff.outputs.isExternalCrates }}" @@ -31,7 +43,6 @@ runs: - "crates/**" - "external-crates/**" - "iota-execution/**" - - "docs/examples/rust/**" - ".github/workflows/hierarchy.yml" - ".github/workflows/codecov.yml" - ".github/workflows/_rust.yml" @@ -44,6 +55,10 @@ runs: - "Cargo.lock" - ".config/nextest.toml" - "rust-toolchain.toml" + isRustExample: + - "examples/custom-indexer/rust/**" + - "examples/tic-tac-toe/cli/**" + - "docs/examples/rust/**" isRpc: - "crates/iota-json-rpc/**" - "crates/iota-json-rpc-types/**" diff --git a/.github/workflows/_rust.yml b/.github/workflows/_rust.yml index 8eec9a02566..a2edff4b2a2 100644 --- a/.github/workflows/_rust.yml +++ b/.github/workflows/_rust.yml @@ -5,6 +5,8 @@ on: inputs: isRust: type: boolean + isRustExample: + type: boolean isPgIntegration: type: boolean @@ -36,6 +38,7 @@ jobs: uses: ./.github/workflows/_rust_lints.yml with: isRust: ${{ inputs.isRust }} + isRustExample: ${{ inputs.isRustExample }} deny: uses: ./.github/workflows/_cargo_deny.yml diff --git a/.github/workflows/_rust_lints.yml b/.github/workflows/_rust_lints.yml index 43410a38234..09235d70b1d 100644 --- a/.github/workflows/_rust_lints.yml +++ b/.github/workflows/_rust_lints.yml @@ -5,6 +5,8 @@ on: inputs: isRust: type: boolean + isRustExample: + type: boolean concurrency: group: rust-lints-${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} @@ -45,6 +47,26 @@ jobs: exit 1 # Fail the workflow fi + examples: + if: (!cancelled() && inputs.isRustExample) + runs-on: [self-hosted] + steps: + - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 + - name: Check examples + # Set the globstar opt here to enable recursive glob. + run: | + shopt -s globstar + for manifest in ./**/examples/**/Cargo.toml; do + echo "Checking format for $manifest" + cargo +nightly ci-fmt --manifest-path $manifest + + echo "Clippy linting for $manifest" + cargo clippy --manifest-path $manifest --all-features + + echo "Checking unused dependencies of $manifest" + cargo +nightly ci-udeps --manifest-path $manifest + done + clippy: if: (!cancelled() && !failure() && inputs.isRust) needs: diff --git a/.github/workflows/hierarchy.yml b/.github/workflows/hierarchy.yml index f0d9745e4ba..4d333cd3f70 100644 --- a/.github/workflows/hierarchy.yml +++ b/.github/workflows/hierarchy.yml @@ -13,12 +13,13 @@ on: jobs: diff: - runs-on: [self-hosted] + runs-on: [ubuntu-latest] concurrency: group: diff-${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} cancel-in-progress: ${{ github.ref != 'refs/heads/develop' }} outputs: isRust: ${{ steps.diff.outputs.isRust }} + isRustExample: ${{ steps.diff.outputs.isRustExample }} isRpc: ${{ steps.diff.outputs.isRpc }} isPgIntegration: ${{ steps.diff.outputs.isPgIntegration }} isMove: ${{ steps.diff.outputs.isMove }} @@ -108,6 +109,7 @@ jobs: secrets: inherit with: isRust: ${{ needs.diff.outputs.isRust == 'true' }} + isRustExample: ${{ needs.diff.outputs.isRustExample == 'true' }} isPgIntegration: ${{ needs.diff.outputs.isPgIntegration == 'true' }} rosetta: diff --git a/Cargo.lock b/Cargo.lock index bd2df2f0801..a66ea05654b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2675,7 +2675,7 @@ dependencies = [ name = "consensus-config" version = "0.1.0" dependencies = [ - "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", + "fastcrypto", "insta", "iota-network-stack", "rand 0.8.5", @@ -2697,7 +2697,7 @@ dependencies = [ "consensus-config", "dashmap", "enum_dispatch", - "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", + "fastcrypto", "futures", "http 1.1.0", "hyper 1.4.1", @@ -2852,15 +2852,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" -[[package]] -name = "convert_case" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" -dependencies = [ - "unicode-segmentation", -] - [[package]] name = "core-foundation" version = "0.9.4" @@ -3197,19 +3188,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "custom-indexer" -version = "0.1.0" -dependencies = [ - "anyhow", - "async-trait", - "iota-data-ingestion-core", - "iota-types", - "prometheus", - "tokio", - "tokio-util 0.7.12", -] - [[package]] name = "cynic" version = "3.7.3" @@ -3485,7 +3463,7 @@ version = "0.99.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce" dependencies = [ - "convert_case 0.4.0", + "convert_case", "proc-macro2", "quote", "rustc_version", @@ -3695,23 +3673,6 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" -[[package]] -name = "docs-examples" -version = "0.9.0-alpha" -dependencies = [ - "anyhow", - "bcs", - "bip32", - "iota-keys", - "iota-move-build", - "iota-sdk 0.9.0-alpha", - "move-binary-format", - "move-core-types", - "serde_json", - "shared-crypto", - "tokio", -] - [[package]] name = "downcast" version = "0.11.0" @@ -4412,58 +4373,6 @@ dependencies = [ "ascii_utils", ] -[[package]] -name = "fastcrypto" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f9ea2139faa96e4d713803b7777b8fd2d5c245858b1644c08d3220f407149c6" -dependencies = [ - "ark-ec", - "ark-ff", - "ark-secp256r1", - "ark-serialize", - "auto_ops", - "base64ct", - "bech32", - "bincode", - "blake2", - "blst", - "bs58 0.4.0", - "curve25519-dalek-ng", - "derive_more 0.99.18", - "digest 0.10.7", - "ecdsa 0.16.9", - "ed25519-consensus", - "elliptic-curve 0.13.8", - "eyre", - "fastcrypto-derive 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "generic-array", - "hex", - "hex-literal 0.4.1", - "hkdf", - "lazy_static", - "num-bigint 0.4.6", - "once_cell", - "p256 0.13.2", - "rand 0.8.5", - "readonly", - "rfc6979 0.4.0", - "rsa 0.8.2", - "schemars", - "secp256k1", - "serde", - "serde_json", - "serde_with 2.3.3", - "sha2 0.10.8", - "sha3 0.10.8", - "signature 2.2.0", - "static_assertions", - "thiserror", - "tokio", - "typenum", - "zeroize", -] - [[package]] name = "fastcrypto" version = "0.1.8" @@ -4490,7 +4399,7 @@ dependencies = [ "ecdsa 0.16.9", "ed25519-consensus", "elliptic-curve 0.13.8", - "fastcrypto-derive 0.1.3 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", + "fastcrypto-derive", "generic-array", "hex", "hex-literal 0.4.1", @@ -4507,7 +4416,7 @@ dependencies = [ "secp256k1", "serde", "serde_json", - "serde_with 3.9.0", + "serde_with", "sha2 0.10.8", "sha3 0.10.8", "signature 2.2.0", @@ -4518,18 +4427,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "fastcrypto-derive" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c0c2af2157f416cb885e11d36cd0de2753f6d5384752d364075c835f5f8f891" -dependencies = [ - "convert_case 0.6.0", - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "fastcrypto-derive" version = "0.1.3" @@ -4546,7 +4443,7 @@ source = "git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f9 dependencies = [ "bcs", "digest 0.10.7", - "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", + "fastcrypto", "hex", "itertools 0.10.5", "rand 0.8.5", @@ -4564,7 +4461,7 @@ version = "0.1.0" source = "git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597#5f2c63266a065996d53f98156f0412782b468597" dependencies = [ "bcs", - "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", + "fastcrypto", "lazy_static", "num-bigint 0.4.6", "num-integer", @@ -4591,7 +4488,7 @@ dependencies = [ "blst", "byte-slice-cast", "derive_more 0.99.18", - "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", + "fastcrypto", "ff 0.13.0", "im", "itertools 0.12.1", @@ -5956,7 +5853,7 @@ dependencies = [ "datatest-stable", "diesel", "expect-test", - "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", + "fastcrypto", "fastcrypto-zkp", "fs_extra", "futures", @@ -6082,7 +5979,7 @@ dependencies = [ "clap", "csv", "eyre", - "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", + "fastcrypto", "gcp-bigquery-client", "iota-analytics-indexer-derive", "iota-config", @@ -6134,7 +6031,7 @@ dependencies = [ "byteorder", "bytes", "ed25519-consensus", - "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", + "fastcrypto", "futures", "indicatif", "iota-config", @@ -6265,7 +6162,7 @@ dependencies = [ "enum_dispatch", "ethers", "eyre", - "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", + "fastcrypto", "futures", "hex-literal 0.3.4", "iota-authority-aggregation", @@ -6287,7 +6184,7 @@ dependencies = [ "reqwest 0.12.7", "serde", "serde_json", - "serde_with 3.9.0", + "serde_with", "shared-crypto", "tap", "telemetry-subscribers", @@ -6306,7 +6203,7 @@ dependencies = [ "anyhow", "clap", "ethers", - "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", + "fastcrypto", "futures", "iota-bridge", "iota-config", @@ -6318,7 +6215,7 @@ dependencies = [ "reqwest 0.12.7", "serde", "serde_json", - "serde_with 3.9.0", + "serde_with", "shared-crypto", "telemetry-subscribers", "tokio", @@ -6364,7 +6261,7 @@ dependencies = [ "clap", "derive_more 1.0.0", "diesel", - "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", + "fastcrypto", "futures", "iota-config", "iota-core", @@ -6416,7 +6313,7 @@ dependencies = [ "consensus-config", "csv", "dirs 5.0.1", - "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", + "fastcrypto", "iota-genesis-common", "iota-keys", "iota-protocol-config", @@ -6427,7 +6324,7 @@ dependencies = [ "rand 0.8.5", "reqwest 0.12.7", "serde", - "serde_with 3.9.0", + "serde_with", "serde_yaml", "tracing", ] @@ -6455,7 +6352,7 @@ dependencies = [ "enum_dispatch", "expect-test", "eyre", - "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", + "fastcrypto", "fastcrypto-tbls", "fastcrypto-zkp", "fs_extra", @@ -6513,7 +6410,7 @@ dependencies = [ "serde", "serde-reflection", "serde_json", - "serde_with 3.9.0", + "serde_with", "serde_yaml", "shared-crypto", "signature 1.6.4", @@ -6662,7 +6559,7 @@ dependencies = [ "bip32", "clap", "coset", - "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", + "fastcrypto", "fastcrypto-zkp", "fs_extra", "futures", @@ -6856,7 +6753,7 @@ dependencies = [ "camino", "clap", "csv", - "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", + "fastcrypto", "flate2", "fs_extra", "iota-adapter-latest", @@ -6889,7 +6786,7 @@ dependencies = [ "schemars", "serde", "serde_json", - "serde_with 3.9.0", + "serde_with", "serde_yaml", "shared-crypto", "tempfile", @@ -6948,7 +6845,7 @@ dependencies = [ "downcast", "either", "expect-test", - "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", + "fastcrypto", "fastcrypto-zkp", "futures", "hex", @@ -6987,7 +6884,7 @@ dependencies = [ "reqwest 0.12.7", "serde", "serde_json", - "serde_with 3.9.0", + "serde_with", "serde_yaml", "serial_test", "shared-crypto", @@ -7044,7 +6941,7 @@ dependencies = [ "diesel", "diesel_migrations", "downcast", - "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", + "fastcrypto", "futures", "iota-config", "iota-data-ingestion-core", @@ -7077,7 +6974,7 @@ dependencies = [ "secrecy", "serde", "serde_json", - "serde_with 3.9.0", + "serde_with", "simulacrum", "tap", "telemetry-subscribers", @@ -7112,7 +7009,7 @@ version = "0.9.0-alpha" dependencies = [ "anyhow", "bcs", - "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", + "fastcrypto", "iota-framework", "iota-move-build", "iota-types", @@ -7137,7 +7034,7 @@ dependencies = [ "cached", "expect-test", "eyre", - "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", + "fastcrypto", "futures", "http-body 1.0.1", "hyper 1.4.1", @@ -7184,7 +7081,7 @@ name = "iota-json-rpc-api" version = "0.9.0-alpha" dependencies = [ "anyhow", - "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", + "fastcrypto", "iota-json", "iota-json-rpc-types", "iota-metrics", @@ -7244,7 +7141,7 @@ dependencies = [ "bcs", "colored", "enum_dispatch", - "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", + "fastcrypto", "iota-enum-compat-util", "iota-json", "iota-macros", @@ -7260,7 +7157,7 @@ dependencies = [ "schemars", "serde", "serde_json", - "serde_with 3.9.0", + "serde_with", "tabled", "tracing", ] @@ -7271,7 +7168,7 @@ version = "0.9.0-alpha" dependencies = [ "anyhow", "bip32", - "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", + "fastcrypto", "iota-types", "rand 0.8.5", "regex", @@ -7405,7 +7302,7 @@ name = "iota-move-build" version = "0.9.0-alpha" dependencies = [ "anyhow", - "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", + "fastcrypto", "iota-package-management", "iota-protocol-config", "iota-types", @@ -7438,7 +7335,7 @@ version = "0.1.0" dependencies = [ "bcs", "better_any", - "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", + "fastcrypto", "fastcrypto-vdf", "fastcrypto-zkp", "indexmap 2.5.0", @@ -7467,7 +7364,7 @@ dependencies = [ "bytes", "dashmap", "ed25519-consensus", - "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", + "fastcrypto", "fastcrypto-tbls", "futures", "governor", @@ -7529,7 +7426,7 @@ dependencies = [ "bin-version", "clap", "const-str", - "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", + "fastcrypto", "fastcrypto-zkp", "futures", "git-version", @@ -7572,7 +7469,7 @@ dependencies = [ "anyhow", "bcs", "clap", - "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", + "fastcrypto", "iota-json", "iota-json-rpc", "iota-json-rpc-api", @@ -7609,7 +7506,7 @@ dependencies = [ "bcs", "cynic", "cynic-codegen", - "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", + "fastcrypto", "iota-types", "move-core-types", "reqwest 0.12.7", @@ -7676,7 +7573,7 @@ dependencies = [ "move-vm-config", "schemars", "serde", - "serde_with 3.9.0", + "serde_with", "tracing", ] @@ -7700,7 +7597,7 @@ dependencies = [ "bytes", "clap", "const-str", - "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", + "fastcrypto", "futures", "git-version", "hex", @@ -7722,7 +7619,7 @@ dependencies = [ "rustls-pemfile 2.1.3", "serde", "serde_json", - "serde_with 3.9.0", + "serde_with", "serde_yaml", "snap", "telemetry-subscribers", @@ -7767,7 +7664,7 @@ dependencies = [ "regex", "serde", "serde_json", - "serde_with 3.9.0", + "serde_with", "serde_yaml", "shared-crypto", "shellexpand", @@ -7789,7 +7686,7 @@ dependencies = [ "axum", "bcs", "diffy", - "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", + "fastcrypto", "iota-network-stack", "iota-protocol-config", "iota-rust-sdk", @@ -7803,7 +7700,7 @@ dependencies = [ "schemars", "serde", "serde_json", - "serde_with 3.9.0", + "serde_with", "serde_yaml", "tap", "thiserror", @@ -7822,7 +7719,7 @@ dependencies = [ "bcs", "clap", "eyre", - "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", + "fastcrypto", "futures", "hyper 1.4.1", "iota-config", @@ -7894,7 +7791,7 @@ dependencies = [ "serde", "serde_derive", "serde_json", - "serde_with 3.9.0", + "serde_with", "winnow 0.6.20", ] @@ -7909,7 +7806,7 @@ dependencies = [ "clap", "colored", "dirs 5.0.1", - "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", + "fastcrypto", "futures", "futures-core", "getset", @@ -7928,7 +7825,7 @@ dependencies = [ "rustls 0.23.18", "serde", "serde_json", - "serde_with 3.9.0", + "serde_with", "shared-crypto", "tempfile", "thiserror", @@ -7983,7 +7880,7 @@ dependencies = [ "anemo", "anemo-tower", "bcs", - "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", + "fastcrypto", "iota-framework", "iota-move-build", "iota-types", @@ -8041,7 +7938,7 @@ dependencies = [ "bcs", "byteorder", "bytes", - "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", + "fastcrypto", "futures", "indicatif", "integer-encoding", @@ -8147,7 +8044,7 @@ dependencies = [ "chrono", "clap", "eyre", - "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", + "fastcrypto", "futures", "hyper 1.4.1", "hyper-rustls 0.27.3", @@ -8247,7 +8144,7 @@ dependencies = [ "anemo", "anyhow", "bcs", - "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", + "fastcrypto", "insta", "iota-config", "iota-execution", @@ -8260,7 +8157,7 @@ dependencies = [ "prometheus", "rand 0.8.5", "serde", - "serde_with 3.9.0", + "serde_with", "serde_yaml", "shared-crypto", "tempfile", @@ -8288,7 +8185,7 @@ dependencies = [ "axum", "axum-server", "ed25519 2.2.3", - "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", + "fastcrypto", "pkcs8 0.10.2", "rand 0.8.5", "rcgen", @@ -8314,7 +8211,7 @@ dependencies = [ "colored", "comfy-table", "eyre", - "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", + "fastcrypto", "futures", "hex", "indicatif", @@ -8387,7 +8284,7 @@ dependencies = [ "clap", "criterion", "eyre", - "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", + "fastcrypto", "futures", "iota-config", "iota-core", @@ -8444,7 +8341,7 @@ dependencies = [ "enum_dispatch", "expect-test", "eyre", - "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", + "fastcrypto", "fastcrypto-tbls", "fastcrypto-zkp", "hex", @@ -8490,7 +8387,7 @@ dependencies = [ "serde", "serde-name", "serde_json", - "serde_with 3.9.0", + "serde_with", "serde_yaml", "shared-crypto", "signature 1.6.4", @@ -8526,7 +8423,7 @@ version = "0.9.0-alpha" dependencies = [ "cfg-if", "ed25519-consensus", - "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", + "fastcrypto", "fastcrypto-tbls", "hashbrown 0.12.3", "impl-trait-for-tuples", @@ -9661,12 +9558,9 @@ name = "move-binary-format" version = "0.0.3" dependencies = [ "anyhow", - "arbitrary", "enum-compat-util", "move-core-types", "move-proc-macros", - "proptest", - "proptest-derive", "ref-cast", "serde", "variant_count", @@ -13619,22 +13513,6 @@ dependencies = [ "serde", ] -[[package]] -name = "serde_with" -version = "2.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07ff71d2c147a7b57362cead5e22f772cd52f6ab31cfcd9edcd7f6aeb2a0afbe" -dependencies = [ - "base64 0.13.1", - "chrono", - "hex", - "indexmap 1.9.3", - "serde", - "serde_json", - "serde_with_macros 2.3.3", - "time", -] - [[package]] name = "serde_with" version = "3.9.0" @@ -13649,22 +13527,10 @@ dependencies = [ "serde", "serde_derive", "serde_json", - "serde_with_macros 3.9.0", + "serde_with_macros", "time", ] -[[package]] -name = "serde_with_macros" -version = "2.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "881b6f881b17d13214e5d494c939ebab463d01264ce1811e9d4ac3a882e7695f" -dependencies = [ - "darling 0.20.10", - "proc-macro2", - "quote", - "syn 2.0.77", -] - [[package]] name = "serde_with_macros" version = "3.9.0" @@ -13807,7 +13673,7 @@ version = "0.9.0-alpha" dependencies = [ "bcs", "eyre", - "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", + "fastcrypto", "serde", "serde_repr", ] @@ -13944,7 +13810,7 @@ dependencies = [ "anyhow", "async-trait", "bcs", - "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", + "fastcrypto", "futures", "iota-config", "iota-execution", @@ -14745,7 +14611,7 @@ version = "0.9.0-alpha" dependencies = [ "anyhow", "bcs", - "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", + "fastcrypto", "fastcrypto-zkp", "futures", "iota-bridge", @@ -14893,24 +14759,6 @@ dependencies = [ "ordered-float", ] -[[package]] -name = "tic-tac-toe" -version = "0.1.0" -dependencies = [ - "anyhow", - "bcs", - "clap", - "dirs 5.0.1", - "fastcrypto 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", - "iota-keys", - "iota-sdk 0.9.0-alpha", - "iota-types", - "move-core-types", - "serde", - "shared-crypto", - "tokio", -] - [[package]] name = "time" version = "0.3.36" diff --git a/Cargo.toml b/Cargo.toml index be2b62e55c7..e91e9c7d489 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,9 @@ [workspace] resolver = "2" exclude = [ + "docs/examples/rust", + "examples/custom-indexer/rust", + "examples/tic-tac-toe/cli", "external-crates/move/crates/bytecode-interpreter-crypto", "external-crates/move/crates/bytecode-verifier-libfuzzer", "external-crates/move/crates/bytecode-verifier-prop-tests", @@ -152,9 +155,6 @@ members = [ "crates/typed-store-derive", "crates/typed-store-error", "crates/typed-store-workspace-hack", - "docs/examples/rust", - "examples/custom-indexer/rust", - "examples/tic-tac-toe/cli", "iota-execution", "iota-execution/cut", "iota-execution/latest/iota-adapter", diff --git a/docker/iota-bridge-indexer/Dockerfile b/docker/iota-bridge-indexer/Dockerfile index 77ac6a6f55c..893e366a264 100644 --- a/docker/iota-bridge-indexer/Dockerfile +++ b/docker/iota-bridge-indexer/Dockerfile @@ -24,7 +24,6 @@ RUN apt install -y libpq5 libpq-dev ca-certificates COPY consensus consensus COPY crates crates COPY docs docs -COPY examples examples COPY external-crates external-crates COPY iota-execution iota-execution COPY Cargo.toml Cargo.lock ./ diff --git a/docker/iota-data-ingestion/Dockerfile b/docker/iota-data-ingestion/Dockerfile index e0be2db651f..4f876076291 100644 --- a/docker/iota-data-ingestion/Dockerfile +++ b/docker/iota-data-ingestion/Dockerfile @@ -24,7 +24,6 @@ RUN apt install -y ca-certificates COPY consensus consensus COPY crates crates COPY docs docs -COPY examples examples COPY external-crates external-crates COPY iota-execution iota-execution COPY Cargo.toml Cargo.lock ./ diff --git a/docker/iota-graphql-rpc/Dockerfile b/docker/iota-graphql-rpc/Dockerfile index 71de8299bef..b23d4215768 100644 --- a/docker/iota-graphql-rpc/Dockerfile +++ b/docker/iota-graphql-rpc/Dockerfile @@ -24,7 +24,6 @@ RUN apt install -y libpq5 libpq-dev ca-certificates COPY consensus consensus COPY crates crates COPY docs docs -COPY examples examples COPY external-crates external-crates COPY iota-execution iota-execution COPY Cargo.toml Cargo.lock ./ diff --git a/docker/iota-indexer/Dockerfile b/docker/iota-indexer/Dockerfile index 735b721316a..8f352977a4b 100644 --- a/docker/iota-indexer/Dockerfile +++ b/docker/iota-indexer/Dockerfile @@ -24,7 +24,6 @@ RUN apt install -y libpq5 libpq-dev ca-certificates COPY consensus consensus COPY crates crates COPY docs docs -COPY examples examples COPY external-crates external-crates COPY iota-execution iota-execution COPY Cargo.toml Cargo.lock ./ diff --git a/docker/iota-node/Dockerfile b/docker/iota-node/Dockerfile index adb038e38ee..2c9e133c928 100644 --- a/docker/iota-node/Dockerfile +++ b/docker/iota-node/Dockerfile @@ -24,7 +24,6 @@ RUN apt install -y libpq5 libpq-dev ca-certificates COPY consensus consensus COPY crates crates COPY docs docs -COPY examples examples COPY external-crates external-crates COPY iota-execution iota-execution COPY Cargo.toml Cargo.lock ./ diff --git a/docker/iota-proxy/Dockerfile b/docker/iota-proxy/Dockerfile index af0ae00ff63..f1d55f82828 100644 --- a/docker/iota-proxy/Dockerfile +++ b/docker/iota-proxy/Dockerfile @@ -24,7 +24,6 @@ COPY .git/ .git/ COPY consensus consensus COPY crates crates COPY docs docs -COPY examples examples COPY external-crates external-crates COPY iota-execution iota-execution COPY Cargo.toml Cargo.lock ./ diff --git a/docker/iota-rosetta/Dockerfile b/docker/iota-rosetta/Dockerfile index 38c771cca2e..7eb5f1f6d2b 100644 --- a/docker/iota-rosetta/Dockerfile +++ b/docker/iota-rosetta/Dockerfile @@ -24,7 +24,6 @@ RUN apt install -y libpq5 libpq-dev ca-certificates COPY consensus consensus COPY crates crates COPY docs docs -COPY examples examples COPY external-crates external-crates COPY iota-execution iota-execution COPY Cargo.toml Cargo.lock ./ diff --git a/docker/iota-source-validation-service/Dockerfile b/docker/iota-source-validation-service/Dockerfile index dbc3a1f96b5..5d65e2b0cd4 100644 --- a/docker/iota-source-validation-service/Dockerfile +++ b/docker/iota-source-validation-service/Dockerfile @@ -24,7 +24,6 @@ RUN apt install -y libpq5 libpq-dev ca-certificates COPY consensus consensus COPY crates crates COPY docs docs -COPY examples examples COPY external-crates external-crates COPY iota-execution iota-execution COPY Cargo.toml Cargo.lock ./ diff --git a/docker/iota-tools/Dockerfile b/docker/iota-tools/Dockerfile index b2d12835b0d..145d13c5431 100644 --- a/docker/iota-tools/Dockerfile +++ b/docker/iota-tools/Dockerfile @@ -24,7 +24,6 @@ RUN apt install -y libpq5 libpq-dev ca-certificates COPY consensus consensus COPY crates crates COPY docs docs -COPY examples examples COPY external-crates external-crates COPY iota-execution iota-execution COPY Cargo.toml Cargo.lock ./ diff --git a/docker/iota/Dockerfile b/docker/iota/Dockerfile index d1f10350128..a2dcf6c33ff 100644 --- a/docker/iota/Dockerfile +++ b/docker/iota/Dockerfile @@ -24,7 +24,6 @@ RUN apt install -y libpq5 libpq-dev ca-certificates COPY consensus consensus COPY crates crates COPY docs docs -COPY examples examples COPY external-crates external-crates COPY iota-execution iota-execution COPY Cargo.toml Cargo.lock ./ diff --git a/docs/examples/rust/Cargo.lock b/docs/examples/rust/Cargo.lock new file mode 100644 index 00000000000..0a34984166e --- /dev/null +++ b/docs/examples/rust/Cargo.lock @@ -0,0 +1,8380 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "addchain" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b2e69442aa5628ea6951fa33e24efe8313f4321a91bd729fc2f75bdfc858570" +dependencies = [ + "num-bigint 0.3.3", + "num-integer", + "num-traits", +] + +[[package]] +name = "addr2line" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" + +[[package]] +name = "adler32" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234" + +[[package]] +name = "aead" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" +dependencies = [ + "crypto-common", + "generic-array", +] + +[[package]] +name = "aes" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures", +] + +[[package]] +name = "aes-gcm" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "831010a0f742e1209b3bcea8fab6a8e149051ba6099432c8cb2cc117dec3ead1" +dependencies = [ + "aead", + "aes", + "cipher", + "ctr", + "ghash", + "subtle", +] + +[[package]] +name = "ahash" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "aliasable" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "250f629c0161ad8107cf89319e990051fae62832fd343083bea452d93e2205fd" + +[[package]] +name = "alloc-no-stdlib" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" + +[[package]] +name = "alloc-stdlib" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" +dependencies = [ + "alloc-no-stdlib", +] + +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anemo" +version = "0.0.0" +source = "git+https://github.com/mystenlabs/anemo.git?rev=e609f7697ed6169bf0760882a0b6c032a57e4f3b#e609f7697ed6169bf0760882a0b6c032a57e4f3b" +dependencies = [ + "anyhow", + "async-trait", + "bincode", + "bytes", + "ed25519 1.5.3", + "futures", + "hex", + "http", + "matchit 0.5.0", + "pin-project-lite", + "pkcs8 0.9.0", + "quinn", + "quinn-proto", + "rand 0.8.5", + "rcgen", + "ring", + "rustls", + "rustls-webpki", + "serde", + "serde_json", + "socket2", + "tap", + "thiserror 1.0.69", + "tokio", + "tokio-util", + "tower 0.4.13", + "tracing", + "x509-parser", +] + +[[package]] +name = "anemo-tower" +version = "0.0.0" +source = "git+https://github.com/mystenlabs/anemo.git?rev=e609f7697ed6169bf0760882a0b6c032a57e4f3b#e609f7697ed6169bf0760882a0b6c032a57e4f3b" +dependencies = [ + "anemo", + "bytes", + "dashmap", + "futures", + "governor", + "nonzero_ext", + "pin-project-lite", + "tokio", + "tower 0.4.13", + "tracing", + "uuid", +] + +[[package]] +name = "anstream" +version = "0.6.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" + +[[package]] +name = "anstyle-parse" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" +dependencies = [ + "anstyle", + "once_cell", + "windows-sys 0.59.0", +] + +[[package]] +name = "anyhow" +version = "1.0.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04" +dependencies = [ + "backtrace", +] + +[[package]] +name = "arbitrary" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" +dependencies = [ + "derive_arbitrary", +] + +[[package]] +name = "ark-bls12-381" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c775f0d12169cba7aae4caeb547bb6a50781c7449a8aa53793827c9ec4abf488" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-serialize", + "ark-std", +] + +[[package]] +name = "ark-bn254" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a22f4561524cd949590d78d7d4c5df8f592430d221f7f3c9497bbafd8972120f" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-std", +] + +[[package]] +name = "ark-crypto-primitives" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3a13b34da09176a8baba701233fdffbaa7c1b1192ce031a3da4e55ce1f1a56" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-relations", + "ark-serialize", + "ark-snark", + "ark-std", + "blake2", + "derivative", + "digest 0.10.7", + "sha2 0.10.8", +] + +[[package]] +name = "ark-ec" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "defd9a439d56ac24968cca0571f598a61bc8c55f71d50a89cda591cb750670ba" +dependencies = [ + "ark-ff", + "ark-poly", + "ark-serialize", + "ark-std", + "derivative", + "hashbrown 0.13.2", + "itertools 0.10.5", + "num-traits", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" +dependencies = [ + "ark-ff-asm", + "ark-ff-macros", + "ark-serialize", + "ark-std", + "derivative", + "digest 0.10.7", + "itertools 0.10.5", + "num-bigint 0.4.6", + "num-traits", + "paste", + "rustc_version", + "zeroize", +] + +[[package]] +name = "ark-ff-asm" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" +dependencies = [ + "num-bigint 0.4.6", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-groth16" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20ceafa83848c3e390f1cbf124bc3193b3e639b3f02009e0e290809a501b95fc" +dependencies = [ + "ark-crypto-primitives", + "ark-ec", + "ark-ff", + "ark-poly", + "ark-relations", + "ark-serialize", + "ark-std", +] + +[[package]] +name = "ark-poly" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d320bfc44ee185d899ccbadfa8bc31aab923ce1558716e1997a1e74057fe86bf" +dependencies = [ + "ark-ff", + "ark-serialize", + "ark-std", + "derivative", + "hashbrown 0.13.2", +] + +[[package]] +name = "ark-relations" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00796b6efc05a3f48225e59cb6a2cda78881e7c390872d5786aaf112f31fb4f0" +dependencies = [ + "ark-ff", + "ark-std", + "tracing", +] + +[[package]] +name = "ark-secp256r1" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3975a01b0a6e3eae0f72ec7ca8598a6620fc72fa5981f6f5cca33b7cd788f633" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-std", +] + +[[package]] +name = "ark-serialize" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" +dependencies = [ + "ark-serialize-derive", + "ark-std", + "digest 0.10.7", + "num-bigint 0.4.6", +] + +[[package]] +name = "ark-serialize-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae3281bc6d0fd7e549af32b52511e1302185bd688fd3359fa36423346ff682ea" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-snark" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84d3cc6833a335bb8a600241889ead68ee89a3cf8448081fb7694c0fe503da63" +dependencies = [ + "ark-ff", + "ark-relations", + "ark-serialize", + "ark-std", +] + +[[package]] +name = "ark-std" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" +dependencies = [ + "num-traits", + "rand 0.8.5", +] + +[[package]] +name = "arrayref" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" + +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + +[[package]] +name = "asn1-rs" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f6fd5ddaf0351dff5b8da21b2fb4ff8e08ddd02857f0bf69c47639106c0fff0" +dependencies = [ + "asn1-rs-derive", + "asn1-rs-impl", + "displaydoc", + "nom", + "num-traits", + "rusticata-macros", + "thiserror 1.0.69", + "time", +] + +[[package]] +name = "asn1-rs-derive" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "726535892e8eae7e70657b4c8ea93d26b8553afb1ce617caee529ef96d7dee6c" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "synstructure 0.12.6", +] + +[[package]] +name = "asn1-rs-impl" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2777730b2039ac0f95f093556e61b6d26cebed5393ca6f152717777cec3a42ed" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "async-compression" +version = "0.4.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df895a515f70646414f4b45c0b79082783b80552b373a68283012928df56f522" +dependencies = [ + "brotli", + "flate2", + "futures-core", + "memchr", + "pin-project-lite", + "tokio", + "zstd", + "zstd-safe", +] + +[[package]] +name = "async-stream" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" +dependencies = [ + "async-stream-impl", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-stream-impl" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", +] + +[[package]] +name = "async-trait" +version = "0.1.85" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f934833b4b7233644e5848f235df3f57ed8c80f1528a26c3dfa13d2147fa056" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "auto_ops" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7460f7dd8e100147b82a63afca1a20eb6c231ee36b90ba7272e14951cb58af59" + +[[package]] +name = "autocfg" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" + +[[package]] +name = "axum" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71f" +dependencies = [ + "async-trait", + "axum-core", + "base64 0.22.1", + "bytes", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-util", + "itoa", + "matchit 0.7.3", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "rustversion", + "serde", + "serde_json", + "serde_path_to_error", + "serde_urlencoded", + "sha1", + "sync_wrapper", + "tokio", + "tokio-tungstenite", + "tower 0.5.2", + "tower-layer", + "tower-service", +] + +[[package]] +name = "axum-core" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199" +dependencies = [ + "async-trait", + "bytes", + "futures-util", + "http", + "http-body", + "http-body-util", + "mime", + "pin-project-lite", + "rustversion", + "sync_wrapper", + "tower-layer", + "tower-service", +] + +[[package]] +name = "backtrace" +version = "0.3.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-targets 0.52.6", +] + +[[package]] +name = "base-x" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cbbc9d0964165b47557570cce6c952866c2678457aca742aafc9fb771d30270" + +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + +[[package]] +name = "base64" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "base64ct" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" + +[[package]] +name = "bcs" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85b6598a2f5d564fb7855dc6b06fd1c38cff5a72bd8b863a4d021938497b440a" +dependencies = [ + "serde", + "thiserror 1.0.69", +] + +[[package]] +name = "bech32" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" + +[[package]] +name = "bellpepper" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ae286c2cb403324ab644c7cc68dceb25fe52ca9429908a726d7ed272c1edf7b" +dependencies = [ + "bellpepper-core", + "byteorder", + "ff", +] + +[[package]] +name = "bellpepper-core" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d8abb418570756396d722841b19edfec21d4e89e1cf8990610663040ecb1aea" +dependencies = [ + "blake2s_simd", + "byteorder", + "ff", + "serde", + "thiserror 1.0.69", +] + +[[package]] +name = "better_any" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b359aebd937c17c725e19efcb661200883f04c49c53e7132224dac26da39d4a0" +dependencies = [ + "better_typeid_derive", +] + +[[package]] +name = "better_typeid_derive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3deeecb812ca5300b7d3f66f730cc2ebd3511c3d36c691dd79c165d5b19a26e3" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + +[[package]] +name = "bip32" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa13fae8b6255872fd86f7faf4b41168661d7d78609f7bfe6771b85c6739a15b" +dependencies = [ + "bs58 0.5.1", + "hmac", + "k256", + "once_cell", + "pbkdf2 0.12.2", + "rand_core 0.6.4", + "ripemd", + "sha2 0.10.8", + "subtle", + "zeroize", +] + +[[package]] +name = "bit-set" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" + +[[package]] +name = "bitcoin-private" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73290177011694f38ec25e165d0387ab7ea749a4b81cd4c80dae5988229f7a57" + +[[package]] +name = "bitcoin_hashes" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d7066118b13d4b20b23645932dfb3a81ce7e29f95726c2036fa33cd7b092501" +dependencies = [ + "bitcoin-private", +] + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" + +[[package]] +name = "bitmaps" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "031043d04099746d8db04daf1fa424b2bc8bd69d92b25962dcde24da39ab64a2" +dependencies = [ + "typenum", +] + +[[package]] +name = "bitvec" +version = "0.20.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7774144344a4faa177370406a7ff5f1da24303817368584c6206c8303eb07848" +dependencies = [ + "funty 1.1.0", + "radium 0.6.2", + "tap", + "wyz 0.2.0", +] + +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty 2.0.0", + "radium 0.7.0", + "tap", + "wyz 0.5.1", +] + +[[package]] +name = "blake2" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" +dependencies = [ + "digest 0.10.7", +] + +[[package]] +name = "blake2b_simd" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23285ad32269793932e830392f2fe2f83e26488fd3ec778883a93c8323735780" +dependencies = [ + "arrayref", + "arrayvec", + "constant_time_eq 0.3.1", +] + +[[package]] +name = "blake2s_simd" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94230421e395b9920d23df13ea5d77a20e1725331f90fbbf6df6040b33f756ae" +dependencies = [ + "arrayref", + "arrayvec", + "constant_time_eq 0.3.1", +] + +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "block-padding 0.2.1", + "generic-array", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block-padding" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae" + +[[package]] +name = "block-padding" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8894febbff9f758034a5b8e12d87918f56dfc64a8e1fe757d65e29041538d93" +dependencies = [ + "generic-array", +] + +[[package]] +name = "blst" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4378725facc195f1a538864863f6de233b500a8862747e7f165078a419d5e874" +dependencies = [ + "cc", + "glob", + "threadpool", + "zeroize", +] + +[[package]] +name = "blstrs" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a8a8ed6fefbeef4a8c7b460e4110e12c5e22a5b7cf32621aae6ad650c4dcf29" +dependencies = [ + "blst", + "byte-slice-cast", + "ff", + "group", + "pairing", + "rand_core 0.6.4", + "serde", + "subtle", +] + +[[package]] +name = "bnum" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e31ea183f6ee62ac8b8a8cf7feddd766317adfb13ff469de57ce033efd6a790" + +[[package]] +name = "brotli" +version = "7.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc97b8f16f944bba54f0433f07e30be199b6dc2bd25937444bbad560bcea29bd" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "4.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74fa05ad7d803d413eb8380983b092cbbaf9a85f151b871360e7b00cd7060b37" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] + +[[package]] +name = "bs58" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "771fe0050b883fcc3ea2359b1a96bcfbc090b7116eae7c3c512c7a083fdf23d3" + +[[package]] +name = "bs58" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" +dependencies = [ + "sha2 0.10.8", + "tinyvec", +] + +[[package]] +name = "bumpalo" +version = "3.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" + +[[package]] +name = "byte-slice-cast" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3ac9f8b63eca6fd385229b3675f6cc0dc5c8a5c8a54a59d4f52ffd670d87b0c" + +[[package]] +name = "bytecount" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ce89b21cab1437276d2650d57e971f9d548a2d9037cc231abdc0562b97498ce" + +[[package]] +name = "bytemuck" +version = "1.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef657dfab802224e671f5818e9a4935f9b1957ed18e58292690cc39e7a4092a3" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" +dependencies = [ + "serde", +] + +[[package]] +name = "cbc" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26b52a9543ae338f279b96b0b9fed9c8093744685043739079ce85cd58f289a6" +dependencies = [ + "cipher", +] + +[[package]] +name = "cc" +version = "1.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13208fcbb66eaeffe09b99fffbe1af420f00a7b35aa99ad683dfc1aa76145229" +dependencies = [ + "jobserver", + "libc", + "shlex", +] + +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] +name = "chacha20" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3613f74bd2eac03dad61bd53dbe620703d4371614fe0bc3b9f04dd36fe4e818" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures", +] + +[[package]] +name = "chacha20poly1305" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10cd79432192d1c0f4e1a0fef9527696cc039165d729fb41b3f4f4f354c2dc35" +dependencies = [ + "aead", + "chacha20", + "cipher", + "poly1305", + "zeroize", +] + +[[package]] +name = "chrono" +version = "0.4.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "js-sys", + "num-traits", + "serde", + "wasm-bindgen", + "windows-targets 0.52.6", +] + +[[package]] +name = "ciborium" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" +dependencies = [ + "ciborium-io", + "ciborium-ll", + "serde", +] + +[[package]] +name = "ciborium-io" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" + +[[package]] +name = "ciborium-ll" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" +dependencies = [ + "ciborium-io", + "half", +] + +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common", + "inout", + "zeroize", +] + +[[package]] +name = "clap" +version = "4.5.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "769b0145982b4b48713e01ec42d61614425f27b7058bda7180a3a41f30104796" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.5.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b26884eb4b57140e4d2d93652abfa49498b938b3c9179f9fc487b0acc3edad7" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim 0.11.1", + "terminal_size", +] + +[[package]] +name = "clap_derive" +version = "4.5.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54b755194d6389280185988721fffba69495eed5ee9feeee9a599b53db80318c" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.96", +] + +[[package]] +name = "clap_lex" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" + +[[package]] +name = "codespan" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3362992a0d9f1dd7c3d0e89e0ab2bb540b7a95fea8cd798090e758fda2899b5e" +dependencies = [ + "codespan-reporting", + "serde", +] + +[[package]] +name = "codespan-reporting" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" +dependencies = [ + "serde", + "termcolor", + "unicode-width", +] + +[[package]] +name = "colorchoice" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" + +[[package]] +name = "colored" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "117725a109d387c937a1533ce01b450cbde6b88abceea8473c4d7a85853cda3c" +dependencies = [ + "lazy_static", + "windows-sys 0.59.0", +] + +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "consensus-config" +version = "0.1.0" +dependencies = [ + "fastcrypto", + "iota-network-stack", + "rand 0.8.5", + "serde", + "shared-crypto", +] + +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "constant_time_eq" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" + +[[package]] +name = "constant_time_eq" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" + +[[package]] +name = "convert_case" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "core2" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b49ba7ef1ad6107f8824dbe97de947cbaac53c44e7f9756a1fba0d37c1eec505" +dependencies = [ + "memchr", +] + +[[package]] +name = "coset" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8cc80f631f8307b887faca24dcc3abc427cd0367f6eb6188f6e8f5b7ad8fb" +dependencies = [ + "ciborium", + "ciborium-io", +] + +[[package]] +name = "cpufeatures" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" + +[[package]] +name = "crypto-bigint" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +dependencies = [ + "generic-array", + "rand_core 0.6.4", + "subtle", + "zeroize", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "rand_core 0.6.4", + "typenum", +] + +[[package]] +name = "csv" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acdc4883a9c96732e4733212c01447ebd805833b7275a73ca3ee080fd77afdaf" +dependencies = [ + "csv-core", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "csv-core" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5efa2b3d7902f4b634a20cae3c9c4e6209dc4779feb6863329607560143efa70" +dependencies = [ + "memchr", +] + +[[package]] +name = "ctr" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" +dependencies = [ + "cipher", +] + +[[package]] +name = "curve25519-dalek" +version = "4.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" +dependencies = [ + "cfg-if", + "cpufeatures", + "curve25519-dalek-derive", + "digest 0.10.7", + "fiat-crypto", + "rustc_version", + "subtle", + "zeroize", +] + +[[package]] +name = "curve25519-dalek-derive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", +] + +[[package]] +name = "curve25519-dalek-ng" +version = "4.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c359b7249347e46fb28804470d071c921156ad62b3eef5d34e2ba867533dec8" +dependencies = [ + "byteorder", + "digest 0.9.0", + "rand_core 0.6.4", + "subtle-ng", + "zeroize", +] + +[[package]] +name = "darling" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b750cb3417fd1b327431a470f388520309479ab0bf5e323505daf0290cd3850" +dependencies = [ + "darling_core 0.14.4", + "darling_macro 0.14.4", +] + +[[package]] +name = "darling" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" +dependencies = [ + "darling_core 0.20.10", + "darling_macro 0.20.10", +] + +[[package]] +name = "darling_core" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "109c1ca6e6b7f82cc233a97004ea8ed7ca123a9af07a8230878fcfda9b158bf0" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim 0.10.0", + "syn 1.0.109", +] + +[[package]] +name = "darling_core" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim 0.11.1", + "syn 2.0.96", +] + +[[package]] +name = "darling_macro" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4aab4dbc9f7611d8b55048a3a16d2d010c2c8334e46304b40ac1cc14bf3b48e" +dependencies = [ + "darling_core 0.14.4", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "darling_macro" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" +dependencies = [ + "darling_core 0.20.10", + "quote", + "syn 2.0.96", +] + +[[package]] +name = "dary_heap" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04d2cd9c18b9f454ed67da600630b021a8a80bf33f8c95896ab33aaf1c26b728" + +[[package]] +name = "dashmap" +version = "5.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" +dependencies = [ + "cfg-if", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core 0.9.10", +] + +[[package]] +name = "data-encoding" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e60eed09d8c01d3cee5b7d30acb059b76614c918fa0f992e0dd6eeb10daad6f" + +[[package]] +name = "data-encoding-macro" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b16d9d0d88a5273d830dac8b78ceb217ffc9b1d5404e5597a3542515329405b" +dependencies = [ + "data-encoding", + "data-encoding-macro-internal", +] + +[[package]] +name = "data-encoding-macro-internal" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1145d32e826a7748b69ee8fc62d3e6355ff7f1051df53141e7048162fc90481b" +dependencies = [ + "data-encoding", + "syn 2.0.96", +] + +[[package]] +name = "der" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1a467a65c5e759bce6e65eaf91cc29f466cdc57cb65777bd646872a8a1fd4de" +dependencies = [ + "const-oid", + "pem-rfc7468 0.6.0", + "zeroize", +] + +[[package]] +name = "der" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" +dependencies = [ + "const-oid", + "pem-rfc7468 0.7.0", + "zeroize", +] + +[[package]] +name = "der-parser" +version = "8.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbd676fbbab537128ef0278adb5576cf363cff6aa22a7b24effe97347cfab61e" +dependencies = [ + "asn1-rs", + "displaydoc", + "nom", + "num-bigint 0.4.6", + "num-traits", + "rusticata-macros", +] + +[[package]] +name = "deranged" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +dependencies = [ + "powerfmt", + "serde", +] + +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "derive-syn-parse" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e79116f119dd1dba1abf1f3405f03b9b0e79a27a3883864bfebded8a3dc768cd" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "derive_arbitrary" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30542c1ad912e0e3d22a1935c290e12e8a29d704a420177a31faad4a601a0800" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", +] + +[[package]] +name = "derive_more" +version = "0.99.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "rustc_version", + "syn 2.0.96", +] + +[[package]] +name = "derive_more" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05" +dependencies = [ + "derive_more-impl", +] + +[[package]] +name = "derive_more-impl" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", + "unicode-xid", +] + +[[package]] +name = "difference" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524cbf6897b527295dff137cec09ecf3a05f4fddffd7dfcd1585403449e74198" + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer 0.10.4", + "const-oid", + "crypto-common", + "subtle", +] + +[[package]] +name = "dirs" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059" +dependencies = [ + "dirs-sys 0.3.7", +] + +[[package]] +name = "dirs" +version = "5.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" +dependencies = [ + "dirs-sys 0.4.1", +] + +[[package]] +name = "dirs-next" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" +dependencies = [ + "cfg-if", + "dirs-sys-next", +] + +[[package]] +name = "dirs-sys" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + +[[package]] +name = "dirs-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.48.0", +] + +[[package]] +name = "dirs-sys-next" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", +] + +[[package]] +name = "doc-comment" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" + +[[package]] +name = "docs-examples" +version = "0.1.0" +dependencies = [ + "anyhow", + "bcs", + "bip32", + "iota-keys", + "iota-move-build", + "iota-sdk 0.9.0-alpha", + "move-binary-format", + "move-core-types", + "serde_json", + "shared-crypto", + "tokio", +] + +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + +[[package]] +name = "dyn-clone" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125" + +[[package]] +name = "ecdsa" +version = "0.16.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" +dependencies = [ + "der 0.7.9", + "digest 0.10.7", + "elliptic-curve", + "rfc6979", + "serdect", + "signature 2.2.0", + "spki 0.7.3", +] + +[[package]] +name = "ed25519" +version = "1.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91cff35c70bba8a626e3185d8cd48cc11b5437e1a5bcd15b9b5fa3c64b6dfee7" +dependencies = [ + "pkcs8 0.9.0", + "signature 1.6.4", + "zeroize", +] + +[[package]] +name = "ed25519" +version = "2.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" +dependencies = [ + "serde", + "signature 2.2.0", +] + +[[package]] +name = "ed25519-consensus" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c8465edc8ee7436ffea81d21a019b16676ee3db267aa8d5a8d729581ecf998b" +dependencies = [ + "curve25519-dalek-ng", + "hex", + "rand_core 0.6.4", + "serde", + "sha2 0.9.9", + "thiserror 1.0.69", + "zeroize", +] + +[[package]] +name = "ed25519-zebra" +version = "4.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d9ce6874da5d4415896cd45ffbc4d1cfc0c4f9c079427bd870742c30f2f65a9" +dependencies = [ + "curve25519-dalek", + "ed25519 2.2.3", + "hashbrown 0.14.5", + "hex", + "rand_core 0.6.4", + "serde", + "sha2 0.10.8", + "zeroize", +] + +[[package]] +name = "either" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" + +[[package]] +name = "elliptic-curve" +version = "0.13.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +dependencies = [ + "base16ct", + "crypto-bigint", + "digest 0.10.7", + "ff", + "generic-array", + "group", + "pem-rfc7468 0.7.0", + "pkcs8 0.10.2", + "rand_core 0.6.4", + "sec1", + "serdect", + "subtle", + "zeroize", +] + +[[package]] +name = "enum-compat-util" +version = "0.1.0" +dependencies = [ + "serde_yaml", +] + +[[package]] +name = "enum_dispatch" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa18ce2bc66555b3218614519ac839ddb759a7d6720732f979ef8d13be147ecd" +dependencies = [ + "once_cell", + "proc-macro2", + "quote", + "syn 2.0.96", +] + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "errno" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + +[[package]] +name = "ethnum" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b90ca2580b73ab6a1f724b76ca11ab632df820fd6040c336200d2c1df7b3c82c" + +[[package]] +name = "eyre" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec" +dependencies = [ + "indenter", + "once_cell", +] + +[[package]] +name = "fail" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3be3c61c59fdc91f5dbc3ea31ee8623122ce80057058be560654c5d410d181a6" +dependencies = [ + "lazy_static", + "log", + "rand 0.7.3", +] + +[[package]] +name = "fastcrypto" +version = "0.1.8" +source = "git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597#5f2c63266a065996d53f98156f0412782b468597" +dependencies = [ + "aes", + "aes-gcm", + "ark-ec", + "ark-ff", + "ark-secp256r1", + "ark-serialize", + "auto_ops", + "base64ct", + "bech32", + "bincode", + "blake2", + "blst", + "bs58 0.4.0", + "cbc", + "ctr", + "curve25519-dalek-ng", + "derive_more 0.99.18", + "digest 0.10.7", + "ecdsa", + "ed25519-consensus", + "elliptic-curve", + "fastcrypto-derive", + "generic-array", + "hex", + "hex-literal", + "hkdf", + "lazy_static", + "num-bigint 0.4.6", + "once_cell", + "p256", + "rand 0.8.5", + "readonly", + "rfc6979", + "rsa", + "schemars", + "secp256k1", + "serde", + "serde_json", + "serde_with", + "sha2 0.10.8", + "sha3 0.10.8", + "signature 2.2.0", + "static_assertions", + "thiserror 1.0.69", + "tokio", + "typenum", + "zeroize", +] + +[[package]] +name = "fastcrypto-derive" +version = "0.1.3" +source = "git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597#5f2c63266a065996d53f98156f0412782b468597" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "fastcrypto-tbls" +version = "0.1.0" +source = "git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597#5f2c63266a065996d53f98156f0412782b468597" +dependencies = [ + "bcs", + "digest 0.10.7", + "fastcrypto", + "hex", + "itertools 0.10.5", + "rand 0.8.5", + "serde", + "sha3 0.10.8", + "tap", + "tracing", + "typenum", + "zeroize", +] + +[[package]] +name = "fastcrypto-vdf" +version = "0.1.0" +source = "git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597#5f2c63266a065996d53f98156f0412782b468597" +dependencies = [ + "bcs", + "fastcrypto", + "lazy_static", + "num-bigint 0.4.6", + "num-integer", + "num-prime", + "num-traits", + "rand 0.8.5", + "rand_chacha 0.3.1", + "serde", +] + +[[package]] +name = "fastcrypto-zkp" +version = "0.1.3" +source = "git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597#5f2c63266a065996d53f98156f0412782b468597" +dependencies = [ + "ark-bls12-381", + "ark-bn254", + "ark-ec", + "ark-ff", + "ark-groth16", + "ark-relations", + "ark-serialize", + "ark-snark", + "blst", + "byte-slice-cast", + "derive_more 0.99.18", + "fastcrypto", + "ff", + "im", + "itertools 0.12.1", + "lazy_static", + "neptune", + "num-bigint 0.4.6", + "once_cell", + "regex", + "reqwest", + "schemars", + "serde", + "serde_json", + "typenum", +] + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[package]] +name = "ff" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" +dependencies = [ + "bitvec 1.0.1", + "byteorder", + "ff_derive", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "ff_derive" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9f54704be45ed286151c5e11531316eaef5b8f5af7d597b806fdb8af108d84a" +dependencies = [ + "addchain", + "cfg-if", + "num-bigint 0.3.3", + "num-integer", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "fiat-crypto" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" + +[[package]] +name = "filetime" +version = "0.2.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35c0522e981e68cbfa8c3f978441a5f34b30b96e146b33cd3359176b50fe8586" +dependencies = [ + "cfg-if", + "libc", + "libredox", + "windows-sys 0.59.0", +] + +[[package]] +name = "fixed-hash" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcf0ed7fe52a17a03854ec54a9f76d6d84508d1c0e66bc1793301c73fc8493c" +dependencies = [ + "byteorder", + "rand 0.8.5", + "rustc-hex", + "static_assertions", +] + +[[package]] +name = "fixed-hash" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" +dependencies = [ + "byteorder", + "rand 0.8.5", + "rustc-hex", + "static_assertions", +] + +[[package]] +name = "fixedbitset" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37ab347416e802de484e4d03c7316c48f1ecb56574dfd4a46a80f173ce1de04d" + +[[package]] +name = "flate2" +version = "1.0.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foldhash" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0d2fde1f7b3d48b8395d5f2de76c18a528bd6a9cdde438df747bfcba3e05d6f" + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "funty" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fed34cd105917e91daa4da6b3728c47b068749d6a62c59811f06ed2ac71d9da7" + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[package]] +name = "futures" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-executor" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + +[[package]] +name = "futures-macro" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", +] + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-timer" +version = "3.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" +dependencies = [ + "gloo-timers 0.2.6", + "send_wrapper", +] + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "serde", + "typenum", + "version_check", + "zeroize", +] + +[[package]] +name = "getrandom" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.9.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", + "wasm-bindgen", +] + +[[package]] +name = "getset" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eded738faa0e88d3abc9d1a13cb11adc2073c400969eeb8793cf7132589959fc" +dependencies = [ + "proc-macro-error2", + "proc-macro2", + "quote", + "syn 2.0.96", +] + +[[package]] +name = "ghash" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0d8a4362ccb29cb0b265253fb0a2728f592895ee6854fd9bc13f2ffda266ff1" +dependencies = [ + "opaque-debug", + "polyval", +] + +[[package]] +name = "gimli" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" + +[[package]] +name = "glob" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" + +[[package]] +name = "gloo-net" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06f627b1a58ca3d42b45d6104bf1e1a03799df472df00988b6ba21accc10580" +dependencies = [ + "futures-channel", + "futures-core", + "futures-sink", + "gloo-utils", + "http", + "js-sys", + "pin-project", + "serde", + "serde_json", + "thiserror 1.0.69", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "gloo-timers" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b995a66bb87bebce9a0f4a95aed01daca4872c050bfcb21653361c03bc35e5c" +dependencies = [ + "futures-channel", + "futures-core", + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "gloo-timers" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbb143cf96099802033e0d4f4963b19fd2e0b728bcf076cd9cf7f6634f092994" +dependencies = [ + "futures-channel", + "futures-core", + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "gloo-utils" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b5555354113b18c547c1d3a98fbf7fb32a9ff4f6fa112ce823a21641a0ba3aa" +dependencies = [ + "js-sys", + "serde", + "serde_json", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "governor" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68a7f542ee6b35af73b06abc0dad1c1bae89964e4e253bc4b587b91c9637867b" +dependencies = [ + "cfg-if", + "dashmap", + "futures", + "futures-timer", + "no-std-compat", + "nonzero_ext", + "parking_lot 0.12.3", + "portable-atomic", + "quanta", + "rand 0.8.5", + "smallvec", + "spinning_top", +] + +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff", + "rand 0.8.5", + "rand_core 0.6.4", + "rand_xorshift", + "subtle", +] + +[[package]] +name = "h2" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccae279728d634d083c00f6099cb58f01cc99c145b84b8be2f6c74618d79922e" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http", + "indexmap 2.7.1", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "half" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" +dependencies = [ + "cfg-if", + "crunchy", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +dependencies = [ + "ahash", +] + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +dependencies = [ + "ahash", + "allocator-api2", + "serde", +] + +[[package]] +name = "hashbrown" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", +] + +[[package]] +name = "hdrhistogram" +version = "7.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "765c9198f173dd59ce26ff9f95ef0aafd0a0fe01fb9d72841bc5066a4c06511d" +dependencies = [ + "byteorder", + "num-traits", +] + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +dependencies = [ + "serde", +] + +[[package]] +name = "hex-literal" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" + +[[package]] +name = "hkdf" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" +dependencies = [ + "hmac", +] + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest 0.10.7", +] + +[[package]] +name = "hmac-sha512" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77e806677ce663d0a199541030c816847b36e8dc095f70dae4a4f4ad63da5383" + +[[package]] +name = "http" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" +dependencies = [ + "bytes", + "futures-util", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "http-range-header" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9171a2ea8a68358193d15dd5d70c1c10a2afc3e7e4c5bc92bc9f025cebd7359c" + +[[package]] +name = "httparse" +version = "1.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "humantime" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" + +[[package]] +name = "hyper" +version = "1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "256fb8d4bd6413123cc9d91832d78325c48ff41677595be797d90f42969beae0" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" +dependencies = [ + "futures-util", + "http", + "hyper", + "hyper-util", + "log", + "rustls", + "rustls-native-certs 0.8.1", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tower-service", + "webpki-roots", +] + +[[package]] +name = "hyper-timeout" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b90d566bffbce6a75bd8b09a05aa8c2cb1fabb6cb348f8840c9e4c90a0d83b0" +dependencies = [ + "hyper", + "hyper-util", + "pin-project-lite", + "tokio", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "hyper", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "icu_collections" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locid" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_locid_transform" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_locid_transform_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_locid_transform_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" + +[[package]] +name = "icu_normalizer" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" + +[[package]] +name = "icu_properties" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locid_transform", + "icu_properties_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" + +[[package]] +name = "icu_provider" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_provider_macros", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_provider_macros" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "im" +version = "15.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0acd33ff0285af998aaf9b57342af478078f53492322fafc47450e09397e0e9" +dependencies = [ + "bitmaps", + "rand_core 0.6.4", + "rand_xoshiro", + "sized-chunks", + "typenum", + "version_check", +] + +[[package]] +name = "impl-codec" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "161ebdfec3c8e3b52bf61c4f3550a1eea4f9579d10dc1b936f3171ebdcd6c443" +dependencies = [ + "parity-scale-codec 2.3.1", +] + +[[package]] +name = "impl-codec" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" +dependencies = [ + "parity-scale-codec 3.6.12", +] + +[[package]] +name = "impl-serde" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4551f042f3438e64dbd6226b20527fc84a6e1fe65688b58746a2f53623f25f5c" +dependencies = [ + "serde", +] + +[[package]] +name = "impl-serde" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc88fc67028ae3db0c853baa36269d398d5f45b6982f95549ff5def78c935cd" +dependencies = [ + "serde", +] + +[[package]] +name = "impl-trait-for-tuples" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0eb5a3343abf848c0984fe4604b2b105da9539376e24fc0a3b0007411ae4fd9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", +] + +[[package]] +name = "indenter" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + +[[package]] +name = "indexmap" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652" +dependencies = [ + "equivalent", + "hashbrown 0.15.2", + "serde", +] + +[[package]] +name = "inout" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" +dependencies = [ + "block-padding 0.3.3", + "generic-array", +] + +[[package]] +name = "instant" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "iota-adapter-latest" +version = "0.1.0" +dependencies = [ + "anyhow", + "bcs", + "iota-macros", + "iota-metrics", + "iota-move-natives-latest", + "iota-protocol-config", + "iota-types", + "iota-verifier-latest", + "leb128", + "move-binary-format", + "move-bytecode-utils", + "move-bytecode-verifier", + "move-bytecode-verifier-meter", + "move-core-types", + "move-vm-config", + "move-vm-profiler", + "move-vm-runtime", + "move-vm-types", + "parking_lot 0.12.3", + "serde", + "tracing", +] + +[[package]] +name = "iota-config" +version = "0.9.0-alpha" +dependencies = [ + "anemo", + "anyhow", + "bcs", + "clap", + "consensus-config", + "csv", + "dirs 5.0.1", + "fastcrypto", + "iota-genesis-common", + "iota-keys", + "iota-protocol-config", + "iota-types", + "object_store", + "once_cell", + "prometheus", + "rand 0.8.5", + "reqwest", + "serde", + "serde_with", + "serde_yaml", + "tracing", +] + +[[package]] +name = "iota-crypto" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98a38db844c910d78825e173c083f2ef416b69cb091bba8ac1055763c6db065b" +dependencies = [ + "aead", + "aes", + "aes-gcm", + "autocfg", + "base64 0.21.7", + "blake2", + "chacha20poly1305", + "cipher", + "curve25519-dalek", + "digest 0.10.7", + "ed25519-zebra", + "generic-array", + "getrandom 0.2.15", + "hkdf", + "hmac", + "iterator-sorted 0.1.0", + "k256", + "num-traits", + "pbkdf2 0.12.2", + "rand 0.8.5", + "scrypt", + "serde", + "sha2 0.10.8", + "tiny-keccak", + "unicode-normalization", + "x25519-dalek", + "zeroize", +] + +[[package]] +name = "iota-enum-compat-util" +version = "0.9.0-alpha" +dependencies = [ + "serde_yaml", +] + +[[package]] +name = "iota-execution" +version = "0.1.0" +dependencies = [ + "iota-adapter-latest", + "iota-move-natives-latest", + "iota-protocol-config", + "iota-types", + "iota-verifier-latest", + "move-binary-format", + "move-bytecode-verifier", + "move-bytecode-verifier-meter", + "move-vm-config", + "move-vm-runtime", +] + +[[package]] +name = "iota-genesis-common" +version = "0.9.0-alpha" +dependencies = [ + "iota-execution", + "iota-protocol-config", + "iota-types", + "prometheus", +] + +[[package]] +name = "iota-json" +version = "0.9.0-alpha" +dependencies = [ + "anyhow", + "bcs", + "fastcrypto", + "iota-types", + "move-binary-format", + "move-bytecode-utils", + "move-core-types", + "schemars", + "serde", + "serde_json", +] + +[[package]] +name = "iota-json-rpc-api" +version = "0.9.0-alpha" +dependencies = [ + "anyhow", + "fastcrypto", + "iota-json", + "iota-json-rpc-types", + "iota-metrics", + "iota-open-rpc", + "iota-open-rpc-macros", + "iota-types", + "jsonrpsee", + "once_cell", + "prometheus", + "tap", + "tracing", +] + +[[package]] +name = "iota-json-rpc-types" +version = "0.9.0-alpha" +dependencies = [ + "anyhow", + "bcs", + "colored", + "enum_dispatch", + "fastcrypto", + "iota-enum-compat-util", + "iota-json", + "iota-macros", + "iota-metrics", + "iota-package-resolver", + "iota-protocol-config", + "iota-types", + "itertools 0.13.0", + "json_to_table", + "move-binary-format", + "move-bytecode-utils", + "move-core-types", + "schemars", + "serde", + "serde_json", + "serde_with", + "tabled", + "tracing", +] + +[[package]] +name = "iota-keys" +version = "0.9.0-alpha" +dependencies = [ + "anyhow", + "bip32", + "fastcrypto", + "iota-types", + "rand 0.8.5", + "regex", + "serde", + "serde_json", + "shared-crypto", + "signature 1.6.4", + "slip10_ed25519", + "tiny-bip39", +] + +[[package]] +name = "iota-macros" +version = "0.9.0-alpha" +dependencies = [ + "futures", + "iota-proc-macros", + "once_cell", + "tracing", +] + +[[package]] +name = "iota-metrics" +version = "0.9.0-alpha" +dependencies = [ + "anemo", + "anemo-tower", + "async-trait", + "axum", + "bytes", + "dashmap", + "futures", + "once_cell", + "parking_lot 0.12.3", + "prometheus", + "prometheus-closure-metric", + "scopeguard", + "simple-server-timing-header", + "tap", + "tokio", + "tracing", + "uuid", +] + +[[package]] +name = "iota-move-build" +version = "0.9.0-alpha" +dependencies = [ + "anyhow", + "fastcrypto", + "iota-package-management", + "iota-protocol-config", + "iota-types", + "iota-verifier-latest", + "move-binary-format", + "move-bytecode-utils", + "move-bytecode-verifier", + "move-command-line-common", + "move-compiler", + "move-core-types", + "move-ir-types", + "move-package", + "move-symbol-pool", + "serde-reflection", + "tempfile", +] + +[[package]] +name = "iota-move-natives-latest" +version = "0.1.0" +dependencies = [ + "bcs", + "better_any", + "fastcrypto", + "fastcrypto-vdf", + "fastcrypto-zkp", + "indexmap 2.7.1", + "iota-protocol-config", + "iota-types", + "move-binary-format", + "move-core-types", + "move-stdlib-natives", + "move-vm-runtime", + "move-vm-types", + "rand 0.8.5", + "smallvec", + "tracing", +] + +[[package]] +name = "iota-network-stack" +version = "0.9.0-alpha" +dependencies = [ + "anemo", + "bcs", + "bytes", + "eyre", + "futures", + "http", + "multiaddr", + "pin-project-lite", + "serde", + "snap", + "tokio", + "tokio-stream", + "tonic", + "tonic-health", + "tower 0.4.13", + "tower-http", + "tracing", +] + +[[package]] +name = "iota-open-rpc" +version = "0.9.0-alpha" +dependencies = [ + "schemars", + "serde", + "serde_json", + "versions", +] + +[[package]] +name = "iota-open-rpc-macros" +version = "0.9.0-alpha" +dependencies = [ + "derive-syn-parse", + "itertools 0.13.0", + "proc-macro2", + "quote", + "syn 1.0.109", + "unescape", +] + +[[package]] +name = "iota-package-management" +version = "0.9.0-alpha" +dependencies = [ + "anyhow", + "iota-json-rpc-types", + "iota-sdk 0.9.0-alpha", + "iota-types", + "move-core-types", + "move-package", + "move-symbol-pool", + "thiserror 1.0.69", + "tracing", +] + +[[package]] +name = "iota-package-resolver" +version = "0.9.0-alpha" +dependencies = [ + "async-trait", + "bcs", + "eyre", + "iota-types", + "lru", + "move-binary-format", + "move-command-line-common", + "move-core-types", + "serde", + "thiserror 1.0.69", + "tokio", +] + +[[package]] +name = "iota-proc-macros" +version = "0.9.0-alpha" +dependencies = [ + "msim-macros", + "proc-macro2", + "quote", + "syn 2.0.96", +] + +[[package]] +name = "iota-protocol-config" +version = "0.9.0-alpha" +dependencies = [ + "clap", + "iota-protocol-config-macros", + "move-vm-config", + "schemars", + "serde", + "serde_with", + "tracing", +] + +[[package]] +name = "iota-protocol-config-macros" +version = "0.9.0-alpha" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "iota-rust-sdk" +version = "0.0.0" +source = "git+https://github.com/iotaledger/iota-rust-sdk.git?rev=2ba6b293bdede769a1d9b4d1aecaede2ff7682dd#2ba6b293bdede769a1d9b4d1aecaede2ff7682dd" +dependencies = [ + "base64ct", + "bcs", + "blake2", + "bnum", + "bs58 0.5.1", + "hex", + "roaring", + "schemars", + "serde", + "serde_derive", + "serde_json", + "serde_with", + "winnow 0.6.24", +] + +[[package]] +name = "iota-sdk" +version = "0.9.0-alpha" +dependencies = [ + "anyhow", + "async-trait", + "base64 0.21.7", + "bcs", + "clap", + "colored", + "fastcrypto", + "futures", + "futures-core", + "getset", + "iota-config", + "iota-json", + "iota-json-rpc-api", + "iota-json-rpc-types", + "iota-keys", + "iota-transaction-builder", + "iota-types", + "jsonrpsee", + "move-core-types", + "reqwest", + "rustls", + "serde", + "serde_json", + "serde_with", + "shared-crypto", + "thiserror 1.0.69", + "tokio", + "tracing", +] + +[[package]] +name = "iota-sdk" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1dfb0cae5c5bad8186576ca00b8be675257431eda028dcea01cb3b9f276037e" +dependencies = [ + "bech32", + "bitflags 2.8.0", + "bytemuck", + "derive_more 0.99.18", + "getset", + "gloo-timers 0.3.0", + "hashbrown 0.14.5", + "hex", + "iota-crypto", + "iota_stronghold", + "iterator-sorted 0.2.0", + "itertools 0.12.1", + "lazy_static", + "once_cell", + "packable", + "prefix-hex", + "primitive-types 0.12.2", + "rand 0.8.5", + "regex", + "serde", + "serde_json", + "serde_repr", + "url", + "zeroize", +] + +[[package]] +name = "iota-transaction-builder" +version = "0.9.0-alpha" +dependencies = [ + "anyhow", + "async-trait", + "bcs", + "futures", + "iota-json", + "iota-json-rpc-types", + "iota-protocol-config", + "iota-types", + "move-binary-format", + "move-core-types", +] + +[[package]] +name = "iota-types" +version = "0.9.0-alpha" +dependencies = [ + "anemo", + "anyhow", + "async-trait", + "bcs", + "better_any", + "bincode", + "byteorder", + "chrono", + "consensus-config", + "derive_more 1.0.0", + "enum_dispatch", + "eyre", + "fastcrypto", + "fastcrypto-tbls", + "fastcrypto-zkp", + "hex", + "im", + "indexmap 2.7.1", + "iota-enum-compat-util", + "iota-macros", + "iota-metrics", + "iota-network-stack", + "iota-protocol-config", + "iota-rust-sdk", + "iota-sdk 1.1.5", + "itertools 0.13.0", + "lru", + "move-binary-format", + "move-bytecode-utils", + "move-command-line-common", + "move-core-types", + "move-disassembler", + "move-ir-types", + "move-vm-profiler", + "move-vm-test-utils", + "move-vm-types", + "nonempty", + "num-bigint 0.4.6", + "num-rational", + "num-traits", + "num_enum", + "once_cell", + "packable", + "parking_lot 0.12.3", + "passkey-types", + "prometheus", + "rand 0.8.5", + "roaring", + "schemars", + "serde", + "serde-name", + "serde_json", + "serde_with", + "shared-crypto", + "signature 1.6.4", + "static_assertions", + "strum 0.26.3", + "strum_macros 0.26.4", + "tap", + "thiserror 1.0.69", + "tonic", + "tracing", + "typed-store-error", +] + +[[package]] +name = "iota-verifier-latest" +version = "0.1.0" +dependencies = [ + "iota-protocol-config", + "iota-types", + "move-abstract-interpreter", + "move-abstract-stack", + "move-binary-format", + "move-bytecode-utils", + "move-bytecode-verifier-meter", + "move-core-types", + "move-vm-config", +] + +[[package]] +name = "iota_stronghold" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c0d301c7edbc31494d183b7d24c1bb51d3fb10fce2f3793df1baf45b6988e10" +dependencies = [ + "bincode", + "hkdf", + "iota-crypto", + "rust-argon2", + "serde", + "stronghold-derive", + "stronghold-utils", + "stronghold_engine", + "thiserror 1.0.69", + "zeroize", +] + +[[package]] +name = "ipnet" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" + +[[package]] +name = "iri-string" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc0f0a572e8ffe56e2ff4f769f32ffe919282c3916799f8b68688b6030063bea" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + +[[package]] +name = "iterator-sorted" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d101775d2bc8f99f4ac18bf29b9ed70c0dd138b9a1e88d7b80179470cbbe8bd2" + +[[package]] +name = "iterator-sorted" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3c1d66191fc266439b989dc1a9a69d9c4156e803ce456221231398b84c35d1" + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" + +[[package]] +name = "jni" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6df18c2e3db7e453d3c6ac5b3e9d5182664d28788126d39b91f2d1e22b017ec" +dependencies = [ + "cesu8", + "combine", + "jni-sys", + "log", + "thiserror 1.0.69", + "walkdir", +] + +[[package]] +name = "jni-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" + +[[package]] +name = "jobserver" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" +dependencies = [ + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "json_to_table" +version = "0.6.0" +source = "git+https://github.com/zhiburt/tabled/?rev=e449317a1c02eb6b29e409ad6617e5d9eb7b3bd4#e449317a1c02eb6b29e409ad6617e5d9eb7b3bd4" +dependencies = [ + "serde_json", + "tabled", +] + +[[package]] +name = "jsonrpsee" +version = "0.24.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5c71d8c1a731cc4227c2f698d377e7848ca12c8a48866fc5e6951c43a4db843" +dependencies = [ + "jsonrpsee-client-transport", + "jsonrpsee-core", + "jsonrpsee-http-client", + "jsonrpsee-proc-macros", + "jsonrpsee-server", + "jsonrpsee-types", + "jsonrpsee-wasm-client", + "jsonrpsee-ws-client", + "tokio", + "tracing", +] + +[[package]] +name = "jsonrpsee-client-transport" +version = "0.24.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "548125b159ba1314104f5bb5f38519e03a41862786aa3925cf349aae9cdd546e" +dependencies = [ + "base64 0.22.1", + "futures-channel", + "futures-util", + "gloo-net", + "http", + "jsonrpsee-core", + "pin-project", + "rustls", + "rustls-pki-types", + "rustls-platform-verifier", + "soketto", + "thiserror 1.0.69", + "tokio", + "tokio-rustls", + "tokio-util", + "tracing", + "url", +] + +[[package]] +name = "jsonrpsee-core" +version = "0.24.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2882f6f8acb9fdaec7cefc4fd607119a9bd709831df7d7672a1d3b644628280" +dependencies = [ + "async-trait", + "bytes", + "futures-timer", + "futures-util", + "http", + "http-body", + "http-body-util", + "jsonrpsee-types", + "parking_lot 0.12.3", + "pin-project", + "rand 0.8.5", + "rustc-hash 2.1.0", + "serde", + "serde_json", + "thiserror 1.0.69", + "tokio", + "tokio-stream", + "tracing", + "wasm-bindgen-futures", +] + +[[package]] +name = "jsonrpsee-http-client" +version = "0.24.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3638bc4617f96675973253b3a45006933bde93c2fd8a6170b33c777cc389e5b" +dependencies = [ + "async-trait", + "base64 0.22.1", + "http-body", + "hyper", + "hyper-rustls", + "hyper-util", + "jsonrpsee-core", + "jsonrpsee-types", + "rustls", + "rustls-platform-verifier", + "serde", + "serde_json", + "thiserror 1.0.69", + "tokio", + "tower 0.4.13", + "tracing", + "url", +] + +[[package]] +name = "jsonrpsee-proc-macros" +version = "0.24.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06c01ae0007548e73412c08e2285ffe5d723195bf268bce67b1b77c3bb2a14d" +dependencies = [ + "heck 0.5.0", + "proc-macro-crate 3.2.0", + "proc-macro2", + "quote", + "syn 2.0.96", +] + +[[package]] +name = "jsonrpsee-server" +version = "0.24.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82ad8ddc14be1d4290cd68046e7d1d37acd408efed6d3ca08aefcc3ad6da069c" +dependencies = [ + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-util", + "jsonrpsee-core", + "jsonrpsee-types", + "pin-project", + "route-recognizer", + "serde", + "serde_json", + "soketto", + "thiserror 1.0.69", + "tokio", + "tokio-stream", + "tokio-util", + "tower 0.4.13", + "tracing", +] + +[[package]] +name = "jsonrpsee-types" +version = "0.24.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a178c60086f24cc35bb82f57c651d0d25d99c4742b4d335de04e97fa1f08a8a1" +dependencies = [ + "http", + "serde", + "serde_json", + "thiserror 1.0.69", +] + +[[package]] +name = "jsonrpsee-wasm-client" +version = "0.24.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a01cd500915d24ab28ca17527e23901ef1be6d659a2322451e1045532516c25" +dependencies = [ + "jsonrpsee-client-transport", + "jsonrpsee-core", + "jsonrpsee-types", +] + +[[package]] +name = "jsonrpsee-ws-client" +version = "0.24.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fe322e0896d0955a3ebdd5bf813571c53fea29edd713bc315b76620b327e86d" +dependencies = [ + "http", + "jsonrpsee-client-transport", + "jsonrpsee-core", + "jsonrpsee-types", + "url", +] + +[[package]] +name = "k256" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" +dependencies = [ + "cfg-if", + "ecdsa", + "elliptic-curve", + "once_cell", + "serdect", + "sha2 0.10.8", +] + +[[package]] +name = "keccak" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" +dependencies = [ + "cpufeatures", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +dependencies = [ + "spin", +] + +[[package]] +name = "leb128" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67" + +[[package]] +name = "libc" +version = "0.2.169" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" + +[[package]] +name = "libflate" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45d9dfdc14ea4ef0900c1cddbc8dcd553fbaacd8a4a282cf4018ae9dd04fb21e" +dependencies = [ + "adler32", + "core2", + "crc32fast", + "dary_heap", + "libflate_lz77", +] + +[[package]] +name = "libflate_lz77" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e0d73b369f386f1c44abd9c570d5318f55ccde816ff4b562fa452e5182863d" +dependencies = [ + "core2", + "hashbrown 0.14.5", + "rle-decode-fast", +] + +[[package]] +name = "libm" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" + +[[package]] +name = "libredox" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +dependencies = [ + "bitflags 2.8.0", + "libc", + "redox_syscall 0.5.8", +] + +[[package]] +name = "libsodium-sys-stable" +version = "1.22.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7717550bb3ec725f7b312848902d1534f332379b1d575d2347ec265c8814566" +dependencies = [ + "cc", + "libc", + "libflate", + "minisign-verify", + "pkg-config", + "tar", + "ureq", + "vcpkg", + "zip", +] + +[[package]] +name = "linked-hash-map" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" + +[[package]] +name = "linux-raw-sys" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" + +[[package]] +name = "litemap" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "lockfree-object-pool" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9374ef4228402d4b7e403e5838cb880d9ee663314b0a900d5a6aabf0c213552e" + +[[package]] +name = "log" +version = "0.4.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f" +dependencies = [ + "serde", +] + +[[package]] +name = "lru" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" +dependencies = [ + "hashbrown 0.15.2", +] + +[[package]] +name = "lsp-types" +version = "0.95.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e34d33a8e9b006cd3fc4fe69a921affa097bae4bb65f76271f4644f9a334365" +dependencies = [ + "bitflags 1.3.2", + "serde", + "serde_json", + "serde_repr", + "url", +] + +[[package]] +name = "matchit" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73cbba799671b762df5a175adf59ce145165747bb891505c43d09aefbbf38beb" + +[[package]] +name = "matchit" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" + +[[package]] +name = "md-5" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +dependencies = [ + "cfg-if", + "digest 0.10.7", +] + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "memoffset" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" +dependencies = [ + "autocfg", +] + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "mime_guess" +version = "2.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" +dependencies = [ + "mime", + "unicase", +] + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "minisign-verify" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6367d84fb54d4242af283086402907277715b8fe46976963af5ebf173f8efba3" + +[[package]] +name = "miniz_oxide" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8402cab7aefae129c6977bb0ff1b8fd9a04eb5b51efc50a70bea51cda0c7924" +dependencies = [ + "adler2", +] + +[[package]] +name = "mio" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" +dependencies = [ + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys 0.52.0", +] + +[[package]] +name = "move-abstract-interpreter" +version = "0.1.0" +dependencies = [ + "move-binary-format", + "move-bytecode-verifier-meter", +] + +[[package]] +name = "move-abstract-stack" +version = "0.0.1" + +[[package]] +name = "move-binary-format" +version = "0.0.3" +dependencies = [ + "anyhow", + "arbitrary", + "enum-compat-util", + "move-core-types", + "move-proc-macros", + "proptest", + "proptest-derive", + "ref-cast", + "serde", + "variant_count", +] + +[[package]] +name = "move-borrow-graph" +version = "0.0.1" + +[[package]] +name = "move-bytecode-source-map" +version = "0.1.0" +dependencies = [ + "anyhow", + "bcs", + "move-binary-format", + "move-command-line-common", + "move-core-types", + "move-ir-types", + "move-symbol-pool", + "serde", +] + +[[package]] +name = "move-bytecode-utils" +version = "0.1.0" +dependencies = [ + "anyhow", + "move-binary-format", + "move-core-types", + "petgraph", + "serde", + "serde-reflection", +] + +[[package]] +name = "move-bytecode-verifier" +version = "0.1.0" +dependencies = [ + "move-abstract-interpreter", + "move-abstract-stack", + "move-binary-format", + "move-borrow-graph", + "move-bytecode-verifier-meter", + "move-core-types", + "move-vm-config", + "petgraph", +] + +[[package]] +name = "move-bytecode-verifier-meter" +version = "0.1.0" +dependencies = [ + "move-binary-format", + "move-core-types", + "move-vm-config", +] + +[[package]] +name = "move-command-line-common" +version = "0.1.0" +dependencies = [ + "anyhow", + "bcs", + "difference", + "dirs-next", + "hex", + "move-binary-format", + "move-core-types", + "num-bigint 0.4.6", + "once_cell", + "serde", + "sha2 0.9.9", + "vfs", + "walkdir", +] + +[[package]] +name = "move-compiler" +version = "0.0.1" +dependencies = [ + "anyhow", + "bcs", + "clap", + "codespan-reporting", + "dunce", + "hex", + "lsp-types", + "move-binary-format", + "move-borrow-graph", + "move-bytecode-source-map", + "move-bytecode-verifier", + "move-command-line-common", + "move-core-types", + "move-ir-to-bytecode", + "move-ir-types", + "move-proc-macros", + "move-symbol-pool", + "once_cell", + "petgraph", + "regex", + "serde", + "serde_json", + "similar", + "stacker", + "vfs", +] + +[[package]] +name = "move-core-types" +version = "0.0.4" +dependencies = [ + "anyhow", + "arbitrary", + "bcs", + "enum-compat-util", + "ethnum", + "hex", + "leb128", + "move-proc-macros", + "num", + "once_cell", + "primitive-types 0.10.1", + "proptest", + "proptest-derive", + "rand 0.8.5", + "ref-cast", + "serde", + "serde_bytes", + "thiserror 1.0.69", + "uint", +] + +[[package]] +name = "move-coverage" +version = "0.1.0" +dependencies = [ + "anyhow", + "bcs", + "clap", + "codespan", + "colored", + "move-abstract-interpreter", + "move-binary-format", + "move-bytecode-source-map", + "move-command-line-common", + "move-core-types", + "move-ir-types", + "petgraph", + "serde", +] + +[[package]] +name = "move-disassembler" +version = "0.1.0" +dependencies = [ + "anyhow", + "bcs", + "clap", + "colored", + "hex", + "move-abstract-interpreter", + "move-binary-format", + "move-bytecode-source-map", + "move-command-line-common", + "move-compiler", + "move-core-types", + "move-coverage", + "move-ir-types", +] + +[[package]] +name = "move-docgen" +version = "0.1.0" +dependencies = [ + "anyhow", + "codespan", + "codespan-reporting", + "itertools 0.10.5", + "log", + "move-compiler", + "move-model", + "num", + "once_cell", + "regex", + "serde", +] + +[[package]] +name = "move-ir-to-bytecode" +version = "0.1.0" +dependencies = [ + "anyhow", + "codespan-reporting", + "log", + "move-binary-format", + "move-bytecode-source-map", + "move-command-line-common", + "move-core-types", + "move-ir-to-bytecode-syntax", + "move-ir-types", + "move-symbol-pool", + "ouroboros", +] + +[[package]] +name = "move-ir-to-bytecode-syntax" +version = "0.1.0" +dependencies = [ + "anyhow", + "hex", + "move-command-line-common", + "move-core-types", + "move-ir-types", + "move-symbol-pool", +] + +[[package]] +name = "move-ir-types" +version = "0.1.0" +dependencies = [ + "hex", + "move-command-line-common", + "move-core-types", + "move-symbol-pool", + "once_cell", + "serde", +] + +[[package]] +name = "move-model" +version = "0.1.0" +dependencies = [ + "anyhow", + "codespan", + "codespan-reporting", + "itertools 0.10.5", + "log", + "move-binary-format", + "move-bytecode-source-map", + "move-command-line-common", + "move-compiler", + "move-core-types", + "move-disassembler", + "move-ir-types", + "move-symbol-pool", + "num", + "once_cell", + "regex", + "serde", +] + +[[package]] +name = "move-package" +version = "0.1.0" +dependencies = [ + "anyhow", + "clap", + "colored", + "itertools 0.10.5", + "move-binary-format", + "move-bytecode-source-map", + "move-bytecode-utils", + "move-command-line-common", + "move-compiler", + "move-core-types", + "move-docgen", + "move-model", + "move-symbol-pool", + "named-lock", + "once_cell", + "petgraph", + "regex", + "serde", + "serde_yaml", + "sha2 0.9.9", + "tempfile", + "toml", + "toml_edit 0.14.4", + "treeline", + "vfs", + "walkdir", + "whoami", +] + +[[package]] +name = "move-proc-macros" +version = "0.1.0" +dependencies = [ + "quote", + "syn 2.0.96", +] + +[[package]] +name = "move-stdlib-natives" +version = "0.1.1" +dependencies = [ + "hex", + "move-binary-format", + "move-core-types", + "move-vm-runtime", + "move-vm-types", + "sha2 0.9.9", + "sha3 0.9.1", + "smallvec", +] + +[[package]] +name = "move-symbol-pool" +version = "0.1.0" +dependencies = [ + "once_cell", + "phf", + "serde", +] + +[[package]] +name = "move-vm-config" +version = "0.1.0" +dependencies = [ + "move-binary-format", + "once_cell", +] + +[[package]] +name = "move-vm-profiler" +version = "0.1.0" +dependencies = [ + "move-vm-config", + "once_cell", + "serde", +] + +[[package]] +name = "move-vm-runtime" +version = "0.1.0" +dependencies = [ + "better_any", + "fail", + "move-binary-format", + "move-bytecode-verifier", + "move-core-types", + "move-vm-config", + "move-vm-profiler", + "move-vm-types", + "once_cell", + "parking_lot 0.11.2", + "smallvec", + "tracing", +] + +[[package]] +name = "move-vm-test-utils" +version = "0.1.0" +dependencies = [ + "anyhow", + "move-binary-format", + "move-core-types", + "move-vm-profiler", + "move-vm-types", + "once_cell", + "serde", +] + +[[package]] +name = "move-vm-types" +version = "0.1.0" +dependencies = [ + "bcs", + "move-binary-format", + "move-core-types", + "move-vm-profiler", + "serde", + "smallvec", +] + +[[package]] +name = "msim-macros" +version = "0.1.0" +source = "git+https://github.com/iotaledger/iota-sim.git?rev=f16ef50ba7d874fe1f0960f248f6c651a634d6a5#f16ef50ba7d874fe1f0960f248f6c651a634d6a5" +dependencies = [ + "darling 0.14.4", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "multiaddr" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b36f567c7099511fa8612bbbb52dda2419ce0bdbacf31714e3a5ffdb766d3bd" +dependencies = [ + "arrayref", + "byteorder", + "data-encoding", + "log", + "multibase", + "multihash", + "percent-encoding", + "serde", + "static_assertions", + "unsigned-varint", + "url", +] + +[[package]] +name = "multibase" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b3539ec3c1f04ac9748a260728e855f261b4977f5c3406612c884564f329404" +dependencies = [ + "base-x", + "data-encoding", + "data-encoding-macro", +] + +[[package]] +name = "multihash" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "835d6ff01d610179fbce3de1694d007e500bf33a7f29689838941d6bf783ae40" +dependencies = [ + "core2", + "multihash-derive", + "unsigned-varint", +] + +[[package]] +name = "multihash-derive" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc076939022111618a5026d3be019fd8b366e76314538ff9a1b59ffbcbf98bcd" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 1.0.109", + "synstructure 0.12.6", +] + +[[package]] +name = "named-lock" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40a3eb6b7c682b65d1f631ec3176829d72ab450b3aacdd3f719bf220822e59ac" +dependencies = [ + "libc", + "once_cell", + "parking_lot 0.12.3", + "thiserror 1.0.69", + "widestring", + "winapi", +] + +[[package]] +name = "neptune" +version = "13.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06626c9ac04c894e9a23d061ba1309f28506cdc5fe64156d28a15fb57fc8e438" +dependencies = [ + "bellpepper", + "bellpepper-core", + "blake2s_simd", + "blstrs", + "byteorder", + "ff", + "generic-array", + "log", + "pasta_curves", + "serde", + "trait-set", +] + +[[package]] +name = "nix" +version = "0.24.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa52e972a9a719cecb6864fb88568781eb706bac2cd1d4f04a648542dbf78069" +dependencies = [ + "bitflags 1.3.2", + "cfg-if", + "libc", + "memoffset", +] + +[[package]] +name = "no-std-compat" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b93853da6d84c2e3c7d730d6473e8817692dd89be387eb01b94d7f108ecb5b8c" + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "nonempty" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "995defdca0a589acfdd1bd2e8e3b896b4d4f7675a31fd14c32611440c7f608e6" + +[[package]] +name = "nonzero_ext" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38bf9645c8b145698bb0b18a4637dcacbc421ea49bef2317e4fd8065a387cf21" + +[[package]] +name = "num" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" +dependencies = [ + "num-bigint 0.4.6", + "num-complex", + "num-integer", + "num-iter", + "num-rational", + "num-traits", +] + +[[package]] +name = "num-bigint" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f6f7833f2cbf2360a6cfd58cd41a53aa7a90bd4c202f5b1c7dd2ed73c57b2c3" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", + "rand 0.8.5", +] + +[[package]] +name = "num-bigint-dig" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151" +dependencies = [ + "byteorder", + "lazy_static", + "libm", + "num-integer", + "num-iter", + "num-traits", + "rand 0.8.5", + "smallvec", + "zeroize", +] + +[[package]] +name = "num-complex" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-modular" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64a5fe11d4135c3bcdf3a95b18b194afa9608a5f6ff034f5d857bc9a27fb0119" +dependencies = [ + "num-bigint 0.4.6", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-prime" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e238432a7881ec7164503ccc516c014bf009be7984cde1ba56837862543bdec3" +dependencies = [ + "bitvec 1.0.1", + "either", + "lru", + "num-bigint 0.4.6", + "num-integer", + "num-modular", + "num-traits", + "rand 0.8.5", +] + +[[package]] +name = "num-rational" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" +dependencies = [ + "num-bigint 0.4.6", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", + "libm", +] + +[[package]] +name = "num_cpus" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "num_enum" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" +dependencies = [ + "proc-macro-crate 3.2.0", + "proc-macro2", + "quote", + "syn 2.0.96", +] + +[[package]] +name = "object" +version = "0.36.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +dependencies = [ + "memchr", +] + +[[package]] +name = "object_store" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6da452820c715ce78221e8202ccc599b4a52f3e1eb3eedb487b680c81a8e3f3" +dependencies = [ + "async-trait", + "base64 0.22.1", + "bytes", + "chrono", + "futures", + "humantime", + "hyper", + "itertools 0.13.0", + "md-5", + "parking_lot 0.12.3", + "percent-encoding", + "quick-xml", + "rand 0.8.5", + "reqwest", + "ring", + "rustls-pemfile", + "serde", + "serde_json", + "snafu", + "tokio", + "tracing", + "url", + "walkdir", +] + +[[package]] +name = "oid-registry" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bedf36ffb6ba96c2eb7144ef6270557b52e54b20c0a8e1eb2ff99a6c6959bff" +dependencies = [ + "asn1-rs", +] + +[[package]] +name = "once_cell" +version = "1.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" + +[[package]] +name = "opaque-debug" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "ouroboros" +version = "0.17.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2ba07320d39dfea882faa70554b4bd342a5f273ed59ba7c1c6b4c840492c954" +dependencies = [ + "aliasable", + "ouroboros_macro", + "static_assertions", +] + +[[package]] +name = "ouroboros_macro" +version = "0.17.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec4c6225c69b4ca778c0aea097321a64c421cf4577b331c61b229267edabb6f8" +dependencies = [ + "heck 0.4.1", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.96", +] + +[[package]] +name = "p256" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" +dependencies = [ + "ecdsa", + "elliptic-curve", + "primeorder", + "sha2 0.10.8", +] + +[[package]] +name = "packable" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11259b086696fc9256f790485d8f14f11f0fa60a60351af9693e3d49fd24fdb6" +dependencies = [ + "autocfg", + "packable-derive", + "primitive-types 0.12.2", + "serde", +] + +[[package]] +name = "packable-derive" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9567693dd2f9a4339cb0a54adfcc0cb431c0ac88b2e46c6ddfb5f5d11a1cc4f" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "pairing" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81fec4625e73cf41ef4bb6846cafa6d44736525f442ba45e407c4a000a13996f" +dependencies = [ + "group", +] + +[[package]] +name = "papergrid" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae7891b22598926e4398790c8fe6447930c72a67d36d983a49d6ce682ce83290" +dependencies = [ + "bytecount", + "fnv", + "unicode-width", +] + +[[package]] +name = "parity-scale-codec" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "373b1a4c1338d9cd3d1fa53b3a11bdab5ab6bd80a20f7f7becd76953ae2be909" +dependencies = [ + "arrayvec", + "bitvec 0.20.4", + "byte-slice-cast", + "impl-trait-for-tuples", + "parity-scale-codec-derive 2.3.1", + "serde", +] + +[[package]] +name = "parity-scale-codec" +version = "3.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "306800abfa29c7f16596b5970a588435e3d5b3149683d00c12b699cc19f895ee" +dependencies = [ + "arrayvec", + "bitvec 1.0.1", + "byte-slice-cast", + "impl-trait-for-tuples", + "parity-scale-codec-derive 3.6.12", + "serde", +] + +[[package]] +name = "parity-scale-codec-derive" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1557010476e0595c9b568d16dcfb81b93cdeb157612726f5170d31aa707bed27" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "parity-scale-codec-derive" +version = "3.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d830939c76d294956402033aee57a6da7b438f2294eb94864c37b0569053a42c" +dependencies = [ + "proc-macro-crate 3.2.0", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "parking_lot" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" +dependencies = [ + "instant", + "lock_api", + "parking_lot_core 0.8.6", +] + +[[package]] +name = "parking_lot" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +dependencies = [ + "lock_api", + "parking_lot_core 0.9.10", +] + +[[package]] +name = "parking_lot_core" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc" +dependencies = [ + "cfg-if", + "instant", + "libc", + "redox_syscall 0.2.16", + "smallvec", + "winapi", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.5.8", + "smallvec", + "windows-targets 0.52.6", +] + +[[package]] +name = "passkey-types" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77144664f6aac5f629d7efa815f5098a054beeeca6ccafee5ec453fd2b0c53f9" +dependencies = [ + "bitflags 2.8.0", + "ciborium", + "coset", + "data-encoding", + "getrandom 0.2.15", + "hmac", + "indexmap 2.7.1", + "rand 0.8.5", + "serde", + "serde_json", + "sha2 0.10.8", + "strum 0.25.0", + "typeshare", + "zeroize", +] + +[[package]] +name = "pasta_curves" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e57598f73cc7e1b2ac63c79c517b31a0877cd7c402cdcaa311b5208de7a095" +dependencies = [ + "blake2b_simd", + "ff", + "group", + "hex", + "lazy_static", + "rand 0.8.5", + "serde", + "static_assertions", + "subtle", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "pbkdf2" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" +dependencies = [ + "digest 0.10.7", +] + +[[package]] +name = "pbkdf2" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" +dependencies = [ + "digest 0.10.7", + "hmac", +] + +[[package]] +name = "pem" +version = "3.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e459365e590736a54c3fa561947c84837534b8e9af6fc5bf781307e82658fae" +dependencies = [ + "base64 0.22.1", + "serde", +] + +[[package]] +name = "pem-rfc7468" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d159833a9105500e0398934e205e0773f0b27529557134ecfc51c27646adac" +dependencies = [ + "base64ct", +] + +[[package]] +name = "pem-rfc7468" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +dependencies = [ + "base64ct", +] + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "petgraph" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "467d164a6de56270bd7c4d070df81d07beace25012d5103ced4e9ff08d6afdb7" +dependencies = [ + "fixedbitset", + "indexmap 1.9.3", +] + +[[package]] +name = "phf" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" +dependencies = [ + "phf_macros", + "phf_shared", +] + +[[package]] +name = "phf_generator" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" +dependencies = [ + "phf_shared", + "rand 0.8.5", +] + +[[package]] +name = "phf_macros" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216" +dependencies = [ + "phf_generator", + "phf_shared", + "proc-macro2", + "quote", + "syn 2.0.96", +] + +[[package]] +name = "phf_shared" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" +dependencies = [ + "siphasher", +] + +[[package]] +name = "pin-project" +version = "1.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e2ec53ad785f4d35dac0adea7f7dc6f1bb277ad84a680c7afefeae05d1f5916" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d56a66c0c55993aa927429d0f8a0abfd74f084e4d9c192cffed01e418d83eefb" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkcs1" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eff33bdbdfc54cc98a2eca766ebdec3e1b8fb7387523d5c9c9a2891da856f719" +dependencies = [ + "der 0.6.1", + "pkcs8 0.9.0", + "spki 0.6.0", + "zeroize", +] + +[[package]] +name = "pkcs8" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9eca2c590a5f85da82668fa685c09ce2888b9430e83299debf1f34b65fd4a4ba" +dependencies = [ + "der 0.6.1", + "spki 0.6.0", +] + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der 0.7.9", + "spki 0.7.3", +] + +[[package]] +name = "pkg-config" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" + +[[package]] +name = "poly1305" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8159bd90725d2df49889a078b54f4f79e87f1f8a8444194cdca81d38f5393abf" +dependencies = [ + "cpufeatures", + "opaque-debug", + "universal-hash", +] + +[[package]] +name = "polyval" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25" +dependencies = [ + "cfg-if", + "cpufeatures", + "opaque-debug", + "universal-hash", +] + +[[package]] +name = "portable-atomic" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "280dc24453071f1b63954171985a0b0d30058d287960968b9b2aca264c8d4ee6" + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "prefix-hex" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f1799f398371ad6957951ec446d3ff322d35c46d9db2e217b67e828b311c249" +dependencies = [ + "hex", + "primitive-types 0.12.2", + "uint", +] + +[[package]] +name = "primeorder" +version = "0.13.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" +dependencies = [ + "elliptic-curve", +] + +[[package]] +name = "primitive-types" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05e4722c697a58a99d5d06a08c30821d7c082a4632198de1eaa5a6c22ef42373" +dependencies = [ + "fixed-hash 0.7.0", + "impl-codec 0.5.1", + "impl-serde 0.3.2", + "uint", +] + +[[package]] +name = "primitive-types" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" +dependencies = [ + "fixed-hash 0.8.0", + "impl-codec 0.6.0", + "impl-serde 0.4.0", + "uint", +] + +[[package]] +name = "proc-macro-crate" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +dependencies = [ + "once_cell", + "toml_edit 0.19.15", +] + +[[package]] +name = "proc-macro-crate" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" +dependencies = [ + "toml_edit 0.22.22", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" +dependencies = [ + "proc-macro2", + "quote", +] + +[[package]] +name = "proc-macro-error2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" +dependencies = [ + "proc-macro-error-attr2", + "proc-macro2", + "quote", + "syn 2.0.96", +] + +[[package]] +name = "proc-macro2" +version = "1.0.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "prometheus" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d33c28a30771f7f96db69893f78b857f7450d7e0237e9c8fc6427a81bae7ed1" +dependencies = [ + "cfg-if", + "fnv", + "lazy_static", + "memchr", + "parking_lot 0.12.3", + "protobuf", + "thiserror 1.0.69", +] + +[[package]] +name = "prometheus-closure-metric" +version = "0.9.0-alpha" +dependencies = [ + "anyhow", + "prometheus", + "protobuf", +] + +[[package]] +name = "proptest" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14cae93065090804185d3b75f0bf93b8eeda30c7a9b4a33d3bdb3988d6229e50" +dependencies = [ + "bit-set", + "bit-vec", + "bitflags 2.8.0", + "lazy_static", + "num-traits", + "rand 0.8.5", + "rand_chacha 0.3.1", + "rand_xorshift", + "regex-syntax", + "rusty-fork", + "tempfile", + "unarray", +] + +[[package]] +name = "proptest-derive" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ee1c9ac207483d5e7db4940700de86a9aae46ef90c48b57f99fe7edb8345e49" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", +] + +[[package]] +name = "prost" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c0fef6c4230e4ccf618a35c59d7ede15dea37de8427500f50aff708806e42ec" +dependencies = [ + "bytes", + "prost-derive", +] + +[[package]] +name = "prost-derive" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "157c5a9d7ea5c2ed2d9fb8f495b64759f7816c7eaea54ba3978f0d63000162e3" +dependencies = [ + "anyhow", + "itertools 0.13.0", + "proc-macro2", + "quote", + "syn 2.0.96", +] + +[[package]] +name = "protobuf" +version = "2.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "106dd99e98437432fed6519dedecfade6a06a73bb7b2a1e019fdd2bee5778d94" +dependencies = [ + "bytes", +] + +[[package]] +name = "psm" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "200b9ff220857e53e184257720a14553b2f4aa02577d2ed9842d45d4b9654810" +dependencies = [ + "cc", +] + +[[package]] +name = "quanta" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3bd1fe6824cea6538803de3ff1bc0cf3949024db3d43c9643024bfb33a807c0e" +dependencies = [ + "crossbeam-utils", + "libc", + "once_cell", + "raw-cpuid", + "wasi 0.11.0+wasi-snapshot-preview1", + "web-sys", + "winapi", +] + +[[package]] +name = "quick-error" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" + +[[package]] +name = "quick-xml" +version = "0.36.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7649a7b4df05aed9ea7ec6f628c67c9953a43869b8bc50929569b2999d443fe" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "quinn" +version = "0.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62e96808277ec6f97351a2380e6c25114bc9e67037775464979f3037c92d05ef" +dependencies = [ + "bytes", + "futures-io", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash 2.1.0", + "rustls", + "socket2", + "thiserror 2.0.11", + "tokio", + "tracing", +] + +[[package]] +name = "quinn-proto" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2fe5ef3495d7d2e377ff17b1a8ce2ee2ec2a18cde8b6ad6619d65d0701c135d" +dependencies = [ + "bytes", + "getrandom 0.2.15", + "rand 0.8.5", + "ring", + "rustc-hash 2.1.0", + "rustls", + "rustls-pki-types", + "slab", + "thiserror 2.0.11", + "tinyvec", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-udp" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c40286217b4ba3a71d644d752e6a0b71f13f1b6a2c5311acfcbe0c2418ed904" +dependencies = [ + "cfg_aliases", + "libc", + "once_cell", + "socket2", + "tracing", + "windows-sys 0.59.0", +] + +[[package]] +name = "quote" +version = "1.0.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "radium" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "643f8f41a8ebc4c5dc4515c82bb8abd397b527fc20fd681b7c011c2aee5d44fb" + +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom 0.1.16", + "libc", + "rand_chacha 0.2.2", + "rand_core 0.5.1", + "rand_hc", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +dependencies = [ + "ppv-lite86", + "rand_core 0.5.1", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom 0.1.16", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.15", +] + +[[package]] +name = "rand_hc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "rand_xorshift" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" +dependencies = [ + "rand_core 0.6.4", +] + +[[package]] +name = "rand_xoshiro" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f97cdb2a36ed4183de61b2f824cc45c9f1037f28afe0a322e9fff4c108b5aaa" +dependencies = [ + "rand_core 0.6.4", +] + +[[package]] +name = "raw-cpuid" +version = "11.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6928fa44c097620b706542d428957635951bade7143269085389d42c8a4927e" +dependencies = [ + "bitflags 2.8.0", +] + +[[package]] +name = "rcgen" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75e669e5202259b5314d1ea5397316ad400819437857b90861765f24c4cf80a2" +dependencies = [ + "pem", + "ring", + "rustls-pki-types", + "time", + "yasna", +] + +[[package]] +name = "readonly" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a25d631e41bfb5fdcde1d4e2215f62f7f0afa3ff11e26563765bd6ea1d229aeb" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", +] + +[[package]] +name = "redox_syscall" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "redox_syscall" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" +dependencies = [ + "bitflags 2.8.0", +] + +[[package]] +name = "redox_users" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" +dependencies = [ + "getrandom 0.2.15", + "libredox", + "thiserror 1.0.69", +] + +[[package]] +name = "ref-cast" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf0a6f84d5f1d581da8b41b47ec8600871962f2a528115b542b362d4b744931" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bcc303e793d3734489387d205e9b186fac9c6cfacedd98cbb2e8a5943595f3e6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", +] + +[[package]] +name = "regex" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" + +[[package]] +name = "reqwest" +version = "0.12.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43e734407157c3c2034e0258f5e4473ddb361b1e85f95a66690d67264d7cd1da" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-util", + "ipnet", + "js-sys", + "log", + "mime", + "once_cell", + "percent-encoding", + "pin-project-lite", + "quinn", + "rustls", + "rustls-native-certs 0.8.1", + "rustls-pemfile", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tokio-rustls", + "tokio-util", + "tower 0.5.2", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", + "webpki-roots", + "windows-registry", +] + +[[package]] +name = "rfc6979" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" +dependencies = [ + "hmac", + "subtle", +] + +[[package]] +name = "ring" +version = "0.17.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.15", + "libc", + "spin", + "untrusted", + "windows-sys 0.52.0", +] + +[[package]] +name = "ripemd" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd124222d17ad93a644ed9d011a40f4fb64aa54275c08cc216524a9ea82fb09f" +dependencies = [ + "digest 0.10.7", +] + +[[package]] +name = "rle-decode-fast" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3582f63211428f83597b51b2ddb88e2a91a9d52d12831f9d08f5e624e8977422" + +[[package]] +name = "roaring" +version = "0.10.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a652edd001c53df0b3f96a36a8dc93fce6866988efc16808235653c6bcac8bf2" +dependencies = [ + "bytemuck", + "byteorder", +] + +[[package]] +name = "route-recognizer" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afab94fb28594581f62d981211a9a4d53cc8130bbcbbb89a0440d9b8e81a7746" + +[[package]] +name = "rsa" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55a77d189da1fee555ad95b7e50e7457d91c0e089ec68ca69ad2989413bbdab4" +dependencies = [ + "byteorder", + "digest 0.10.7", + "num-bigint-dig", + "num-integer", + "num-iter", + "num-traits", + "pkcs1", + "pkcs8 0.9.0", + "rand_core 0.6.4", + "sha2 0.10.8", + "signature 2.2.0", + "subtle", + "zeroize", +] + +[[package]] +name = "rust-argon2" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b50162d19404029c1ceca6f6980fe40d45c8b369f6f44446fa14bb39573b5bb9" +dependencies = [ + "base64 0.13.1", + "blake2b_simd", + "constant_time_eq 0.1.5", + "crossbeam-utils", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "rustc-hash" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7fb8039b3032c191086b10f11f319a6e99e1e82889c5cc6046f515c9db1d497" + +[[package]] +name = "rustc-hex" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rusticata-macros" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "faf0c4a6ece9950b9abdb62b1cfcf2a68b3b67a10ba445b3bb85be2a293d0632" +dependencies = [ + "nom", +] + +[[package]] +name = "rustix" +version = "0.38.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a78891ee6bf2340288408954ac787aa063d8e8817e9f53abb37c695c6d834ef6" +dependencies = [ + "bitflags 2.8.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.59.0", +] + +[[package]] +name = "rustls" +version = "0.23.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f287924602bf649d949c63dc8ac8b235fa5387d394020705b80c4eb597ce5b8" +dependencies = [ + "log", + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-native-certs" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5bfb394eeed242e909609f56089eecfe5fda225042e8b171791b9c95f5931e5" +dependencies = [ + "openssl-probe", + "rustls-pemfile", + "rustls-pki-types", + "schannel", + "security-framework 2.11.1", +] + +[[package]] +name = "rustls-native-certs" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fcff2dd52b58a8d98a70243663a0d234c4e2b79235637849d15913394a247d3" +dependencies = [ + "openssl-probe", + "rustls-pki-types", + "schannel", + "security-framework 3.2.0", +] + +[[package]] +name = "rustls-pemfile" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "rustls-pki-types" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2bf47e6ff922db3825eb750c4e2ff784c6ff8fb9e13046ef6a1d1c5401b0b37" +dependencies = [ + "web-time", +] + +[[package]] +name = "rustls-platform-verifier" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afbb878bdfdf63a336a5e63561b1835e7a8c91524f51621db870169eac84b490" +dependencies = [ + "core-foundation 0.9.4", + "core-foundation-sys", + "jni", + "log", + "once_cell", + "rustls", + "rustls-native-certs 0.7.3", + "rustls-platform-verifier-android", + "rustls-webpki", + "security-framework 2.11.1", + "security-framework-sys", + "webpki-roots", + "winapi", +] + +[[package]] +name = "rustls-platform-verifier-android" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" + +[[package]] +name = "rustls-webpki" +version = "0.102.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" + +[[package]] +name = "rusty-fork" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb3dcc6e454c328bb824492db107ab7c0ae8fcffe4ad210136ef014458c1bc4f" +dependencies = [ + "fnv", + "quick-error", + "tempfile", + "wait-timeout", +] + +[[package]] +name = "ryu" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" + +[[package]] +name = "salsa20" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97a22f5af31f73a954c10289c93e8a50cc23d971e80ee446f1f6f7137a088213" +dependencies = [ + "cipher", +] + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "schannel" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "schemars" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09c024468a378b7e36765cd36702b7a90cc3cba11654f6685c8f233408e89e92" +dependencies = [ + "dyn-clone", + "either", + "schemars_derive", + "serde", + "serde_json", +] + +[[package]] +name = "schemars_derive" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1eee588578aff73f856ab961cd2f79e36bc45d7ded33a7562adba4667aecc0e" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn 2.0.96", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "scrypt" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0516a385866c09368f0b5bcd1caff3366aace790fcd46e2bb032697bb172fd1f" +dependencies = [ + "pbkdf2 0.12.2", + "salsa20", + "sha2 0.10.8", +] + +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct", + "der 0.7.9", + "generic-array", + "pkcs8 0.10.2", + "serdect", + "subtle", + "zeroize", +] + +[[package]] +name = "secp256k1" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25996b82292a7a57ed3508f052cfff8640d38d32018784acd714758b43da9c8f" +dependencies = [ + "bitcoin_hashes", + "rand 0.8.5", + "secp256k1-sys", +] + +[[package]] +name = "secp256k1-sys" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70a129b9e9efbfb223753b9163c4ab3b13cff7fd9c7f010fbac25ab4099fa07e" +dependencies = [ + "cc", +] + +[[package]] +name = "security-framework" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" +dependencies = [ + "bitflags 2.8.0", + "core-foundation 0.9.4", + "core-foundation-sys", + "libc", + "num-bigint 0.4.6", + "security-framework-sys", +] + +[[package]] +name = "security-framework" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271720403f46ca04f7ba6f55d438f8bd878d6b8ca0a1046e8228c4145bcbb316" +dependencies = [ + "bitflags 2.8.0", + "core-foundation 0.10.0", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "semver" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f79dfe2d285b0488816f30e700a7438c5a73d816b5b7d3ac72fbc48b0d185e03" + +[[package]] +name = "send_wrapper" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f638d531eccd6e23b980caf34876660d38e265409d8e99b397ab71eb3612fad0" + +[[package]] +name = "serde" +version = "1.0.217" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde-name" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b5b14ebbcc4e4f2b3642fa99c388649da58d1dc3308c7d109f39f565d1710f0" +dependencies = [ + "serde", + "thiserror 1.0.69", +] + +[[package]] +name = "serde-reflection" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b6798a64289ff550d8d79847467789a5fd30b42c9c406a4d6dc0bc9b567e55c" +dependencies = [ + "once_cell", + "serde", + "thiserror 1.0.69", +] + +[[package]] +name = "serde_bytes" +version = "0.11.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "387cc504cb06bb40a96c8e04e951fe01854cf6bc921053c954e4a606d9675c6a" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_derive" +version = "1.0.217" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", +] + +[[package]] +name = "serde_derive_internals" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", +] + +[[package]] +name = "serde_json" +version = "1.0.137" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "930cfb6e6abf99298aaad7d29abbef7a9999a9a8806a40088f55f0dcec03146b" +dependencies = [ + "indexmap 2.7.1", + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "serde_path_to_error" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af99884400da37c88f5e9146b7f1fd0fbcae8f6eec4e9da38b67d05486f814a6" +dependencies = [ + "itoa", + "serde", +] + +[[package]] +name = "serde_repr" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_with" +version = "3.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6b6f7f2fcb69f747921f79f3926bd1e203fce4fef62c268dd3abfb6d86029aa" +dependencies = [ + "base64 0.22.1", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.7.1", + "serde", + "serde_derive", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d00caa5193a3c8362ac2b73be6b9e768aa5a4b2f721d8f4b339600c3cb51f8e" +dependencies = [ + "darling 0.20.10", + "proc-macro2", + "quote", + "syn 2.0.96", +] + +[[package]] +name = "serde_yaml" +version = "0.8.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "578a7433b776b56a35785ed5ce9a7e777ac0598aac5a6dd1b4b18a307c7fc71b" +dependencies = [ + "indexmap 1.9.3", + "ryu", + "serde", + "yaml-rust", +] + +[[package]] +name = "serdect" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a84f14a19e9a014bb9f4512488d9829a68e04ecabffb0f9904cd1ace94598177" +dependencies = [ + "base16ct", + "serde", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.10.7", +] + +[[package]] +name = "sha2" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if", + "cpufeatures", + "digest 0.9.0", + "opaque-debug", +] + +[[package]] +name = "sha2" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.10.7", +] + +[[package]] +name = "sha3" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f81199417d4e5de3f04b1e871023acea7389672c4135918f05aa9cbf2f2fa809" +dependencies = [ + "block-buffer 0.9.0", + "digest 0.9.0", + "keccak", + "opaque-debug", +] + +[[package]] +name = "sha3" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" +dependencies = [ + "digest 0.10.7", + "keccak", +] + +[[package]] +name = "shared-crypto" +version = "0.9.0-alpha" +dependencies = [ + "bcs", + "eyre", + "fastcrypto", + "serde", + "serde_repr", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "signature" +version = "1.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" + +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest 0.10.7", + "rand_core 0.6.4", +] + +[[package]] +name = "simd-adler32" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" + +[[package]] +name = "similar" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbbb5d9659141646ae647b42fe094daf6c6192d1620870b449d9557f748b2daa" + +[[package]] +name = "simple-server-timing-header" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16e78919e05c9b8e123d435a4ad104b488ad1585631830e413830985c214086e" + +[[package]] +name = "siphasher" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" + +[[package]] +name = "sized-chunks" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16d69225bde7a69b235da73377861095455d298f2b970996eec25ddbb42b3d1e" +dependencies = [ + "bitmaps", + "typenum", +] + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "slip10_ed25519" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4be0ff28bf14f9610a342169084e87a4f435ad798ec528dc7579a3678fa9dc9a" +dependencies = [ + "hmac-sha512", +] + +[[package]] +name = "smallvec" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" + +[[package]] +name = "snafu" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4de37ad025c587a29e8f3f5605c00f70b98715ef90b9061a815b9e59e9042d6" +dependencies = [ + "doc-comment", + "snafu-derive", +] + +[[package]] +name = "snafu-derive" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "990079665f075b699031e9c08fd3ab99be5029b96f3b78dc0709e8f77e4efebf" +dependencies = [ + "heck 0.4.1", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "snap" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b6b67fb9a61334225b5b790716f609cd58395f895b3fe8b328786812a40bc3b" + +[[package]] +name = "socket2" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "soketto" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e859df029d160cb88608f5d7df7fb4753fd20fdfb4de5644f3d8b8440841721" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures", + "http", + "httparse", + "log", + "rand 0.8.5", + "sha1", +] + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + +[[package]] +name = "spinning_top" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d96d2d1d716fb500937168cc09353ffdc7a012be8475ac7308e1bdf0e3923300" +dependencies = [ + "lock_api", +] + +[[package]] +name = "spki" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67cf02bbac7a337dc36e4f5a693db6c21e7863f45070f7064577eb4367a3212b" +dependencies = [ + "base64ct", + "der 0.6.1", +] + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der 0.7.9", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "stacker" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "799c883d55abdb5e98af1a7b3f23b9b6de8ecada0ecac058672d7635eb48ca7b" +dependencies = [ + "cc", + "cfg-if", + "libc", + "psm", + "windows-sys 0.59.0", +] + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "stronghold-derive" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2835db23c4724c05a2f85b81c4681f4aa8ea158edc8a7f4ad791c916fb766c2e" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "stronghold-runtime" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18db7cc51450cefdab5f4990e128dd02c98da6d2992b93ffef8992ac0d2f3ddf" +dependencies = [ + "dirs 4.0.0", + "iota-crypto", + "libc", + "libsodium-sys-stable", + "log", + "nix", + "rand 0.8.5", + "serde", + "thiserror 1.0.69", + "windows", + "zeroize", +] + +[[package]] +name = "stronghold-utils" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8300214898af5e153e7f66e49dbd1c6a21585f2d592d9f24f58b969792475ed6" +dependencies = [ + "rand 0.8.5", + "stronghold-derive", +] + +[[package]] +name = "stronghold_engine" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fd7371c42e557dd71a7f860bb2ec6b6fdb32f97a97987ccc2435fdd1f3a8615" +dependencies = [ + "anyhow", + "dirs-next", + "hex", + "iota-crypto", + "once_cell", + "paste", + "serde", + "stronghold-runtime", + "thiserror 1.0.69", + "zeroize", +] + +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "strum" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125" +dependencies = [ + "strum_macros 0.25.3", +] + +[[package]] +name = "strum" +version = "0.26.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" +dependencies = [ + "strum_macros 0.26.4", +] + +[[package]] +name = "strum_macros" +version = "0.25.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0" +dependencies = [ + "heck 0.4.1", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.96", +] + +[[package]] +name = "strum_macros" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.96", +] + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "subtle-ng" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "734676eb262c623cec13c3155096e08d1f8f29adce39ba17948b18dad1e54142" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.96" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5d0adab1ae378d7f53bdebc67a39f1f151407ef230f0ce2883572f5d8985c80" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + +[[package]] +name = "synstructure" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "unicode-xid", +] + +[[package]] +name = "synstructure" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", +] + +[[package]] +name = "tabled" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce69a5028cd9576063ec1f48edb2c75339fd835e6094ef3e05b3a079bf594a6" +dependencies = [ + "papergrid", + "tabled_derive", + "unicode-width", +] + +[[package]] +name = "tabled_derive" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99f688a08b54f4f02f0a3c382aefdb7884d3d69609f785bd253dc033243e3fe4" +dependencies = [ + "heck 0.4.1", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "tar" +version = "0.4.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c65998313f8e17d0d553d28f91a0df93e4dbbbf770279c7bc21ca0f09ea1a1f6" +dependencies = [ + "filetime", + "libc", + "xattr", +] + +[[package]] +name = "tempfile" +version = "3.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8a559c81686f576e8cd0290cd2a24a2a9ad80c98b3478856500fcbd7acd704" +dependencies = [ + "cfg-if", + "fastrand", + "getrandom 0.2.15", + "once_cell", + "rustix", + "windows-sys 0.59.0", +] + +[[package]] +name = "termcolor" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "terminal_size" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5352447f921fda68cf61b4101566c0bdb5104eff6804d0678e5227580ab6a4e9" +dependencies = [ + "rustix", + "windows-sys 0.59.0", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d452f284b73e6d76dd36758a0c8684b1d5be31f92b89d07fd5822175732206fc" +dependencies = [ + "thiserror-impl 2.0.11", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", +] + +[[package]] +name = "threadpool" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" +dependencies = [ + "num_cpus", +] + +[[package]] +name = "time" +version = "0.3.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21" +dependencies = [ + "deranged", + "itoa", + "num-conv", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" + +[[package]] +name = "time-macros" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2834e6017e3e5e4b9834939793b282bc03b37a3336245fa820e35e233e2a85de" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tiny-bip39" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62cc94d358b5a1e84a5cb9109f559aa3c4d634d2b1b4de3d0fa4adc7c78e2861" +dependencies = [ + "anyhow", + "hmac", + "once_cell", + "pbkdf2 0.11.0", + "rand 0.8.5", + "rustc-hash 1.1.0", + "sha2 0.10.8", + "thiserror 1.0.69", + "unicode-normalization", + "wasm-bindgen", + "zeroize", +] + +[[package]] +name = "tiny-keccak" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" +dependencies = [ + "crunchy", +] + +[[package]] +name = "tinystr" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tinyvec" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "022db8904dfa342efe721985167e9fcd16c29b226db4397ed752a761cfce81e8" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.39.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daa4fb1bc778bd6f04cbfc4bb2d06a7396a8f299dc33ea1900cedaa316f467b1" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "pin-project-lite", + "socket2", + "tokio-macros", + "windows-sys 0.52.0", +] + +[[package]] +name = "tokio-macros" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f6d0975eaace0cf0fcadee4e4aaa5da15b5c079146f2cffb67c113be122bf37" +dependencies = [ + "rustls", + "tokio", +] + +[[package]] +name = "tokio-stream" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", + "tokio-util", +] + +[[package]] +name = "tokio-tungstenite" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edc5f74e248dc973e0dbb7b74c7e0d6fcc301c694ff50049504004ef4d0cdcd9" +dependencies = [ + "futures-util", + "log", + "tokio", + "tungstenite", +] + +[[package]] +name = "tokio-util" +version = "0.7.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" +dependencies = [ + "bytes", + "futures-core", + "futures-io", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_datetime" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" + +[[package]] +name = "toml_edit" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5376256e44f2443f8896ac012507c19a012df0fe8758b55246ae51a2279db51f" +dependencies = [ + "combine", + "indexmap 1.9.3", + "itertools 0.10.5", + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.19.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +dependencies = [ + "indexmap 2.7.1", + "toml_datetime", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.22.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" +dependencies = [ + "indexmap 2.7.1", + "toml_datetime", + "winnow 0.6.24", +] + +[[package]] +name = "tonic" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877c5b330756d856ffcc4553ab34a5684481ade925ecc54bcd1bf02b1d0d4d52" +dependencies = [ + "async-stream", + "async-trait", + "axum", + "base64 0.22.1", + "bytes", + "h2", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-timeout", + "hyper-util", + "percent-encoding", + "pin-project", + "prost", + "socket2", + "tokio", + "tokio-stream", + "tower 0.4.13", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tonic-health" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1eaf34ddb812120f5c601162d5429933c9b527d901ab0e7f930d3147e33a09b2" +dependencies = [ + "async-stream", + "prost", + "tokio", + "tokio-stream", + "tonic", +] + +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "futures-core", + "futures-util", + "hdrhistogram", + "indexmap 1.9.3", + "pin-project", + "pin-project-lite", + "rand 0.8.5", + "slab", + "tokio", + "tokio-util", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-http" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9cd434a998747dd2c4276bc96ee2e0c7a2eadf3cae88e52be55a05fa9053f5" +dependencies = [ + "async-compression", + "base64 0.21.7", + "bitflags 2.8.0", + "bytes", + "futures-core", + "futures-util", + "http", + "http-body", + "http-body-util", + "http-range-header", + "httpdate", + "iri-string", + "mime", + "mime_guess", + "percent-encoding", + "pin-project-lite", + "tokio", + "tokio-util", + "tower 0.4.13", + "tower-layer", + "tower-service", + "tracing", + "uuid", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +dependencies = [ + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", +] + +[[package]] +name = "tracing-core" +version = "0.1.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" +dependencies = [ + "once_cell", +] + +[[package]] +name = "trait-set" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b79e2e9c9ab44c6d7c20d5976961b47e8f49ac199154daa514b77cd1ab536625" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "treeline" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7f741b240f1a48843f9b8e0444fb55fb2a4ff67293b50a9179dfd5ea67f8d41" + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "tungstenite" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18e5b8366ee7a95b16d32197d0b2604b43a0be89dc5fac9f8e96ccafbaedda8a" +dependencies = [ + "byteorder", + "bytes", + "data-encoding", + "http", + "httparse", + "log", + "rand 0.8.5", + "sha1", + "thiserror 1.0.69", + "utf-8", +] + +[[package]] +name = "typed-store-error" +version = "0.9.0-alpha" +dependencies = [ + "serde", + "thiserror 1.0.69", +] + +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + +[[package]] +name = "typeshare" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19be0f411120091e76e13e5a0186d8e2bcc3e7e244afdb70152197f1a8486ceb" +dependencies = [ + "chrono", + "serde", + "serde_json", + "typeshare-annotation", +] + +[[package]] +name = "typeshare-annotation" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a615d6c2764852a2e88a4f16e9ce1ea49bb776b5872956309e170d63a042a34f" +dependencies = [ + "quote", + "syn 2.0.96", +] + +[[package]] +name = "uint" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76f64bba2c53b04fcab63c01a7d7427eadc821e3bc48c34dc9ba29c501164b52" +dependencies = [ + "byteorder", + "crunchy", + "hex", + "static_assertions", +] + +[[package]] +name = "unarray" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" + +[[package]] +name = "unescape" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccb97dac3243214f8d8507998906ca3e2e0b900bf9bf4870477f125b82e68f6e" + +[[package]] +name = "unicase" +version = "2.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" + +[[package]] +name = "unicode-ident" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" + +[[package]] +name = "unicode-normalization" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-width" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "universal-hash" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" +dependencies = [ + "crypto-common", + "subtle", +] + +[[package]] +name = "unsigned-varint" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6889a77d49f1f013504cec6bf97a2c730394adedaeb1deb5ea08949a50541105" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "ureq" +version = "2.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02d1a66277ed75f640d608235660df48c8e3c19f3b4edb6a263315626cc3c01d" +dependencies = [ + "base64 0.22.1", + "log", + "once_cell", + "url", +] + +[[package]] +name = "url" +version = "2.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", +] + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "utf16_iter" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "uuid" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3758f5e68192bb96cc8f9b7e2c2cfdabb435499a28499a42f8f984092adad4b" +dependencies = [ + "getrandom 0.2.15", + "rand 0.8.5", +] + +[[package]] +name = "variant_count" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aae2faf80ac463422992abf4de234731279c058aaf33171ca70277c98406b124" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "versions" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee97e1d97bd593fb513912a07691b742361b3dd64ad56f2c694ea2dbfe0665d3" +dependencies = [ + "itertools 0.10.5", + "nom", +] + +[[package]] +name = "vfs" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e4fe92cfc1bad19c19925d5eee4b30584dbbdee4ff10183b261acccbef74e2d" + +[[package]] +name = "wait-timeout" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f200f5b12eb75f8c1ed65abd4b2db8a6e1b138a20de009dacee265a2498f3f6" +dependencies = [ + "libc", +] + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" + +[[package]] +name = "wasm-bindgen" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn 2.0.96", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" +dependencies = [ + "cfg-if", + "js-sys", + "once_cell", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasm-streams" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "web-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki-roots" +version = "0.26.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d642ff16b7e79272ae451b7322067cdc17cadf68c23264be9d94a32319efe7e" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "whoami" +version = "1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "372d5b87f58ec45c384ba03563b03544dc5fadc3983e434b286913f5b4a9bb6d" +dependencies = [ + "redox_syscall 0.5.8", + "wasite", + "web-sys", +] + +[[package]] +name = "widestring" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17882f045410753661207383517a6f62ec3dbeb6a4ed2acce01f0728238d1983" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e53b97a83176b369b0eb2fd8158d4ae215357d02df9d40c1e1bf1879c5482c80" +dependencies = [ + "windows_aarch64_msvc 0.36.1", + "windows_i686_gnu 0.36.1", + "windows_i686_msvc 0.36.1", + "windows_x86_64_gnu 0.36.1", + "windows_x86_64_msvc 0.36.1", +] + +[[package]] +name = "windows-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-registry" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" +dependencies = [ + "windows-result", + "windows-strings", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-result" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-strings" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +dependencies = [ + "windows-result", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "winnow" +version = "0.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "0.6.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8d71a593cc5c42ad7876e2c1fda56f314f3754c084128833e64f1345ff8a03a" +dependencies = [ + "memchr", +] + +[[package]] +name = "write16" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" + +[[package]] +name = "writeable" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" + +[[package]] +name = "wyz" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85e60b0d1b5f99db2556934e21937020776a5d31520bf169e851ac44e6420214" + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "x25519-dalek" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7e468321c81fb07fa7f4c636c3972b9100f0346e5b6a9f2bd0603a52f7ed277" +dependencies = [ + "curve25519-dalek", + "rand_core 0.6.4", + "zeroize", +] + +[[package]] +name = "x509-parser" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0ecbeb7b67ce215e40e3cc7f2ff902f94a223acf44995934763467e7b1febc8" +dependencies = [ + "asn1-rs", + "base64 0.13.1", + "data-encoding", + "der-parser", + "lazy_static", + "nom", + "oid-registry", + "rusticata-macros", + "thiserror 1.0.69", + "time", +] + +[[package]] +name = "xattr" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e105d177a3871454f754b33bb0ee637ecaaac997446375fd3e5d43a2ed00c909" +dependencies = [ + "libc", + "linux-raw-sys", + "rustix", +] + +[[package]] +name = "yaml-rust" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85" +dependencies = [ + "linked-hash-map", +] + +[[package]] +name = "yasna" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e17bb3549cc1321ae1296b9cdc2698e2b6cb1992adfa19a8c72e5b7a738f44cd" +dependencies = [ + "time", +] + +[[package]] +name = "yoke" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", + "synstructure 0.13.1", +] + +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "byteorder", + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", +] + +[[package]] +name = "zerofrom" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", + "synstructure 0.13.1", +] + +[[package]] +name = "zeroize" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +dependencies = [ + "serde", + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", +] + +[[package]] +name = "zerovec" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", +] + +[[package]] +name = "zip" +version = "2.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae9c1ea7b3a5e1f4b922ff856a129881167511563dc219869afe3787fc0c1a45" +dependencies = [ + "arbitrary", + "crc32fast", + "crossbeam-utils", + "displaydoc", + "flate2", + "indexmap 2.7.1", + "memchr", + "thiserror 2.0.11", + "zopfli", +] + +[[package]] +name = "zopfli" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5019f391bac5cf252e93bbcc53d039ffd62c7bfb7c150414d61369afe57e946" +dependencies = [ + "bumpalo", + "crc32fast", + "lockfree-object-pool", + "log", + "once_cell", + "simd-adler32", +] + +[[package]] +name = "zstd" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcf2b778a664581e31e389454a7072dab1647606d44f7feea22cd5abb9c9f3f9" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "7.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54a3ab4db68cea366acc5c897c7b4d4d1b8994a9cd6e6f841f8964566a419059" +dependencies = [ + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.13+zstd.1.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38ff0f21cfee8f97d94cef41359e0c89aa6113028ab0291aa8ca0038995a95aa" +dependencies = [ + "cc", + "pkg-config", +] diff --git a/docs/examples/rust/Cargo.toml b/docs/examples/rust/Cargo.toml index b395318ce83..d30105bad54 100644 --- a/docs/examples/rust/Cargo.toml +++ b/docs/examples/rust/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "docs-examples" -version.workspace = true +version = "0.1.0" authors = ["IOTA Stiftung"] edition = "2021" license = "Apache-2.0" @@ -8,24 +8,24 @@ publish = false [dependencies] # external dependencies -anyhow.workspace = true +anyhow = "1.0" # internal dependencies -iota-keys.workspace = true -iota-move-build.workspace = true -iota-sdk.workspace = true -move-binary-format = { workspace = true, features = ["fuzzing"] } -shared-crypto.workspace = true +iota-keys = { path = "../../../crates/iota-keys" } +iota-move-build = { path = "../../../crates/iota-move-build" } +iota-sdk = { path = "../../../crates/iota-sdk" } +move-binary-format = { path = "../../../external-crates/move/crates/move-binary-format", features = ["fuzzing"] } +shared-crypto = { path = "../../../crates/shared-crypto" } [dev-dependencies] # external dependencies -bcs.workspace = true -bip32.workspace = true -serde_json.workspace = true -tokio.workspace = true +bcs = "0.1" +bip32 = "0.5" +serde_json = "1.0" +tokio = "1.39" # internal dependencies -move-core-types.workspace = true +move-core-types = { path = "../../../external-crates/move/crates/move-core-types" } [[example]] name = "address-unlock-condition" diff --git a/examples/custom-indexer/rust/Cargo.toml b/examples/custom-indexer/rust/Cargo.toml index 179c9beaae9..269da75bf17 100644 --- a/examples/custom-indexer/rust/Cargo.toml +++ b/examples/custom-indexer/rust/Cargo.toml @@ -6,15 +6,15 @@ license = "Apache-2.0" [dependencies] # external dependencies -anyhow.workspace = true -async-trait.workspace = true -prometheus.workspace = true -tokio.workspace = true -tokio-util.workspace = true +anyhow = "1.0" +async-trait = "0.1" +prometheus = "0.13" +tokio = "1.39" +tokio-util = "0.7" # internal dependencies -iota-data-ingestion-core.workspace = true -iota-types.workspace = true +iota-data-ingestion-core = { path = "../../../crates/iota-data-ingestion-core" } +iota-types = { path = "../../../crates/iota-types" } [[bin]] name = "local_reader" diff --git a/examples/tic-tac-toe/cli/Cargo.toml b/examples/tic-tac-toe/cli/Cargo.toml index cadcf22ede6..f2d70eb33f5 100644 --- a/examples/tic-tac-toe/cli/Cargo.toml +++ b/examples/tic-tac-toe/cli/Cargo.toml @@ -6,13 +6,13 @@ license = "Apache-2.0" [dependencies] # external dependencies -anyhow = "1.0.86" -bcs = "0.1.6" +anyhow = "1.0" +bcs = "0.1" clap = { version = "4.5", features = ["derive", "env", "wrap_help"] } -dirs = "5.0.1" -fastcrypto = "0.1.8" -serde = { version = "1.0.203", features = ["derive"] } -tokio = { version = "1.38.0", features = ["time"] } +dirs = "6.0" +fastcrypto = "0.1" +serde = { version = "1.0", features = ["derive"] } +tokio = { version = "1.39", features = ["time"] } # internal dependencies iota-keys = { path = "../../../crates/iota-keys" } diff --git a/scripts/simtest/config-patch b/scripts/simtest/config-patch index c186afaf26a..c44c9c6cea5 100644 --- a/scripts/simtest/config-patch +++ b/scripts/simtest/config-patch @@ -12,10 +12,10 @@ index cc5620ecfe..d2ad8f1dac 100644 # 64 bit MSVC, override default 1M stack with 8M stack [target.x86_64-pc-windows-msvc] diff --git a/Cargo.toml b/Cargo.toml -index a2371ff16f..57a1fedaa5 100644 +index e91e9c7d48..d719828c54 100644 --- a/Cargo.toml +++ b/Cargo.toml -@@ -461,3 +461,7 @@ transaction-fuzzer = { path = "crates/transaction-fuzzer" } +@@ -466,3 +466,7 @@ transaction-fuzzer = { path = "crates/transaction-fuzzer" } typed-store = { path = "crates/typed-store" } typed-store-derive = { path = "crates/typed-store-derive" } typed-store-error = { path = "crates/typed-store-error" } From 86bfccea6e97f60624b444e081d36fff23532993 Mon Sep 17 00:00:00 2001 From: muXxer Date: Mon, 27 Jan 2025 13:57:17 +0100 Subject: [PATCH 03/51] fix: default node p2p `listen_address` port (#5030) --- crates/iota-config/src/p2p.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/iota-config/src/p2p.rs b/crates/iota-config/src/p2p.rs index 21fa661c274..46836873bc0 100644 --- a/crates/iota-config/src/p2p.rs +++ b/crates/iota-config/src/p2p.rs @@ -42,7 +42,7 @@ pub struct P2pConfig { } fn default_listen_address() -> SocketAddr { - "0.0.0.0:8080".parse().unwrap() + "0.0.0.0:8084".parse().unwrap() } impl Default for P2pConfig { From d367b1a03a5a1611dd6ae3fd8e751d8afb78d228 Mon Sep 17 00:00:00 2001 From: "Ching-Hua (Vivian) Lin" Date: Mon, 27 Jan 2025 21:03:05 +0800 Subject: [PATCH 04/51] fix: Ignore `verify_latest_tx_replay_testnet_mainnet` test for now (#5014) Co-authored-by: muXxer --- crates/iota-replay/src/tests.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/crates/iota-replay/src/tests.rs b/crates/iota-replay/src/tests.rs index 73114511319..f88b0086f08 100644 --- a/crates/iota-replay/src/tests.rs +++ b/crates/iota-replay/src/tests.rs @@ -21,9 +21,11 @@ const NUM_CHECKPOINTS_TO_ATTEMPT: usize = 10_000; /// Checks that replaying the latest tx on each testnet and mainnet does not /// fail #[tokio::test] +#[ignore = "https://github.com/iotaledger/iota/issues/5031"] async fn verify_latest_tx_replay_testnet_mainnet() { let _ = verify_latest_tx_replay_impl().await; } + async fn verify_latest_tx_replay_impl() { let default_cfg = ReplayableNetworkConfigSet::default(); let urls: Vec<_> = default_cfg @@ -46,7 +48,7 @@ async fn verify_latest_tx_replay_impl() { .await .unwrap(); - let chain_id = rpc_client.read_api().get_chain_identifier().await.unwrap(); + let chain_id = rpc_client.read_api().get_chain_identifier().await.unwrap(); let mut subject_checkpoint = rpc_client .read_api() From 3c3d80d2465f6ea75b510ac10938e3449544e2b9 Mon Sep 17 00:00:00 2001 From: Thoralf-M <46689931+Thoralf-M@users.noreply.github.com> Date: Mon, 27 Jan 2025 14:35:35 +0100 Subject: [PATCH 05/51] feat(iota/docs): add dev inspect test and docs (#5022) * feat(iota): add dev inspect test * feat(iota): avoid potential useless allocation https://github.com/iotaledger/iota/pull/5021#discussion_r1928990920 * feat(docs): add dry run and dev inspect section * Apply suggestions from code review Co-authored-by: Thibault Martinez Co-authored-by: Lucas Tortora <85233773+lucas-tortora@users.noreply.github.com> --------- Co-authored-by: Thibault Martinez Co-authored-by: Lucas Tortora <85233773+lucas-tortora@users.noreply.github.com> --- crates/iota/src/client_commands.rs | 2 +- crates/iota/tests/cli_tests.rs | 15 ++ docs/content/references/cli/ptb.mdx | 241 +++++++++++++++++++++++++++- 3 files changed, 256 insertions(+), 2 deletions(-) diff --git a/crates/iota/src/client_commands.rs b/crates/iota/src/client_commands.rs index 58a0d3b1f9b..f77eb3ebfd5 100644 --- a/crates/iota/src/client_commands.rs +++ b/crates/iota/src/client_commands.rs @@ -2962,11 +2962,11 @@ async fn execute_dev_inspect( ) -> Result { let client = context.get_client().await?; let gas_budget = gas_budget.map(iota_serde::BigInt::from); - let mut gas_objs = vec![]; let gas_objects = if let Some(gas_payment) = gas_payment { if gas_payment.is_empty() { None } else { + let mut gas_objs = vec![]; for o in gas_payment.iter() { let obj_ref = context.get_object_ref(*o).await?; gas_objs.push(obj_ref); diff --git a/crates/iota/tests/cli_tests.rs b/crates/iota/tests/cli_tests.rs index 66798b196db..b4beae11e28 100644 --- a/crates/iota/tests/cli_tests.rs +++ b/crates/iota/tests/cli_tests.rs @@ -4578,3 +4578,18 @@ async fn test_call_command_emit_args() -> Result<(), anyhow::Error> { Ok(()) } + +#[sim_test] +async fn test_ptb_dev_inspect() -> Result<(), anyhow::Error> { + let mut test_cluster = TestClusterBuilder::new().build().await; + let context = &mut test_cluster.wallet; + + let publish_ptb_string = r#" + --assign hello_option "some('Hello')" \ + --move-call std::option::borrow "" hello_option \ + --dev-inspect + "#; + let args = shlex::split(publish_ptb_string).unwrap(); + iota::client_ptb::ptb::PTB { args }.execute(context).await?; + Ok(()) +} diff --git a/docs/content/references/cli/ptb.mdx b/docs/content/references/cli/ptb.mdx index 10218be1f6e..ac9f88cfbd2 100644 --- a/docs/content/references/cli/ptb.mdx +++ b/docs/content/references/cli/ptb.mdx @@ -30,7 +30,9 @@ Options: --dry-run Perform a dry run of the PTB instead of executing it. - + --dev-inspect + Perform a dev inspect of the PTB instead of executing it. + --gas-coin The object ID of the gas coin to use. If not specified, it will try to use the first gas coin that it finds that has at least the requested gas-budget balance. --make-move-vec <[VALUES]> Given n-values of the same type, it constructs a vector. For non objects or an empty vector, the type tag must be specified. --merge-coins <[COIN OBJECTS]> Merge N coins into the provided coin. @@ -237,3 +239,240 @@ You cannot use the following words for variable names: ## JSON output Append the `--json` flag to commands to format responses in JSON instead of the more human-friendly default IOTA CLI output. This can be useful for extremely large datasets, for example, as those results can have a troublesome display on smaller screens. In these cases, the `--json` flag is useful. + +## `dry-run` and `dev-inspect` + +Both flags can simulate a transaction block and show its effects without committing it to the blockchain, meaning no gas fees are charged. + +A `dry-run` is ideal for quickly checking whether a transaction will succeed or fail. +It's helpful for testing the transaction logic and confirming that the transaction behaves as expected. + +A `dev-inspect` is useful for in-depth analysis and troubleshooting of transaction logic or inspection of on-chain data. +`dev-inspect` enables users to call any Move function with specified arguments, returning outputs and modified inputs without altering the state. +Also, results don't need to be handled as usual, references to objects can be returned, and owned objects don't need to be destroyed or transferred. +The result for each PTB transaction is printed at the end of the `dev-inspect` output. + +### `dry-run` Example + +```bash +iota client ptb \ +--move-call iota::tx_context::sender \ +--assign sender \ +--split-coins gas "[1000000000]" \ +--assign coin \ +--transfer-objects "[coin]" sender \ +--dry-run +``` + +
+Output: + +``` +Dry run completed, execution status: success +╭──────────────────────────────────────────────────────────────────────────────────────╮ +│ Dry Run Transaction Data │ +├──────────────────────────────────────────────────────────────────────────────────────┤ +│ Sender: 0xa5657935a0698bf654ce4ceb66b5a6d6a371a934a6afcfd1e191aa2ee460c8cc │ +│ Gas Owner: 0xa5657935a0698bf654ce4ceb66b5a6d6a371a934a6afcfd1e191aa2ee460c8cc │ +│ Gas Budget: 50000000000 NANOS │ +│ Gas Price: 1000 NANOS │ +│ Gas Payment: │ +│ │ +│ │ +│ Transaction Kind: Programmable │ +│ ╭──────────────────────────────────────────────╮ │ +│ │ Input Objects │ │ +│ ├──────────────────────────────────────────────┤ │ +│ │ 0 Pure Arg: Type: u64, Value: "1000000000" │ │ +│ ╰──────────────────────────────────────────────╯ │ +│ ╭──────────────────────────────────────────────────────────────────────────────────╮ │ +│ │ Commands │ │ +│ ├──────────────────────────────────────────────────────────────────────────────────┤ │ +│ │ 0 MoveCall: │ │ +│ │ ┌ │ │ +│ │ │ Function: sender │ │ +│ │ │ Module: tx_context │ │ +│ │ │ Package: 0x0000000000000000000000000000000000000000000000000000000000000002 │ │ +│ │ └ │ │ +│ │ │ │ +│ │ 1 SplitCoins: │ │ +│ │ ┌ │ │ +│ │ │ Coin: GasCoin │ │ +│ │ │ Amounts: │ │ +│ │ │ Input 0 │ │ +│ │ └ │ │ +│ │ │ │ +│ │ 2 TransferObjects: │ │ +│ │ ┌ │ │ +│ │ │ Arguments: │ │ +│ │ │ Result 1 │ │ +│ │ │ Address: Result 0 │ │ +│ │ └ │ │ +│ ╰──────────────────────────────────────────────────────────────────────────────────╯ │ +│ │ +╰──────────────────────────────────────────────────────────────────────────────────────╯ +╭───────────────────────────────────────────────────────────────────────────────────────────────────╮ +│ Transaction Effects │ +├───────────────────────────────────────────────────────────────────────────────────────────────────┤ +│ Digest: DkkfwFB3qqojaKaijocXhWYwHhDysEQEceZpwDBaoBgv │ +│ Status: Success │ +│ Executed Epoch: 67 │ +│ │ +│ Created Objects: │ +│ ┌── │ +│ │ ID: 0x66cb2f98a4cbb9da278e197ec7fe675f9e47b12c13aac731c94f46d29153d425 │ +│ │ Owner: Account Address ( 0xa5657935a0698bf654ce4ceb66b5a6d6a371a934a6afcfd1e191aa2ee460c8cc ) │ +│ │ Version: 2 │ +│ │ Digest: Zy4jEt7kaFEjeaFRnbw9BRSo8CJibJXD2JtLeVe3duc │ +│ └── │ +│ Mutated Objects: │ +│ ┌── │ +│ │ ID: 0xc5ea5446fdabc9b87b5c5e42344d73d72b02c69e41e0a3bf8dd8fe1c9d27ecbf │ +│ │ Owner: Account Address ( 0xa5657935a0698bf654ce4ceb66b5a6d6a371a934a6afcfd1e191aa2ee460c8cc ) │ +│ │ Version: 2 │ +│ │ Digest: aennzwscgtoZmsGK1kcPq7VQobC1uYk1pj8oADhjCtj │ +│ └── │ +│ Gas Object: │ +│ ┌── │ +│ │ ID: 0xc5ea5446fdabc9b87b5c5e42344d73d72b02c69e41e0a3bf8dd8fe1c9d27ecbf │ +│ │ Owner: Account Address ( 0xa5657935a0698bf654ce4ceb66b5a6d6a371a934a6afcfd1e191aa2ee460c8cc ) │ +│ │ Version: 2 │ +│ │ Digest: aennzwscgtoZmsGK1kcPq7VQobC1uYk1pj8oADhjCtj │ +│ └── │ +│ Gas Cost Summary: │ +│ Storage Cost: 1960800 NANOS │ +│ Computation Cost: 1000000 NANOS │ +│ Storage Rebate: 0 NANOS │ +│ Non-refundable Storage Fee: 0 NANOS │ +│ │ +│ Transaction Dependencies: │ +│ AS3GZusoMp8xxPvPBvwbUYnPPH7GxVNxnjkgLXzQAPPk │ +╰───────────────────────────────────────────────────────────────────────────────────────────────────╯ +╭─────────────────────────────╮ +│ No transaction block events │ +╰─────────────────────────────╯ +╭──────────────────────────────────────────────────────────────────────────────────────────────────╮ +│ Object Changes │ +├──────────────────────────────────────────────────────────────────────────────────────────────────┤ +│ Created Objects: │ +│ ┌── │ +│ │ ObjectID: 0x66cb2f98a4cbb9da278e197ec7fe675f9e47b12c13aac731c94f46d29153d425 │ +│ │ Sender: 0xa5657935a0698bf654ce4ceb66b5a6d6a371a934a6afcfd1e191aa2ee460c8cc │ +│ │ Owner: Account Address ( 0xa5657935a0698bf654ce4ceb66b5a6d6a371a934a6afcfd1e191aa2ee460c8cc ) │ +│ │ ObjectType: 0x2::coin::Coin<0x2::iota::IOTA> │ +│ │ Version: 2 │ +│ │ Digest: Zy4jEt7kaFEjeaFRnbw9BRSo8CJibJXD2JtLeVe3duc │ +│ └── │ +│ Mutated Objects: │ +│ ┌── │ +│ │ ObjectID: 0xc5ea5446fdabc9b87b5c5e42344d73d72b02c69e41e0a3bf8dd8fe1c9d27ecbf │ +│ │ Sender: 0xa5657935a0698bf654ce4ceb66b5a6d6a371a934a6afcfd1e191aa2ee460c8cc │ +│ │ Owner: Account Address ( 0xa5657935a0698bf654ce4ceb66b5a6d6a371a934a6afcfd1e191aa2ee460c8cc ) │ +│ │ ObjectType: 0x2::coin::Coin<0x2::iota::IOTA> │ +│ │ Version: 2 │ +│ │ Digest: aennzwscgtoZmsGK1kcPq7VQobC1uYk1pj8oADhjCtj │ +│ └── │ +╰──────────────────────────────────────────────────────────────────────────────────────────────────╯ +╭───────────────────────────────────────────────────────────────────────────────────────────────────╮ +│ Balance Changes │ +├───────────────────────────────────────────────────────────────────────────────────────────────────┤ +│ ┌── │ +│ │ Owner: Account Address ( 0xa5657935a0698bf654ce4ceb66b5a6d6a371a934a6afcfd1e191aa2ee460c8cc ) │ +│ │ CoinType: 0x2::iota::IOTA │ +│ │ Amount: 1000000000 │ +│ └── │ +╰───────────────────────────────────────────────────────────────────────────────────────────────────╯ +Dry run completed, execution status: success +Estimated gas cost (includes a small buffer): 3960800 NANOS +``` + +
+ +### `dev-inspect` Example + +```bash +iota client ptb \ +--move-call iota::tx_context::sender \ +--assign sender \ +--split-coins gas "[1000000000]" \ +--assign coin \ +--transfer-objects "[coin]" sender \ +--dev-inspect +``` + +
+Output: + +```bash +Dev inspect completed, execution status: success +╭───────────────────────────────────────────────────────────────────────────────────────────────────╮ +│ Transaction Effects │ +├───────────────────────────────────────────────────────────────────────────────────────────────────┤ +│ Digest: DkkfwFB3qqojaKaijocXhWYwHhDysEQEceZpwDBaoBgv │ +│ Status: Success │ +│ Executed Epoch: 67 │ +│ │ +│ Created Objects: │ +│ ┌── │ +│ │ ID: 0x66cb2f98a4cbb9da278e197ec7fe675f9e47b12c13aac731c94f46d29153d425 │ +│ │ Owner: Account Address ( 0xa5657935a0698bf654ce4ceb66b5a6d6a371a934a6afcfd1e191aa2ee460c8cc ) │ +│ │ Version: 2 │ +│ │ Digest: Zy4jEt7kaFEjeaFRnbw9BRSo8CJibJXD2JtLeVe3duc │ +│ └── │ +│ Mutated Objects: │ +│ ┌── │ +│ │ ID: 0xbb846ea192d85cd7088f05571b0a324dbecd3e4d8cb0144af1383adbcc143644 │ +│ │ Owner: Account Address ( 0xa5657935a0698bf654ce4ceb66b5a6d6a371a934a6afcfd1e191aa2ee460c8cc ) │ +│ │ Version: 2 │ +│ │ Digest: 9nZx2QNK7hvBDXLHQazCg4p32pfGcXtXJ3HrEuYGgnjH │ +│ └── │ +│ Gas Object: │ +│ ┌── │ +│ │ ID: 0xbb846ea192d85cd7088f05571b0a324dbecd3e4d8cb0144af1383adbcc143644 │ +│ │ Owner: Account Address ( 0xa5657935a0698bf654ce4ceb66b5a6d6a371a934a6afcfd1e191aa2ee460c8cc ) │ +│ │ Version: 2 │ +│ │ Digest: 9nZx2QNK7hvBDXLHQazCg4p32pfGcXtXJ3HrEuYGgnjH │ +│ └── │ +│ Gas Cost Summary: │ +│ Storage Cost: 1960800 NANOS │ +│ Computation Cost: 1000000 NANOS │ +│ Storage Rebate: 0 NANOS │ +│ Non-refundable Storage Fee: 0 NANOS │ +│ │ +│ Transaction Dependencies: │ +│ AS3GZusoMp8xxPvPBvwbUYnPPH7GxVNxnjkgLXzQAPPk │ +╰───────────────────────────────────────────────────────────────────────────────────────────────────╯ +╭─────────────────────────────╮ +│ No transaction block events │ +╰─────────────────────────────╯ +Execution Result + Return values + IOTA TypeTag: IotaTypeTag("address") + Bytes: [165, 101, 121, 53, 160, 105, 139, 246, 84, 206, 76, 235, 102, 181, 166, 214, 163, 113, 169, 52, 166, 175, 207, 209, 225, 145, 170, 46, 228, 96, 200, 204] + Mutable Reference Outputs + IOTA Argument: GasCoin + IOTA TypeTag: IotaTypeTag("0x2::coin::Coin<0x2::iota::IOTA>") + Bytes: [187, 132, 110, 161, 146, 216, 92, 215, 8, 143, 5, 87, 27, 10, 50, 77, 190, 205, 62, 77, 140, 176, 20, 74, 241, 56, 58, 219, 204, 20, 54, 68, 0, 210, 206, 244, 220, 0, 0, 0] + Return values + IOTA TypeTag: IotaTypeTag("0x2::coin::Coin<0x2::iota::IOTA>") + Bytes: [102, 203, 47, 152, 164, 203, 185, 218, 39, 142, 25, 126, 199, 254, 103, 95, 158, 71, 177, 44, 19, 170, 199, 49, 201, 79, 70, 210, 145, 83, 212, 37, 0, 202, 154, 59, 0, 0, 0, 0] +``` + +
+ +The following example is only possible with `dev-inspect` as it returns a borrowed value from a function: + +```bash +iota client ptb \ +--assign hello_option "some('Hello')" \ +--move-call std::option::borrow "" hello_option \ +--dev-inspect +``` + +Result section from the output: +``` +Execution Result + Return values + IOTA TypeTag: IotaTypeTag("0x1::string::String") + Bytes: [5, 72, 101, 108, 108, 111] +``` \ No newline at end of file From c4db383e4bedb739391834ed913a0f3bfaf98e92 Mon Sep 17 00:00:00 2001 From: Lucas Tortora <85233773+lucas-tortora@users.noreply.github.com> Date: Mon, 27 Jan 2025 11:10:47 -0300 Subject: [PATCH 06/51] fix(devx): Change Sidebar Label for Ts SDK's IotaClient (#5033) --- docs/content/ts-sdk/typescript/iota-client.mdx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/content/ts-sdk/typescript/iota-client.mdx b/docs/content/ts-sdk/typescript/iota-client.mdx index c247114639d..cfdd6e6a83e 100644 --- a/docs/content/ts-sdk/typescript/iota-client.mdx +++ b/docs/content/ts-sdk/typescript/iota-client.mdx @@ -1,3 +1,7 @@ +--- +sidebar_label: IotaClient +--- + # Network Interactions with IotaClient The IOTA TypeScript SDK provides a `IotaClient` class to connect to a network's JSON-RPC server. Use From 7a3da10ab1345d331a64b8bf28f9718693193c19 Mon Sep 17 00:00:00 2001 From: DaughterOfMars Date: Mon, 27 Jan 2025 09:41:11 -0500 Subject: [PATCH 07/51] don't cancel in progress on develop (#5034) --- .github/workflows/_cargo_deny.yml | 2 +- .github/workflows/_docs_lint.yml | 2 +- .github/workflows/_docusaurus.yml | 2 +- .github/workflows/_e2e.yml | 2 +- .github/workflows/_ledgernano.yml | 2 +- .github/workflows/_move_ide.yml | 2 +- .github/workflows/_rust_lints.yml | 2 +- .github/workflows/_typos.yml | 2 +- .github/workflows/hierarchy.yml | 4 ++-- .github/workflows/preview_wiki.yml | 2 +- 10 files changed, 11 insertions(+), 11 deletions(-) diff --git a/.github/workflows/_cargo_deny.yml b/.github/workflows/_cargo_deny.yml index aab5dac50a3..586228450f5 100644 --- a/.github/workflows/_cargo_deny.yml +++ b/.github/workflows/_cargo_deny.yml @@ -10,7 +10,7 @@ on: concurrency: group: cargo-deny-${{ inputs.manifest-path || './Cargo.toml' }}-${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} - cancel-in-progress: true + cancel-in-progress: ${{ github.ref != 'refs/heads/develop' }} jobs: bans-licenses-sources: diff --git a/.github/workflows/_docs_lint.yml b/.github/workflows/_docs_lint.yml index 35314d3f409..932219fe015 100644 --- a/.github/workflows/_docs_lint.yml +++ b/.github/workflows/_docs_lint.yml @@ -4,7 +4,7 @@ on: workflow_call concurrency: group: docs-lint-${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} - cancel-in-progress: true + cancel-in-progress: ${{ github.ref != 'refs/heads/develop' }} jobs: spelling: diff --git a/.github/workflows/_docusaurus.yml b/.github/workflows/_docusaurus.yml index e13b4f0e13b..dce810498b4 100644 --- a/.github/workflows/_docusaurus.yml +++ b/.github/workflows/_docusaurus.yml @@ -4,7 +4,7 @@ on: workflow_call concurrency: group: docusaurus-${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} - cancel-in-progress: true + cancel-in-progress: ${{ github.ref != 'refs/heads/develop' }} jobs: build: diff --git a/.github/workflows/_e2e.yml b/.github/workflows/_e2e.yml index 64a07525a37..c4cbf9539e0 100644 --- a/.github/workflows/_e2e.yml +++ b/.github/workflows/_e2e.yml @@ -25,7 +25,7 @@ on: concurrency: group: e2e-${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} - cancel-in-progress: true + cancel-in-progress: ${{ github.ref != 'refs/heads/develop' }} env: RUST_LOG: warn diff --git a/.github/workflows/_ledgernano.yml b/.github/workflows/_ledgernano.yml index 316714d376e..28ff06e5deb 100644 --- a/.github/workflows/_ledgernano.yml +++ b/.github/workflows/_ledgernano.yml @@ -4,7 +4,7 @@ on: workflow_call concurrency: group: ledgernano-${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} - cancel-in-progress: true + cancel-in-progress: ${{ github.ref != 'refs/heads/develop' }} jobs: ledgernano: diff --git a/.github/workflows/_move_ide.yml b/.github/workflows/_move_ide.yml index d6fba17c64c..08930145660 100644 --- a/.github/workflows/_move_ide.yml +++ b/.github/workflows/_move_ide.yml @@ -4,7 +4,7 @@ on: workflow_call concurrency: group: move-ide-${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} - cancel-in-progress: true + cancel-in-progress: ${{ github.ref != 'refs/heads/develop' }} jobs: move-auto-formatter-test: diff --git a/.github/workflows/_rust_lints.yml b/.github/workflows/_rust_lints.yml index 09235d70b1d..943d0c8232a 100644 --- a/.github/workflows/_rust_lints.yml +++ b/.github/workflows/_rust_lints.yml @@ -10,7 +10,7 @@ on: concurrency: group: rust-lints-${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} - cancel-in-progress: true + cancel-in-progress: ${{ github.ref != 'refs/heads/develop' }} env: CARGO_TERM_COLOR: always diff --git a/.github/workflows/_typos.yml b/.github/workflows/_typos.yml index 1747c0ca15a..0732bb13002 100644 --- a/.github/workflows/_typos.yml +++ b/.github/workflows/_typos.yml @@ -4,7 +4,7 @@ on: workflow_call concurrency: group: typos-${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} - cancel-in-progress: true + cancel-in-progress: ${{ github.ref != 'refs/heads/develop' }} jobs: run: diff --git a/.github/workflows/hierarchy.yml b/.github/workflows/hierarchy.yml index 4d333cd3f70..8d3465af6b0 100644 --- a/.github/workflows/hierarchy.yml +++ b/.github/workflows/hierarchy.yml @@ -47,7 +47,7 @@ jobs: runs-on: [self-hosted] concurrency: group: dprint-${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} - cancel-in-progress: true + cancel-in-progress: ${{ github.ref != 'refs/heads/develop' }} steps: - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 - name: Check dprint formatting @@ -60,7 +60,7 @@ jobs: name: license-check concurrency: group: license-${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} - cancel-in-progress: true + cancel-in-progress: ${{ github.ref != 'refs/heads/develop' }} needs: diff if: (!cancelled() && needs.diff.outputs.isRust == 'true') runs-on: [self-hosted] diff --git a/.github/workflows/preview_wiki.yml b/.github/workflows/preview_wiki.yml index fa9b9733b3a..53934398783 100644 --- a/.github/workflows/preview_wiki.yml +++ b/.github/workflows/preview_wiki.yml @@ -17,7 +17,7 @@ on: concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} - cancel-in-progress: true + cancel-in-progress: ${{ github.ref != 'refs/heads/develop' }} jobs: wiki-preview: From 4c85a6efca4372e730bb491b51a3b52c59f4e771 Mon Sep 17 00:00:00 2001 From: vivekjain23 <165671934+vivekjain23@users.noreply.github.com> Date: Mon, 27 Jan 2025 20:17:52 +0530 Subject: [PATCH 08/51] feat(docs): shared object example (#4789) * Create shared object example docs * Add docs path * Minor fixes * Resolve comments * Minor fixes * Minor fixes --- .../objects/shared-object-example.mdx | 56 +++++++++++++++++++ docs/content/sidebars/developer.js | 1 + 2 files changed, 57 insertions(+) create mode 100644 docs/content/developer/iota-101/objects/shared-object-example.mdx diff --git a/docs/content/developer/iota-101/objects/shared-object-example.mdx b/docs/content/developer/iota-101/objects/shared-object-example.mdx new file mode 100644 index 00000000000..4942411fb43 --- /dev/null +++ b/docs/content/developer/iota-101/objects/shared-object-example.mdx @@ -0,0 +1,56 @@ +--- +title: Shared Object Example +description: An example of how to efficiently utilize shared objects. +--- + +# Shared Object Example + +In the [previous sections](./shared-owned.mdx), we discussed comparing a shared object with an owned object. In this guide, we will create a smart contract that can receive objects to a shared object and transfer them to gain a deeper understanding of shared objects. + +## Create Move Package + +To [create a new move package](../../getting-started/create-a-package.mdx) run the following command: + +```shell +iota move new transfer-to-shared-object +``` +## Package Overview + +In this example, we will create a package that allows users to create new shared objects of type [`SharedCoins`](https://github.com/iotaledger/iota/blob/0494dad2b1d64c054795bac75342597e2eda1e9a/examples/move/transfer-to-shared-object/sources/shared_coins.move#L11-L14), delete them, add new coins to the [`SharedCoins`](https://github.com/iotaledger/iota/blob/0494dad2b1d64c054795bac75342597e2eda1e9a/examples/move/transfer-to-shared-object/sources/shared_coins.move#L11-L14), and transfer coins to a recipient address from a [`SharedCoins`](https://github.com/iotaledger/iota/blob/0494dad2b1d64c054795bac75342597e2eda1e9a/examples/move/transfer-to-shared-object/sources/shared_coins.move#L11-L14). + +[`SharedCoins`](https://github.com/iotaledger/iota/blob/0494dad2b1d64c054795bac75342597e2eda1e9a/examples/move/transfer-to-shared-object/sources/shared_coins.move#L11-L14) will hold IOTA coins, enabling anyone to deposit and withdraw coins from it. + +### [`create`](https://github.com/iotaledger/iota/blob/0494dad2b1d64c054795bac75342597e2eda1e9a/examples/move/transfer-to-shared-object/sources/shared_coins.move#L16-L22) + +This function initializes a shared object with an empty array named `coins`. + +```move reference +https://github.com/iotaledger/iota/blob/0494dad2b1d64c054795bac75342597e2eda1e9a/examples/move/transfer-to-shared-object/sources/shared_coins.move#L16-L22 +``` + +### [`delete`](https://github.com/iotaledger/iota/blob/0494dad2b1d64c054795bac75342597e2eda1e9a/examples/move/transfer-to-shared-object/sources/shared_coins.move#L25-L29) + +This function destroys the `SharedCoins` shared object. + +```move reference +https://github.com/iotaledger/iota/blob/0494dad2b1d64c054795bac75342597e2eda1e9a/examples/move/transfer-to-shared-object/sources/shared_coins.move#L25-L29 +``` + +### [`deposit_coin`](https://github.com/iotaledger/iota/blob/0494dad2b1d64c054795bac75342597e2eda1e9a/examples/move/transfer-to-shared-object/sources/shared_coins.move#L31-L38) + +This function deposits IOTA coins into `SharedCoins` by adding them to the `coins` array of `SharedCoins`. +Before using this function, ensure that some IOTA coins have been transferred to the address/object ID of the `SharedCoins` object. +For the `coin` parameter, provide the address/object ID of the IOTA coin you transferred to `SharedCoins`. For further details, refer to [Receiving](../../../references/framework/iota-framework/transfer.mdx#0x2_transfer_Receiving) and [public_receive](../../../references/framework/iota-framework/transfer.mdx#function-public_receive). + +```move reference +https://github.com/iotaledger/iota/blob/0494dad2b1d64c054795bac75342597e2eda1e9a/examples/move/transfer-to-shared-object/sources/shared_coins.move#L31-L38 +``` + +### [`transfer_coin`](https://github.com/iotaledger/iota/blob/0494dad2b1d64c054795bac75342597e2eda1e9a/examples/move/transfer-to-shared-object/sources/shared_coins.move#L41-L48) + +This function transfers an IOTA coin to the specified `recipient` address. It removes the coin object from the `coins` array and utilizes the [`public_transfer`](../../../references/framework/iota-framework/transfer.mdx#function-public_transfer) function to complete the transfer. + +```move reference +https://github.com/iotaledger/iota/blob/0494dad2b1d64c054795bac75342597e2eda1e9a/examples/move/transfer-to-shared-object/sources/shared_coins.move#L41-L48 +``` +- You can view the complete contract code [here](https://github.com/iotaledger/iota/blob/0494dad2b1d64c054795bac75342597e2eda1e9a/examples/move/transfer-to-shared-object/sources/shared_coins.move). diff --git a/docs/content/sidebars/developer.js b/docs/content/sidebars/developer.js index 5cf53de9dc2..1c96f8c3a9f 100644 --- a/docs/content/sidebars/developer.js +++ b/docs/content/sidebars/developer.js @@ -117,6 +117,7 @@ const developer = [ items: [ 'developer/iota-101/objects/object-model', 'developer/iota-101/objects/shared-owned', + 'developer/iota-101/objects/shared-object-example', { type: 'category', label: 'Object Ownership', From ec9f7eb166f04f04d0ca74e7f95f5db97dd74d40 Mon Sep 17 00:00:00 2001 From: salaheldinsoliman <49910731+salaheldinsoliman@users.noreply.github.com> Date: Mon, 27 Jan 2025 15:55:28 +0100 Subject: [PATCH 09/51] fix(docs): edit sequence diagrams in sponsored-tx article (#4796) * fix(docs): edit sequence diagrams in sponsored-tx Signed-off-by: salaheldinsoliman * Update docs/content/developer/iota-101/transactions/sponsored-transactions/about-sponsored-transactions.mdx Co-authored-by: Lucas Tortora <85233773+lucas-tortora@users.noreply.github.com> * fix: fix similar images Signed-off-by: salaheldinsoliman * Apply suggestions from code review Co-authored-by: Dr-Electron --------- Signed-off-by: salaheldinsoliman Co-authored-by: Lucas Tortora <85233773+lucas-tortora@users.noreply.github.com> Co-authored-by: Dr-Electron --- .../about-sponsored-transactions.mdx | 9 +++++++-- .../sponsored-proposed-tx.png | Bin 0 -> 55073 bytes .../sponsored-transactions/sponsored-txn.png | Bin 54769 -> 0 bytes .../user-proposed-tx-1.png | Bin 0 -> 61664 bytes .../user-proposed-tx-2.png | Bin 0 -> 68682 bytes .../user-proposed-txn.png | Bin 151771 -> 0 bytes 6 files changed, 7 insertions(+), 2 deletions(-) create mode 100755 docs/site/static/img/developer/iota-101/transactions/sponsored-transactions/sponsored-proposed-tx.png delete mode 100644 docs/site/static/img/developer/iota-101/transactions/sponsored-transactions/sponsored-txn.png create mode 100755 docs/site/static/img/developer/iota-101/transactions/sponsored-transactions/user-proposed-tx-1.png create mode 100755 docs/site/static/img/developer/iota-101/transactions/sponsored-transactions/user-proposed-tx-2.png delete mode 100644 docs/site/static/img/developer/iota-101/transactions/sponsored-transactions/user-proposed-txn.png diff --git a/docs/content/developer/iota-101/transactions/sponsored-transactions/about-sponsored-transactions.mdx b/docs/content/developer/iota-101/transactions/sponsored-transactions/about-sponsored-transactions.mdx index 12afbfafeb0..b9967814efd 100644 --- a/docs/content/developer/iota-101/transactions/sponsored-transactions/about-sponsored-transactions.mdx +++ b/docs/content/developer/iota-101/transactions/sponsored-transactions/about-sponsored-transactions.mdx @@ -104,14 +104,19 @@ There are three common workflows for sponsored transactions: #### User-Proposed Transaction In this flow, the user initiates the transaction and requests sponsorship. +There are two possible scenarios -![User-Proposed Transaction](/img/developer/iota-101/transactions/sponsored-transactions/user-proposed-txn.png) +##### The gas station responds with the signed transaction and the signature, and the user submits the transaction to the network: +![User-Proposed Transaction](/img/developer/iota-101/transactions/sponsored-transactions/user-proposed-tx-1.png) + +##### The gas station submits the transaction to the network on behalf of the user: +![User-Proposed Transaction](/img/developer/iota-101/transactions/sponsored-transactions/user-proposed-tx-2.png) #### Sponsor-Proposed Transaction Here, the sponsor initiates the transaction, and the user must approve and sign it. -![Sponsor-Proposed Transaction](/img/developer/iota-101/transactions/sponsored-transactions/sponsored-txn.png) +![Sponsor-Proposed Transaction](/img/developer/iota-101/transactions/sponsored-transactions/sponsored-proposed-tx.png) #### Wildcard Gas Payment diff --git a/docs/site/static/img/developer/iota-101/transactions/sponsored-transactions/sponsored-proposed-tx.png b/docs/site/static/img/developer/iota-101/transactions/sponsored-transactions/sponsored-proposed-tx.png new file mode 100755 index 0000000000000000000000000000000000000000..1f82c621d0669051916359e877bddd65e58245c5 GIT binary patch literal 55073 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 LJ5x7f(Z+uPQ9|Fz diff --git a/docs/site/static/img/developer/iota-101/transactions/sponsored-transactions/user-proposed-tx-1.png b/docs/site/static/img/developer/iota-101/transactions/sponsored-transactions/user-proposed-tx-1.png new file mode 100755 index 0000000000000000000000000000000000000000..d23cb0aea92afcab3c23e1b8701ea8caf323c18b GIT binary patch literal 61664 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�hV{Lo19y)_$>GwaOQR1>+dxv< z8ASg3ibea$dP|9=3Hrs%Un`-MXu_r78rJ643}P@!mcf}Cj=-wdLtPa!Uj zn#!X51~)#>zifCsdJsnut1=&`5}@_ATN4;2z<|6Xo!o5}{{?bKt7ruxId7Y4UQJn5 zl#F=RGpm~WLHYFldKYf{yT@-Nh39K<6(1R{rUs%XJ|O-iuQ=0GWorK0|9{|_09TTC z-JnSlhJmO=QH$waKA=baGVDjrVq}tiSM&%_xZ7 ziF=t%>!7G;b0e$9(3==Fw<3!ZP*GVKRbrZ*on6gatb$XR^Yxw^Ji>0nmnUPhH^cQI zn?w&}J`KCky02peEr!-K!48p75+P2n+Ho>Il}ZZ1zirYlh^-9L+q-I1&o7e}*u6J) zz0p*|`Ox9d;P1%Gc(7z5o zSS9*MA*3xkdVpsYYZjU3>c4%vL|hDSV*Ft#%k~V?jZiFDvP2%_Zczg1r7~{q1C&}G zxBf@r;YDAwnki1Rzz+_1c&Lo>DfsCDJ2WpZ&t@fgHv5m-OyGmHqfAEi#I4Rb@Z~BA z2ZWjc%$aD&e36l{^zIgA!j{Mya`Cy#Zm(Tk8$}PAGqlJbb#>4thDfMX=#%#e`Xz0F z-VJ)Upl}N{2HW&;No*XIyj?r<)*nlG#FiH9VavbohOaS(ZS-q)T=nmruQ)YoL}zzG zyj5gKq6fgoCka~GQ%I{q&f~vD7S4a7bTWaMhE7A#YfAnqh%xt^wFKQCca?Ccjt1Kd z`XF(5qRFzY(%tvzLFqi)5~vfHA#3*8ve5%178KgND707 zG~Xj!Q79YWo9t zkkL~n5POPBO1k&50DTngo=f9gW0f{9rad@G6lHvFbT4p*shxjK4Pa}`7}d}4~Wp;+*;EP+htCpmr?`` zmO^WYr=}7uXx*D_Z0^3hS9an&0V6VFaHh}1OUo)4vlT>HX5$)!KMywq8&01>ix89|r#4;l$X+v)kC z8wfwyw}`?nlx-zV8Y^V`o<4o*pZEdV8@L-ly}%tvP_O(P<);slSCGG{aA-rpPn8cK zdqmvCfkIXW<5o;#8OPPKMXUt~*$KkFuwz$Ur}xLKpuX z#GfRfH4rL&NYiX=Y*_8#w--gaJP@V-8Z@LMtT9L@)n!eH!s7CUbKQogOL$6v5?N%y*3zPg2cc>n`U zw4w;d<>W*Q8bLAz?6_xDpUT7@hFc@L`q8I+=hj%)7ZlUR%cWcWzm_2BeVc>=fsbRB z)WHe>S!+2AQnZJ3QeAdC|HNWrseCe%*pko%7Yzk2hDMTMfs{I*4*{+aGJvpsLX(|D zLjvHsFqfjTOxjQn81G$%(?3U5r93C<7?DLabaB|tCQh&xW-T5M=YYjD0ei|quJYS_q-oly23K(hn& zz4*#n(#N4lj%2qMi!XYcFQUtaSyS0!KxiQBE@K}gG&Dap-`DS-*g9`ls*g^03((w} z56^dre2(fh&$NBLQ}JIUuG<+O=PCTuhyxd}uDB(Uq(j!F4d!m}tW;18!T=3u{lG{G z*ay7*YF?zb6Ns8H54_k!Gxe^^M)&U3>&d?;nwj2J-Hww>!%z{p17 z{s6Gza0N@RYs;+g76Q1#cE4wD(Asbdf6~XTe)E%Yr0k;Eh#d}_3yMt4&%aOX z=SNqv=tY+wxs&AdrgNg4p4NadB6>6lg;f`Bknk2w05k-? z2;QyxBVQUU!pdP0MK%k5oT8@a4uDC$v1d?<*%=6vcmhfwd;I--QOb(3aOqY=0TSDe z!J{@Rv;bi)`;OUca^Oq3qm^i<4|4sf%=4| zFB%ppvpcx_UN<@AL#MI?pRu*WP5K(-D8d{na$5b3W(udB3mgdM(%W9$_);s)709r$Kg^OS@=JEx(=g$ah%VQ62&3gU|Qs^6=czWAm5He5S>R(xF51qT)vFAMH*X z+-g}t1%OENPD0X#!+!7n|eT;L?ua z*$*Y!u8NGn5?juLd-?3ya>r|lAF|!a2U>>Dc3^oTrQ0D%CC&>UQg!&Z*TivazT<>& zll@KVD9qoE;97t8Sy1)A6pGEgUY_4IHPX(1h=)CiWTKtjKHbgB9+0)WLqbAmEHr@s zbN8)P_41jMYkO~cjh=P^pDdnwTgX;--;JM1(_yf+1AqGI&Ff)RuT(#i_l04(Np$Y{ zwxb=dT(f#Lcw_AQ?sckOa;d1EeuLfVPJ6G;-c8?tZtUeFlkn0_?ba-2bK|O480E<; zHg4RAt-Nr?cY5a8ceM+Qs_&9^hk4AeI>rIvB|iIw?Ch-@8{fk&!j}DP&Ec+^vkbrr zgQB%RIdj7W7Q0XoqH9j-TZEna^s-Iw5L@+e3ZId+y)70q!O#BG+}~(u zGf|}=f~GB6ENqa$=>90mJ>sQGTUk-;+10>cI3e4P^^uMO#HJmi zbwQ7+C|v4kL-NpX(&Q-he&+E>R(}1*Qyip$bJ8eF%xI^kqV+Aj$T1%iSxRYG88>a& zQh@Rwqv0F-SC&6W45!v}!+ajgwp!b7l!XP$b{rp)f?50fFk8e1LCP*95_bw%m3$~78Vl>5!-VZ5$j@0_F0%1a& zc(|?1+|JM#6ox4|V+YN0M;OQ*0l9QNC&!We<*Ph){J0bLPB(n3u|ywT=^fJ&TCUr= z7H0M<%S|2us8K@{l;I*~NZJbRl3#v<>QeJ~nzn2iMja^|Oxu@Wmo*T87>$l);&5?_ zHjR#T2vQY^&YB2VG9!nb{?7C32T!^E{m3sUPR@YdBy4nrr%`rr5;{POrV=|#Hw6ud za7;{K;-*qX9a-|`%{`!IICVlku{N$edu{3XtAG5Fai{4&{t?7Snw4DddUc z-=k}ADH15u7fO9?;1MMcWrohpmU6~s_Uxk)JO~_N(EM5@uEUjunYLPerW&<=h|oTj za!(FOOb3**O1qk&^Tw?*U6~(DpI6u3y{)O^2xqp827&1=R(!ou z?`qv$r%#uf%sQ$Zf9R))7(32GBL`8}d@3(bnjP~ft|9z$R^M5KF^Q(KQ^{`qX8m59 zd9~A;ZM7g~unW@B+MBj%a{|xHXf1%=@Nqr8uM6kR*^_74*`r6q)M=4+S3VCKl>O21 z-CxFc2b^7zd#@v>?9E8oz9^0ML-bTX2$wLPWL8wCo!E;^G>;40RbS>4&wBdp4VXPK z5iBE(G_1hvpF8^GK#Sz`g=u9I$-<+6KZQ&h43s_=9Gpuzlb;;4g;0NtxqB~6-!pyq zKEUD(Rn66F*9vIzv89bqU~ZZ4Z+_Tj$|J` z?QB$Ffy&D20d%0OZsQ?C9H^Cjl!cGuCzF9DQ;oiS`ZN&t)3hCBA3i)l;&MR=Yddt^ zbcFnWS#8G$50%j~OyO2)GENSge_EDMf0yamp%)u>vdkq~gik+ziW18ZIY(6$X=ryG z4FJ}wUq8m=$4)BwuCiPSmE#W&o{BWy>ZfG^n)oeSwn(qf?E`&A!MN;AOiYBoT-f^j zYE$y>J-nG{pxti!n@;BaLM2u-Z|-Zlv5CwcPnaXau07EH<=!F|1xNMO6fS3fPUuRov6zWK%G(P@Taq=!y?-YBHu z^UDij?N=gJv8~*FYbwll(}ApYd0xv@p->OLmlzb#lXS=S?rLWCID6g`t1(tqXHCqj zv!+_x*r?el>X)rQK+Jx9TT_;`=$j80h^$ zf?)o}IfJ3m@$vDpAH*b5vrpA)%o}%5|1rYE#AH0>emdPu=@_SOqXT6dR!3QV=i1&z zKX$U*b~3AvK0H7;gyJ-;P(d`9w+yRS^(N|HS8q0G=SF@_hZ`|ek#$e4=vRFWS6i<) z@RnYS(OLxI`LD)Q|Jr*%O$+@7kX(CRo*(e8{+-d_+TVUseBVi3yZVTmCwH0Q#Q0Z}t0m)f^u1 z>u}L%B;Ox2bC1)Ft^RoP8oeIIEA*{k4Z5Xt=*7L$z9=eknER^wl8t_=r#~?Oi)*;7 za#mc|lv2>Ft#%T2a09a*Rc~*u8WHeo%@w7gBO}tgsFp8VX7sK!YU*iAigzES4lJ^1 z-M4y8%a`%Y1e58vY6^AWxV6!bmxZp=b5? z52*K}(K9P|W}Wm!W~2bi`8jFD;>9N(=T|RA^UFV$}xrhP}YnK)&BeL-yT?< zU;ekA$ba#W54@fs*Vb+@m2majH!`yPUwH6_Lh{Y+??)8IiIrSbLy*v=5|OsDBj#7=O#mVgn^gq zeD_^G7RJ3tjvS!{Gn}xRN8_olvI2(kKKxM`|CP1l@yS^mnLHeU8WTpYFVD)U?7Zhj zFyCte75Q0Cr9dmn50di7s8q>RP&nf| z&zn0pl)Voz=L2V0RM3u_?)34^Q*h^A%KI|Rjo8C9W5$fJX5x=B4^_u{%ouNo00Rir z!bj(AU@%(sp8G3HQ>i*NrQ5+F9vA3=>cLmUBray5du4x}f9%0D&MnL+H%8627&WSZ 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

BAZuEi@LwuTbom^6ja2{-W&ddZWI&msjc6 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 TbPf}7my-PD?do>IIXHqz;IeMkS7wFw!1i90F3 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%0DmxPyB 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 G@;?AtGNjS~ From 495fc843823e7c8bb3b4ca4c0d277d7e728c6043 Mon Sep 17 00:00:00 2001 From: Gino Osahon Date: Mon, 27 Jan 2025 17:14:04 +0100 Subject: [PATCH 10/51] update(docs) fix typo in getting started section (#5039) --- docs/content/developer/getting-started/connect.mdx | 2 +- docs/content/developer/getting-started/local-network.mdx | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/content/developer/getting-started/connect.mdx b/docs/content/developer/getting-started/connect.mdx index 82383955f8d..d300f4e5714 100644 --- a/docs/content/developer/getting-started/connect.mdx +++ b/docs/content/developer/getting-started/connect.mdx @@ -126,7 +126,7 @@ localnet => http://0.0.0.0:9000 (active) testnet => https://api.testnet.iota.cafe ``` -You can add a new environment using the `iota client new` command. You should specify and `alias` and `rpc` URL, for +You can add a new environment using the `iota client new` command. You should specify an `alias` and `rpc` URL, for example: ```bash diff --git a/docs/content/developer/getting-started/local-network.mdx b/docs/content/developer/getting-started/local-network.mdx index 999595ef100..3645a7b6aa1 100644 --- a/docs/content/developer/getting-started/local-network.mdx +++ b/docs/content/developer/getting-started/local-network.mdx @@ -139,8 +139,8 @@ or public one, you must pass the URL to the faucet server. :::note IOTA Wallet -To send coins to a -IOTA Wallet is connected to your local network. See [Set up a local IOTA Wallet](#set-up-a-local-iota-wallet). You can use +To send coins to an +IOTA Wallet that is connected to your local network. See [Set up a local IOTA Wallet](#set-up-a-local-iota-wallet). You can use the address for the local IOTA Wallet with the faucet. ::: From 6b5cb5cfc9457e60c07de3fe285e534d134cefcc Mon Sep 17 00:00:00 2001 From: Dr-Electron Date: Mon, 27 Jan 2025 19:30:50 +0100 Subject: [PATCH 11/51] fix(docs): fix statement about gas fees (#5043) --- .../sponsored-transactions/about-sponsored-transactions.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/content/developer/iota-101/transactions/sponsored-transactions/about-sponsored-transactions.mdx b/docs/content/developer/iota-101/transactions/sponsored-transactions/about-sponsored-transactions.mdx index b9967814efd..1464e969569 100644 --- a/docs/content/developer/iota-101/transactions/sponsored-transactions/about-sponsored-transactions.mdx +++ b/docs/content/developer/iota-101/transactions/sponsored-transactions/about-sponsored-transactions.mdx @@ -11,7 +11,7 @@ Sponsored transactions are a powerful feature in the IOTA blockchain that allow ## Understanding Sponsored Transactions -On the IOTA network, executing a transaction requires a gas payment, which is a list of [`0x2::coin::Coin<0x2::iota::IOTA>`](../../../../references/framework/iota-framework/coin.mdx) objects paid to validators to secure the network. +On the IOTA network, executing a transaction requires a gas payment, which is a list of [`0x2::coin::Coin<0x2::iota::IOTA>`](../../../../references/framework/iota-framework/coin.mdx) objects that get burned. While gas fees are essential to the [IOTA tokenomics](../../../../about-iota/tokenomics/tokenomics.mdx), they can present challenges for new users, especially those accustomed to traditional web applications. Sponsored transactions aim to simplify the onboarding process by allowing transactions to be executed without the user having to provide the gas payment themselves. Instead, a sponsor covers the gas fees, enhancing the user experience and reducing friction. From 5e4eed59934983288352282df2fad9e6f56e0196 Mon Sep 17 00:00:00 2001 From: Marc Espin Date: Mon, 27 Jan 2025 19:32:05 +0100 Subject: [PATCH 12/51] feat(wallet): Update host permissions (#5011) --- apps/wallet/src/manifest/manifest.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/apps/wallet/src/manifest/manifest.json b/apps/wallet/src/manifest/manifest.json index f768672d907..9847c5479b1 100644 --- a/apps/wallet/src/manifest/manifest.json +++ b/apps/wallet/src/manifest/manifest.json @@ -10,7 +10,12 @@ "action": { "default_popup": "ui.html?type=popup" }, - "host_permissions": ["https://api.devnet.iota.cafe/", "https://api.testnet.iota.cafe/"], + "host_permissions": [ + "http://localhost:9000/", + "http://localhost:9124/", + "http://*/*", + "https://*/*" + ], "icons": { "16": "manifest/icons/iota-icon-16.png", "32": "manifest/icons/iota-icon-32.png", From f8e45d8839e9972847a702d79aacbed008da7d41 Mon Sep 17 00:00:00 2001 From: Dr-Electron Date: Mon, 27 Jan 2025 19:34:04 +0100 Subject: [PATCH 13/51] chore(docs): format rust code in sponsored tx code (#5044) --- .../about-sponsored-transactions.mdx | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/docs/content/developer/iota-101/transactions/sponsored-transactions/about-sponsored-transactions.mdx b/docs/content/developer/iota-101/transactions/sponsored-transactions/about-sponsored-transactions.mdx index 1464e969569..e070e4a86ff 100644 --- a/docs/content/developer/iota-101/transactions/sponsored-transactions/about-sponsored-transactions.mdx +++ b/docs/content/developer/iota-101/transactions/sponsored-transactions/about-sponsored-transactions.mdx @@ -61,25 +61,25 @@ A transaction in IOTA has a specific data structure, which can be represented as ```rust pub struct SenderSignedTransaction { -pub intent_message: IntentMessage, -/// A list of signatures signed by all transaction participants. -/// 1. Non-participant signatures must not be present. -/// 2. Signature order does not matter. -pub tx_signatures: Vec, + pub intent_message: IntentMessage, + /// A list of signatures signed by all transaction participants. + /// 1. Non-participant signatures must not be present. + /// 2. Signature order does not matter. + pub tx_signatures: Vec, } pub struct TransactionDataV1 { // <-- A variant of `TransactionData` -pub kind: TransactionKind, // <-- This contains the transaction details -pub sender: IOTAAddress, -pub gas_data: GasData, -pub expiration: TransactionExpiration, + pub kind: TransactionKind, // <-- This contains the transaction details + pub sender: IOTAAddress, + pub gas_data: GasData, + pub expiration: TransactionExpiration, } pub struct GasData { -pub payment: Vec, -pub owner: IOTAAddress, -pub price: u64, -pub budget: u64, + pub payment: Vec, + pub owner: IOTAAddress, + pub price: u64, + pub budget: u64, } ``` From 1e860950c079a80033000a00b52dbf9999fba2e5 Mon Sep 17 00:00:00 2001 From: Thibault Martinez Date: Tue, 28 Jan 2025 09:39:37 +0100 Subject: [PATCH 14/51] feat(iota): `KeyToolCommand::UpdateAlias` accepts a key identity instead of an alias (#5040) --- crates/iota/src/key_identity.rs | 10 ++++++++++ crates/iota/src/keytool.rs | 10 +++++++--- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/crates/iota/src/key_identity.rs b/crates/iota/src/key_identity.rs index eca7cff6d3f..9f3a8c0f6d6 100644 --- a/crates/iota/src/key_identity.rs +++ b/crates/iota/src/key_identity.rs @@ -62,3 +62,13 @@ pub fn get_identity_address_from_keystore( KeyIdentity::Alias(x) => Ok(*keystore.get_address_by_alias(x)?), } } + +pub fn get_identity_alias_from_keystore( + input: KeyIdentity, + keystore: &Keystore, +) -> Result { + match input { + KeyIdentity::Address(x) => Ok(keystore.get_alias_by_address(&x)?), + KeyIdentity::Alias(x) => Ok(x), + } +} diff --git a/crates/iota/src/keytool.rs b/crates/iota/src/keytool.rs index ca05ccd35f8..a8654f370de 100644 --- a/crates/iota/src/keytool.rs +++ b/crates/iota/src/keytool.rs @@ -58,7 +58,9 @@ use tabled::{ }; use tracing::info; -use crate::key_identity::{KeyIdentity, get_identity_address_from_keystore}; +use crate::key_identity::{ + KeyIdentity, get_identity_address_from_keystore, get_identity_alias_from_keystore, +}; #[derive(Subcommand)] #[command(rename_all = "kebab-case")] @@ -208,7 +210,8 @@ pub enum KeyToolCommand { /// Update an old alias to a new one. /// If a new alias is not provided, a random one will be generated. UpdateAlias { - old_alias: String, + /// An IOTA address or its alias. + key_identity: KeyIdentity, /// The alias must start with a letter and can contain only letters, /// digits, dots, hyphens (-), or underscores (_). new_alias: Option, @@ -800,9 +803,10 @@ impl KeyToolCommand { }) } KeyToolCommand::UpdateAlias { - old_alias, + key_identity, new_alias, } => { + let old_alias = get_identity_alias_from_keystore(key_identity, keystore)?; let new_alias = keystore.update_alias(&old_alias, new_alias.as_deref())?; CommandOutput::UpdateAlias(AliasUpdate { old_alias, From 32c6d20038428ebf04323450b7dc66428c031733 Mon Sep 17 00:00:00 2001 From: Thibault Martinez Date: Tue, 28 Jan 2025 11:31:49 +0100 Subject: [PATCH 15/51] chore(clippy): remove `useless_conversion` (#5027) --- crates/iota-core/src/authority.rs | 4 +--- .../src/authority/authority_per_epoch_store.rs | 10 ++-------- crates/iota-core/src/authority_server.rs | 2 +- .../iota-core/src/execution_cache/writeback_cache.rs | 1 - crates/iota-indexer/src/indexer_reader.rs | 1 - crates/iota-json-rpc/src/read_api.rs | 10 ++-------- iota-execution/latest/iota-move-natives/src/lib.rs | 4 +--- 7 files changed, 7 insertions(+), 25 deletions(-) diff --git a/crates/iota-core/src/authority.rs b/crates/iota-core/src/authority.rs index 3c171b3b59d..2a9fba2698b 100644 --- a/crates/iota-core/src/authority.rs +++ b/crates/iota-core/src/authority.rs @@ -4104,8 +4104,7 @@ impl AuthorityState { ) -> IotaResult> { let lock_info = self .get_object_cache_reader() - .get_lock(*object_ref, epoch_store) - .map_err(IotaError::from)?; + .get_lock(*object_ref, epoch_store)?; let lock_info = match lock_info { ObjectLockStatus::LockedAtDifferentVersion { locked_ref } => { return Err(UserInputError::ObjectVersionUnavailableForConsumption { @@ -5005,7 +5004,6 @@ impl TransactionKeyValueStoreTrait for AuthorityState { ) -> IotaResult> { self.get_object_cache_reader() .get_object_by_key(&object_id, version) - .map_err(Into::into) } async fn multi_get_transactions_perpetual_checkpoints( diff --git a/crates/iota-core/src/authority/authority_per_epoch_store.rs b/crates/iota-core/src/authority/authority_per_epoch_store.rs index 2559670b5f1..1e31e6b93ec 100644 --- a/crates/iota-core/src/authority/authority_per_epoch_store.rs +++ b/crates/iota-core/src/authority/authority_per_epoch_store.rs @@ -1320,23 +1320,17 @@ impl AuthorityPerEpochStore { self.tables()? .get_last_consensus_index() .map(|x| x.unwrap_or_default()) - .map_err(IotaError::from) } pub fn get_last_consensus_stats(&self) -> IotaResult { - match self - .tables()? - .get_last_consensus_stats() - .map_err(IotaError::from)? - { + match self.tables()?.get_last_consensus_stats()? { Some(stats) => Ok(stats), // TODO: stop reading from last_consensus_index after rollout. None => { let indices = self .tables()? .get_last_consensus_index() - .map(|x| x.unwrap_or_default()) - .map_err(IotaError::from)?; + .map(|x| x.unwrap_or_default())?; Ok(ExecutionIndicesWithStats { index: indices.index, hash: indices.hash, diff --git a/crates/iota-core/src/authority_server.rs b/crates/iota-core/src/authority_server.rs index 98f11887069..9c49cd9c9ab 100644 --- a/crates/iota-core/src/authority_server.rs +++ b/crates/iota-core/src/authority_server.rs @@ -694,7 +694,7 @@ impl ValidatorService { .map(|(executed, spam_weight)| { ( tonic::Response::new(SubmitCertificateResponse { - executed: executed.map(|mut x| x.remove(0)).map(Into::into), + executed: executed.map(|mut x| x.remove(0)), }), spam_weight, ) diff --git a/crates/iota-core/src/execution_cache/writeback_cache.rs b/crates/iota-core/src/execution_cache/writeback_cache.rs index eb33845674e..8d913da0329 100644 --- a/crates/iota-core/src/execution_cache/writeback_cache.rs +++ b/crates/iota-core/src/execution_cache/writeback_cache.rs @@ -1324,7 +1324,6 @@ impl ObjectCacheRead for WritebackCache { |remaining| { self.record_db_multi_get("object_by_version", remaining.len()) .multi_get_objects_by_key(remaining) - .map_err(Into::into) }, ) } diff --git a/crates/iota-indexer/src/indexer_reader.rs b/crates/iota-indexer/src/indexer_reader.rs index ac3f9adb5fe..d757d32d085 100644 --- a/crates/iota-indexer/src/indexer_reader.rs +++ b/crates/iota-indexer/src/indexer_reader.rs @@ -321,7 +321,6 @@ impl IndexerReader { .into_iter() .map(EpochInfo::try_from) .collect::, _>>() - .map_err(Into::into) } pub fn get_latest_iota_system_state(&self) -> Result { diff --git a/crates/iota-json-rpc/src/read_api.rs b/crates/iota-json-rpc/src/read_api.rs index ffa66788fcf..fc8272170db 100644 --- a/crates/iota-json-rpc/src/read_api.rs +++ b/crates/iota-json-rpc/src/read_api.rs @@ -274,7 +274,7 @@ impl ReadApi { let unique_checkpoint_numbers = temp_response .values() - .filter_map(|cache_entry| cache_entry.checkpoint_seq.map(::from)) + .filter_map(|cache_entry| cache_entry.checkpoint_seq) // It's likely that many transactions have the same checkpoint, so we don't // need to over-fetch .unique() @@ -303,13 +303,7 @@ impl ReadApi { if cache_entry.checkpoint_seq.is_some() { // safe to unwrap because is_some is checked cache_entry.timestamp = *checkpoint_to_timestamp - .get( - cache_entry - .checkpoint_seq - .map(::from) - .as_ref() - .unwrap(), - ) + .get(cache_entry.checkpoint_seq.as_ref().unwrap()) // Safe to unwrap because checkpoint_seq is guaranteed to exist in // checkpoint_to_timestamp .unwrap(); diff --git a/iota-execution/latest/iota-move-natives/src/lib.rs b/iota-execution/latest/iota-move-natives/src/lib.rs index 3e8b0823dcd..17b1991f077 100644 --- a/iota-execution/latest/iota-move-natives/src/lib.rs +++ b/iota-execution/latest/iota-move-natives/src/lib.rs @@ -633,9 +633,7 @@ impl NativesCostTable { bls12381_g2_msm_base_cost_per_input: protocol_config .group_ops_bls12381_g2_msm_base_cost_per_input_as_option() .map(Into::into), - bls12381_msm_max_len: protocol_config - .group_ops_bls12381_msm_max_len_as_option() - .map(Into::into), + bls12381_msm_max_len: protocol_config.group_ops_bls12381_msm_max_len_as_option(), bls12381_pairing_cost: protocol_config .group_ops_bls12381_pairing_cost_as_option() .map(Into::into), From 794e8f4db9a07fa49b94da6a24f769ac728ef75d Mon Sep 17 00:00:00 2001 From: Nonast <29281463+nonast@users.noreply.github.com> Date: Tue, 28 Jan 2025 19:41:51 +0800 Subject: [PATCH 16/51] fix(genesis-geremony): fix examine-genesis-checkpoint (#4829) * fix: examine genesis checkpoint * chore: clippy and fmt * refactor: is_maybe to try_from * chore: remove unused functions * refactor: remove unwrap from func * chore: remove unused to_bytes funcs * chore: cargo fmt * chore: correct spelling * fix(genesis-inspector): consider TimelockedStakedIota as a stake * refactor(genesis-inspector): get migration objects as iterator * add timelock balance assert * fixes coming from different review comments --------- Co-authored-by: Mirko Zichichi Co-authored-by: miker83z --- crates/iota-genesis-builder/src/lib.rs | 16 +- crates/iota-types/src/base_types.rs | 29 ++- .../iota-types/src/stardust/output/alias.rs | 38 +++- .../iota-types/src/stardust/output/basic.rs | 37 +++- crates/iota-types/src/stardust/output/nft.rs | 38 +++- crates/iota-types/src/timelock/timelock.rs | 47 ++++- crates/iota/src/genesis_ceremony.rs | 2 +- crates/iota/src/genesis_inspector.rs | 193 ++++++++++++++++-- 8 files changed, 368 insertions(+), 32 deletions(-) diff --git a/crates/iota-genesis-builder/src/lib.rs b/crates/iota-genesis-builder/src/lib.rs index 69de4c1e0be..bd6818b6c9e 100644 --- a/crates/iota-genesis-builder/src/lib.rs +++ b/crates/iota-genesis-builder/src/lib.rs @@ -149,11 +149,25 @@ impl Builder { } } + /// Return an iterator of migration objects if this genesis is with + /// migration objects. + pub fn tx_migration_objects(&self) -> impl Iterator + '_ { + self.migration_tx_data + .as_ref() + .map(|tx_data| tx_data.get_objects()) + .into_iter() + .flatten() + } + + /// Set the genesis delegation to be a `OneToAll` kind and set the + /// delegator address. pub fn with_delegator(mut self, delegator: IotaAddress) -> Self { self.delegation = Some(GenesisDelegation::OneToAll(delegator)); self } + /// Set the genesis delegation to be a `ManyToMany` kind and set the + /// delegator map. pub fn with_delegations(mut self, delegations: Delegations) -> Self { self.delegation = Some(GenesisDelegation::ManyToMany(delegations)); self @@ -259,7 +273,7 @@ impl Builder { self.built_genesis.clone() } - fn load_migration_sources(&mut self) -> anyhow::Result<()> { + pub fn load_migration_sources(&mut self) -> anyhow::Result<()> { for source in &self.migration_sources { tracing::info!("Adding migration objects from {:?}", source); self.migration_objects diff --git a/crates/iota-types/src/base_types.rs b/crates/iota-types/src/base_types.rs index 1093faba3d1..eb36c9b3930 100644 --- a/crates/iota-types/src/base_types.rs +++ b/crates/iota-types/src/base_types.rs @@ -55,7 +55,7 @@ use crate::{ object::{Object, Owner}, parse_iota_struct_tag, signature::GenericSignature, - stardust::output::Nft, + stardust::output::{AliasOutput, BasicOutput, Nft, NftOutput}, timelock::{ timelock::{self, TimeLock}, timelocked_staked_iota::TimelockedStakedIota, @@ -380,6 +380,33 @@ impl MoveObjectType { } } + pub fn is_alias_output(&self) -> bool { + match &self.0 { + MoveObjectType_::GasCoin | MoveObjectType_::StakedIota | MoveObjectType_::Coin(_) => { + false + } + MoveObjectType_::Other(s) => AliasOutput::is_alias_output(s), + } + } + + pub fn is_basic_output(&self) -> bool { + match &self.0 { + MoveObjectType_::GasCoin | MoveObjectType_::StakedIota | MoveObjectType_::Coin(_) => { + false + } + MoveObjectType_::Other(s) => BasicOutput::is_basic_output(s), + } + } + + pub fn is_nft_output(&self) -> bool { + match &self.0 { + MoveObjectType_::GasCoin | MoveObjectType_::StakedIota | MoveObjectType_::Coin(_) => { + false + } + MoveObjectType_::Other(s) => NftOutput::is_nft_output(s), + } + } + pub fn try_extract_field_name(&self, type_: &DynamicFieldType) -> IotaResult { match &self.0 { MoveObjectType_::GasCoin | MoveObjectType_::StakedIota | MoveObjectType_::Coin(_) => { diff --git a/crates/iota-types/src/stardust/output/alias.rs b/crates/iota-types/src/stardust/output/alias.rs index 92d6716abd7..c24659f7774 100644 --- a/crates/iota-types/src/stardust/output/alias.rs +++ b/crates/iota-types/src/stardust/output/alias.rs @@ -8,10 +8,11 @@ use serde::{Deserialize, Serialize}; use serde_with::serde_as; use crate::{ - STARDUST_PACKAGE_ID, TypeTag, + STARDUST_ADDRESS, TypeTag, balance::Balance, base_types::{IotaAddress, ObjectID, SequenceNumber, TxContext}, collection_types::Bag, + error::IotaError, id::UID, object::{Data, MoveObject, Object, Owner}, stardust::{coin_type::CoinType, stardust_to_iota_address}, @@ -54,7 +55,7 @@ impl Alias { /// [`Alias`] in its move package. pub fn tag() -> StructTag { StructTag { - address: STARDUST_PACKAGE_ID.into(), + address: STARDUST_ADDRESS, module: ALIAS_MODULE_NAME.to_owned(), name: ALIAS_STRUCT_NAME.to_owned(), type_params: Vec::new(), @@ -154,7 +155,7 @@ impl AliasOutput { /// [`AliasOutput`] in its move package. pub fn tag(type_param: TypeTag) -> StructTag { StructTag { - address: STARDUST_PACKAGE_ID.into(), + address: STARDUST_ADDRESS, module: ALIAS_OUTPUT_MODULE_NAME.to_owned(), name: ALIAS_OUTPUT_STRUCT_NAME.to_owned(), type_params: vec![type_param], @@ -201,4 +202,35 @@ impl AliasOutput { Ok(move_alias_output_object) } + + /// Create an `AliasOutput` from BCS bytes. + pub fn from_bcs_bytes(content: &[u8]) -> Result { + bcs::from_bytes(content).map_err(|err| IotaError::ObjectDeserialization { + error: format!("Unable to deserialize AliasOutput object: {:?}", err), + }) + } + + pub fn is_alias_output(s: &StructTag) -> bool { + s.address == STARDUST_ADDRESS + && s.module.as_ident_str() == ALIAS_OUTPUT_MODULE_NAME + && s.name.as_ident_str() == ALIAS_OUTPUT_STRUCT_NAME + } +} + +impl TryFrom<&Object> for AliasOutput { + type Error = IotaError; + fn try_from(object: &Object) -> Result { + match &object.data { + Data::Move(o) => { + if o.type_().is_alias_output() { + return AliasOutput::from_bcs_bytes(o.contents()); + } + } + Data::Package(_) => {} + } + + Err(IotaError::Type { + error: format!("Object type is not an AliasOutput: {:?}", object), + }) + } } diff --git a/crates/iota-types/src/stardust/output/basic.rs b/crates/iota-types/src/stardust/output/basic.rs index 8d294ccf2ef..90039751e66 100644 --- a/crates/iota-types/src/stardust/output/basic.rs +++ b/crates/iota-types/src/stardust/output/basic.rs @@ -14,11 +14,12 @@ use super::unlock_conditions::{ ExpirationUnlockCondition, StorageDepositReturnUnlockCondition, TimelockUnlockCondition, }; use crate::{ - STARDUST_PACKAGE_ID, TypeTag, + STARDUST_ADDRESS, TypeTag, balance::Balance, base_types::{IotaAddress, MoveObjectType, ObjectID, SequenceNumber, TxContext}, coin::Coin, collection_types::Bag, + error::IotaError, id::UID, object::{Data, MoveObject, Object, Owner}, stardust::{coin_type::CoinType, stardust_to_iota_address}, @@ -108,7 +109,7 @@ impl BasicOutput { /// Returns the struct tag of the BasicOutput struct pub fn tag(type_param: TypeTag) -> StructTag { StructTag { - address: STARDUST_PACKAGE_ID.into(), + address: STARDUST_ADDRESS, module: BASIC_OUTPUT_MODULE_NAME.to_owned(), name: BASIC_OUTPUT_STRUCT_NAME.to_owned(), type_params: vec![type_param], @@ -181,6 +182,20 @@ impl BasicOutput { coin_type, ) } + + /// Create a `BasicOutput` from BCS bytes. + pub fn from_bcs_bytes(content: &[u8]) -> Result { + bcs::from_bytes(content).map_err(|err| IotaError::ObjectDeserialization { + error: format!("Unable to deserialize BasicOutput object: {:?}", err), + }) + } + + /// Whether the given `StructTag` represents a `BasicOutput`. + pub fn is_basic_output(s: &StructTag) -> bool { + s.address == STARDUST_ADDRESS + && s.module.as_ident_str() == BASIC_OUTPUT_MODULE_NAME + && s.name.as_ident_str() == BASIC_OUTPUT_STRUCT_NAME + } } pub(crate) fn create_coin( @@ -209,3 +224,21 @@ pub(crate) fn create_coin( tx_context.digest(), )) } + +impl TryFrom<&Object> for BasicOutput { + type Error = IotaError; + fn try_from(object: &Object) -> Result { + match &object.data { + Data::Move(o) => { + if o.type_().is_basic_output() { + return BasicOutput::from_bcs_bytes(o.contents()); + } + } + Data::Package(_) => {} + } + + Err(IotaError::Type { + error: format!("Object type is not a BasicOutput: {:?}", object), + }) + } +} diff --git a/crates/iota-types/src/stardust/output/nft.rs b/crates/iota-types/src/stardust/output/nft.rs index 1af82fafc00..0c73437d0cc 100644 --- a/crates/iota-types/src/stardust/output/nft.rs +++ b/crates/iota-types/src/stardust/output/nft.rs @@ -15,10 +15,11 @@ use super::unlock_conditions::{ ExpirationUnlockCondition, StorageDepositReturnUnlockCondition, TimelockUnlockCondition, }; use crate::{ - STARDUST_PACKAGE_ID, TypeTag, + STARDUST_ADDRESS, TypeTag, balance::Balance, base_types::{IotaAddress, ObjectID, SequenceNumber, TxContext}, collection_types::{Bag, Entry, VecMap}, + error::IotaError, id::UID, object::{Data, MoveObject, Object, Owner}, stardust::{coin_type::CoinType, stardust_to_iota_address}, @@ -261,7 +262,7 @@ impl Nft { /// [`Nft`] in its move package. pub fn tag() -> StructTag { StructTag { - address: STARDUST_PACKAGE_ID.into(), + address: STARDUST_ADDRESS, module: NFT_MODULE_NAME.to_owned(), name: NFT_STRUCT_NAME.to_owned(), type_params: Vec::new(), @@ -404,7 +405,7 @@ impl NftOutput { /// [`NftOutput`] in its move package. pub fn tag(type_param: TypeTag) -> StructTag { StructTag { - address: STARDUST_PACKAGE_ID.into(), + address: STARDUST_ADDRESS, module: NFT_OUTPUT_MODULE_NAME.to_owned(), name: NFT_OUTPUT_STRUCT_NAME.to_owned(), type_params: vec![type_param], @@ -469,4 +470,35 @@ impl NftOutput { Ok(move_nft_output_object) } + + /// Create an `NftOutput` from BCS bytes. + pub fn from_bcs_bytes(content: &[u8]) -> Result { + bcs::from_bytes(content).map_err(|err| IotaError::ObjectDeserialization { + error: format!("Unable to deserialize NftOutput object: {:?}", err), + }) + } + + pub fn is_nft_output(s: &StructTag) -> bool { + s.address == STARDUST_ADDRESS + && s.module.as_ident_str() == NFT_OUTPUT_MODULE_NAME + && s.name.as_ident_str() == NFT_OUTPUT_STRUCT_NAME + } +} + +impl TryFrom<&Object> for NftOutput { + type Error = IotaError; + fn try_from(object: &Object) -> Result { + match &object.data { + Data::Move(o) => { + if o.type_().is_nft_output() { + return NftOutput::from_bcs_bytes(o.contents()); + } + } + Data::Package(_) => {} + } + + Err(IotaError::Type { + error: format!("Object type is not a NftOutput: {:?}", object), + }) + } } diff --git a/crates/iota-types/src/timelock/timelock.rs b/crates/iota-types/src/timelock/timelock.rs index 840a3d2ede2..1c5d03f1a5e 100644 --- a/crates/iota-types/src/timelock/timelock.rs +++ b/crates/iota-types/src/timelock/timelock.rs @@ -17,7 +17,8 @@ use crate::{ IOTA_FRAMEWORK_ADDRESS, balance::Balance, base_types::{IotaAddress, MoveObjectType, ObjectID, SequenceNumber, TxContext}, - error::ExecutionError, + error::{ExecutionError, IotaError}, + gas_coin::GasCoin, id::UID, object::{Data, MoveObject, Object, Owner}, }; @@ -202,8 +203,10 @@ where T: Serialize + Deserialize<'de>, { /// Create a `TimeLock` from BCS bytes. - pub fn from_bcs_bytes(content: &'de [u8]) -> Result { - bcs::from_bytes(content) + pub fn from_bcs_bytes(content: &'de [u8]) -> Result { + bcs::from_bytes(content).map_err(|err| IotaError::ObjectDeserialization { + error: format!("Unable to deserialize TimeLock object: {:?}", err), + }) } /// Serialize a `TimeLock` as a `Vec` of BCS. @@ -234,3 +237,41 @@ pub fn is_timelocked_balance(other: &StructTag) -> bool { _ => false, } } + +/// Is this other StructTag representing a `TimeLock>`? +pub fn is_timelocked_gas_balance(other: &StructTag) -> bool { + if !is_timelock(other) { + return false; + } + + if other.type_params.len() != 1 { + return false; + } + + match &other.type_params[0] { + TypeTag::Struct(tag) => GasCoin::is_gas_balance(tag), + _ => false, + } +} + +impl<'de, T> TryFrom<&'de Object> for TimeLock +where + T: Serialize + Deserialize<'de>, +{ + type Error = IotaError; + + fn try_from(object: &'de Object) -> Result { + match &object.data { + Data::Move(o) => { + if o.type_().is_timelock() { + return TimeLock::from_bcs_bytes(o.contents()); + } + } + Data::Package(_) => {} + } + + Err(IotaError::Type { + error: format!("Object type is not a TimeLock: {:?}", object), + }) + } +} diff --git a/crates/iota/src/genesis_ceremony.rs b/crates/iota/src/genesis_ceremony.rs index c235d0f159c..06d47d8a0c7 100644 --- a/crates/iota/src/genesis_ceremony.rs +++ b/crates/iota/src/genesis_ceremony.rs @@ -305,7 +305,7 @@ pub async fn run(cmd: Ceremony) -> Result<()> { )); }; - examine_genesis_checkpoint(unsigned_genesis); + examine_genesis_checkpoint(unsigned_genesis, builder.tx_migration_objects()); } CeremonyCommand::VerifyAndSign { key_file } => { diff --git a/crates/iota/src/genesis_inspector.rs b/crates/iota/src/genesis_inspector.rs index dc8e049ec87..3ec6954deae 100644 --- a/crates/iota/src/genesis_inspector.rs +++ b/crates/iota/src/genesis_inspector.rs @@ -7,19 +7,30 @@ use std::collections::BTreeMap; use inquire::Select; use iota_config::genesis::UnsignedGenesis; use iota_types::{ + balance::Balance, base_types::ObjectID, coin::CoinMetadata, gas_coin::{GasCoin, IotaTreasuryCap, NANOS_PER_IOTA}, governance::StakedIota, iota_system_state::IotaValidatorGenesis, move_package::MovePackage, - object::{MoveObject, Owner}, + object::{MoveObject, Object, Owner}, + stardust::output::{AliasOutput, BasicOutput, NftOutput}, + timelock::{ + timelock::{TimeLock, is_timelocked_gas_balance}, + timelocked_staked_iota::TimelockedStakedIota, + }, }; const STR_ALL: &str = "All"; const STR_EXIT: &str = "Exit"; const STR_IOTA: &str = "Iota"; const STR_STAKED_IOTA: &str = "StakedIota"; +const STR_TIMELOCKED_IOTA: &str = "TimelockedIota"; +const STR_TIMELOCKED_STAKED_IOTA: &str = "TimelockedStakedIota"; +const STR_ALIAS_OUTPUT_IOTA: &str = "AliasOutputIota"; +const STR_BASIC_OUTPUT_IOTA: &str = "BasicOutputIota"; +const STR_NFT_OUTPUT_IOTA: &str = "NftOutputIota"; const STR_PACKAGE: &str = "Package"; const STR_COIN_METADATA: &str = "CoinMetadata"; const STR_OTHER: &str = "Other"; @@ -27,7 +38,10 @@ const STR_IOTA_DISTRIBUTION: &str = "IOTA Distribution"; const STR_OBJECTS: &str = "Objects"; const STR_VALIDATORS: &str = "Validators"; -pub(crate) fn examine_genesis_checkpoint(genesis: UnsignedGenesis) { +pub(crate) fn examine_genesis_checkpoint( + genesis: UnsignedGenesis, + migration_objects: impl Iterator, +) { let system_object = genesis .iota_system_object() .into_genesis_version_for_tooling(); @@ -65,10 +79,19 @@ pub(crate) fn examine_genesis_checkpoint(genesis: UnsignedGenesis) { let mut package_map = BTreeMap::new(); let mut iota_map = BTreeMap::new(); let mut staked_iota_map = BTreeMap::new(); + let mut timelocked_iota_map = BTreeMap::new(); + let mut timelocked_staked_iota_map = BTreeMap::new(); + let mut alias_output_iota_map = BTreeMap::new(); + let mut basic_output_iota_map = BTreeMap::new(); + let mut nft_output_iota_map = BTreeMap::new(); let mut coin_metadata_map = BTreeMap::new(); let mut other_object_map = BTreeMap::new(); - for object in genesis.objects() { + let additional_objects = genesis.objects(); + let tot_additional_objects = additional_objects.len(); + let mut total_objects = 0; + for object in additional_objects.iter().cloned().chain(migration_objects) { + total_objects += 1; let object_id = object.id(); let object_id_str = object_id.to_string(); assert_eq!(object.storage_rebate, 0); @@ -76,15 +99,15 @@ pub(crate) fn examine_genesis_checkpoint(genesis: UnsignedGenesis) { match &object.data { iota_types::object::Data::Move(move_object) => { - if let Ok(gas) = GasCoin::try_from(object) { + if let Ok(gas) = GasCoin::try_from(&object) { let entry = iota_distribution .entry(object.owner.to_string()) .or_default(); entry.insert(object_id_str.clone(), (STR_IOTA, gas.value())); iota_map.insert(object.id(), gas); - } else if let Ok(coin_metadata) = CoinMetadata::try_from(object) { + } else if let Ok(coin_metadata) = CoinMetadata::try_from(&object) { coin_metadata_map.insert(object.id(), coin_metadata); - } else if let Ok(staked_iota) = StakedIota::try_from(object) { + } else if let Ok(staked_iota) = StakedIota::try_from(&object) { let entry = iota_distribution .entry(object.owner.to_string()) .or_default(); @@ -92,21 +115,78 @@ pub(crate) fn examine_genesis_checkpoint(genesis: UnsignedGenesis) { // Assert pool id is associated with a known validator. let validator = validator_pool_id_map.get(&staked_iota.pool_id()).unwrap(); assert_eq!(validator.staking_pool.id, staked_iota.pool_id()); - staked_iota_map.insert(object.id(), staked_iota); + } else if let Ok(timelock_balance) = TimeLock::::try_from(&object) { + assert!(is_timelocked_gas_balance( + &object.struct_tag().expect("should not be a package") + )); + let entry = iota_distribution + .entry(object.owner.to_string()) + .or_default(); + entry.insert( + object_id_str, + (STR_TIMELOCKED_IOTA, timelock_balance.locked().value()), + ); + timelocked_iota_map.insert(object.id(), timelock_balance); + } else if let Ok(alias_output) = AliasOutput::try_from(&object) { + let entry = iota_distribution + .entry(object.owner.to_string()) + .or_default(); + entry.insert( + object_id_str, + (STR_ALIAS_OUTPUT_IOTA, alias_output.balance.value()), + ); + alias_output_iota_map.insert(object.id(), alias_output); + } else if let Ok(basic_output) = BasicOutput::try_from(&object) { + let entry = iota_distribution + .entry(object.owner.to_string()) + .or_default(); + entry.insert( + object_id_str, + (STR_BASIC_OUTPUT_IOTA, basic_output.balance.value()), + ); + basic_output_iota_map.insert(object.id(), basic_output); + } else if let Ok(nft_output) = NftOutput::try_from(&object) { + let entry = iota_distribution + .entry(object.owner.to_string()) + .or_default(); + entry.insert( + object_id_str, + (STR_NFT_OUTPUT_IOTA, nft_output.balance.value()), + ); + nft_output_iota_map.insert(object.id(), nft_output); + } else if let Ok(timelocked_staked_iota) = TimelockedStakedIota::try_from(&object) { + let entry = iota_distribution + .entry(object.owner.to_string()) + .or_default(); + entry.insert( + object_id_str, + ( + STR_TIMELOCKED_STAKED_IOTA, + timelocked_staked_iota.principal(), + ), + ); + // Assert pool id is associated with a known validator. + let validator = validator_pool_id_map + .get(&timelocked_staked_iota.pool_id()) + .unwrap(); + assert_eq!(validator.staking_pool.id, timelocked_staked_iota.pool_id()); + timelocked_staked_iota_map.insert(object.id(), timelocked_staked_iota); } else { - other_object_map.insert(object.id(), move_object); + other_object_map.insert(object.id(), move_object.clone()); } } iota_types::object::Data::Package(p) => { - package_map.insert(object.id(), p); + package_map.insert(object.id(), p.clone()); } } } + println!( - "Total Number of Objects/Packages: {}", - genesis.objects().len() + "Total Number of Migration Objects: {}", + total_objects - tot_additional_objects ); + println!("Total Number of Objects/Packages: {}", total_objects); // Always check the Total Supply examine_total_supply(&system_object.iota_treasury_cap, &iota_distribution, false); @@ -128,13 +208,18 @@ pub(crate) fn examine_genesis_checkpoint(genesis: UnsignedGenesis) { examine_validators(&validator_options, &validator_map); } Ok(name) if name == STR_OBJECTS => { - println!("Examine Objects (total: {})", genesis.objects().len()); + println!("Examine Objects (total: {})", total_objects); examine_object( &owner_map, &validator_pool_id_map, &package_map, &iota_map, &staked_iota_map, + &timelocked_iota_map, + &timelocked_staked_iota_map, + &alias_output_iota_map, + &basic_output_iota_map, + &nft_output_iota_map, &coin_metadata_map, &other_object_map, ); @@ -179,15 +264,25 @@ fn examine_validators( fn examine_object( owner_map: &BTreeMap, validator_pool_id_map: &BTreeMap, - package_map: &BTreeMap, + package_map: &BTreeMap, iota_map: &BTreeMap, staked_iota_map: &BTreeMap, + timelocked_iota_map: &BTreeMap>, + timelocked_staked_iota: &BTreeMap, + alias_output_iota_map: &BTreeMap, + basic_output_iota_map: &BTreeMap, + nft_output_iota_map: &BTreeMap, coin_metadata_map: &BTreeMap, - other_object_map: &BTreeMap, + other_object_map: &BTreeMap, ) { let object_options: Vec<&str> = vec![ STR_IOTA, STR_STAKED_IOTA, + STR_TIMELOCKED_IOTA, + STR_TIMELOCKED_STAKED_IOTA, + STR_ALIAS_OUTPUT_IOTA, + STR_BASIC_OUTPUT_IOTA, + STR_NFT_OUTPUT_IOTA, STR_COIN_METADATA, STR_PACKAGE, STR_OTHER, @@ -213,6 +308,40 @@ fn examine_object( } print_divider(STR_STAKED_IOTA); } + Ok(name) if name == STR_TIMELOCKED_IOTA => { + for timelocked in timelocked_iota_map.values() { + println!("{:#?}", timelocked); + } + print_divider(STR_TIMELOCKED_IOTA); + } + Ok(name) if name == STR_TIMELOCKED_STAKED_IOTA => { + for timelocked_staked in timelocked_staked_iota.values() { + display_timelocked_staked_iota( + timelocked_staked, + validator_pool_id_map, + owner_map, + ); + } + print_divider(STR_TIMELOCKED_STAKED_IOTA); + } + Ok(name) if name == STR_ALIAS_OUTPUT_IOTA => { + for alias_output in alias_output_iota_map.values() { + println!("{:#?}", alias_output); + } + print_divider(STR_ALIAS_OUTPUT_IOTA); + } + Ok(name) if name == STR_BASIC_OUTPUT_IOTA => { + for basic_output in basic_output_iota_map.values() { + println!("{:#?}", basic_output); + } + print_divider(STR_BASIC_OUTPUT_IOTA); + } + Ok(name) if name == STR_NFT_OUTPUT_IOTA => { + for nft_output in nft_output_iota_map.values() { + println!("{:#?}", nft_output); + } + print_divider(STR_NFT_OUTPUT_IOTA); + } Ok(name) if name == STR_PACKAGE => { for package in package_map.values() { println!("Package ID: {}", package.id()); @@ -255,7 +384,7 @@ fn examine_total_supply( let mut amount_sum = 0; for (owner, value) in coins.values() { amount_sum += value; - if *owner == STR_STAKED_IOTA { + if *owner == STR_STAKED_IOTA || *owner == STR_TIMELOCKED_STAKED_IOTA { total_staked_iota += value; } } @@ -269,7 +398,6 @@ fn examine_total_supply( println!("{:#?}\n", coins); } } - assert_eq!(total_iota, iota_treasury_cap.total_supply().value); // Always print this. println!( "Total Supply of Iota: {total_iota} NANOS or {} IOTA", @@ -279,6 +407,7 @@ fn examine_total_supply( "Total Amount of StakedIota: {total_staked_iota} NANOS or {} IOTA\n", total_staked_iota / NANOS_PER_IOTA ); + assert_eq!(total_iota, iota_treasury_cap.total_supply().value); if print { print_divider("IOTA Distribution"); } @@ -352,13 +481,41 @@ fn display_staked_iota( validator_pool_id_map: &BTreeMap, owner_map: &BTreeMap, ) { - let validator = validator_pool_id_map.get(&staked_iota.pool_id()).unwrap(); println!("{:#?}", staked_iota); + display_staked( + &staked_iota.pool_id(), + &staked_iota.id(), + validator_pool_id_map, + owner_map, + ); +} + +fn display_timelocked_staked_iota( + timelocked_staked_iota: &TimelockedStakedIota, + validator_pool_id_map: &BTreeMap, + owner_map: &BTreeMap, +) { + println!("{:#?}", timelocked_staked_iota); + display_staked( + &timelocked_staked_iota.pool_id(), + &timelocked_staked_iota.id(), + validator_pool_id_map, + owner_map, + ); +} + +fn display_staked( + pool_id: &ObjectID, + staked_object_id: &ObjectID, + validator_pool_id_map: &BTreeMap, + owner_map: &BTreeMap, +) { + let validator = validator_pool_id_map.get(pool_id).unwrap(); println!( "Staked to Validator: {}", validator.verified_metadata().name ); - println!("Owner: {}\n", owner_map.get(&staked_iota.id()).unwrap()); + println!("Owner: {}\n", owner_map.get(staked_object_id).unwrap()); } fn print_divider(title: &str) { From 919a9e8e798fe41e7baaed9cfded2d0243f8e16e Mon Sep 17 00:00:00 2001 From: Tomasz Pastusiak Date: Wed, 29 Jan 2025 08:47:14 +0100 Subject: [PATCH 17/51] [indexer]: Create script to autogenerate indexer schema (#5012) * [indexer]: Create script to autogenerate indexer schema * Convert script to dockerized version Co-authored-by: muXxer * Update script name in schema.patch * Allow build to be called from anywhere * Ensure the required image is built * Rename indexer-generate-schema to indexer-schema --------- Co-authored-by: muXxer Co-authored-by: Konstantinos Demartinos --- crates/iota-indexer/src/schema.patch | 32 +- crates/iota-indexer/src/schema.rs | 465 +++++ crates/iota-indexer/src/schema/mod.rs | 33 - crates/iota-indexer/src/schema/pg.rs | 2568 ------------------------- scripts/indexer-schema/Dockerfile | 21 + scripts/indexer-schema/build.sh | 19 + scripts/indexer-schema/generate.sh | 67 + 7 files changed, 602 insertions(+), 2603 deletions(-) create mode 100644 crates/iota-indexer/src/schema.rs delete mode 100644 crates/iota-indexer/src/schema/mod.rs delete mode 100644 crates/iota-indexer/src/schema/pg.rs create mode 100644 scripts/indexer-schema/Dockerfile create mode 100755 scripts/indexer-schema/build.sh create mode 100755 scripts/indexer-schema/generate.sh diff --git a/crates/iota-indexer/src/schema.patch b/crates/iota-indexer/src/schema.patch index 4eca2333f51..0806f90dc3b 100644 --- a/crates/iota-indexer/src/schema.patch +++ b/crates/iota-indexer/src/schema.patch @@ -1,8 +1,36 @@ diff --git a/crates/iota-indexer/src/schema.rs b/crates/iota-indexer/src/schema.rs --- a/crates/iota-indexer/src/schema.rs +++ b/crates/iota-indexer/src/schema.rs -@@ -1 +1,4 @@ +@@ -1,4 +1,7 @@ +-// @generated automatically by Diesel CLI. +// Copyright (c) Mysten Labs, Inc. +// Modifications Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 - // @generated automatically by Diesel CLI. ++// @generated automatically by scripts/indexer-schema/generate.sh + + diesel::table! { + active_addresses (address) { +@@ -414,7 +417,10 @@ diesel::table! { + } + } + +-diesel::allow_tables_to_appear_in_same_query!( ++#[macro_export] ++macro_rules! for_all_tables { ++ ($action:path) => { ++ $action!( + active_addresses, + address_metrics, + addresses, +@@ -451,5 +457,9 @@ diesel::allow_tables_to_appear_in_same_query!( + tx_input_objects, + tx_kinds, + tx_recipients, +- tx_senders, +-); ++ tx_senders ++ ); ++ }; ++} ++pub use for_all_tables; ++for_all_tables!(diesel::allow_tables_to_appear_in_same_query); diff --git a/crates/iota-indexer/src/schema.rs b/crates/iota-indexer/src/schema.rs new file mode 100644 index 00000000000..978a9511d51 --- /dev/null +++ b/crates/iota-indexer/src/schema.rs @@ -0,0 +1,465 @@ +// Copyright (c) Mysten Labs, Inc. +// Modifications Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 +// @generated automatically by scripts/indexer-schema/generate.sh + +diesel::table! { + active_addresses (address) { + address -> Bytea, + first_appearance_tx -> Int8, + first_appearance_time -> Int8, + last_appearance_tx -> Int8, + last_appearance_time -> Int8, + } +} + +diesel::table! { + address_metrics (checkpoint) { + checkpoint -> Int8, + epoch -> Int8, + timestamp_ms -> Int8, + cumulative_addresses -> Int8, + cumulative_active_addresses -> Int8, + daily_active_addresses -> Int8, + } +} + +diesel::table! { + addresses (address) { + address -> Bytea, + first_appearance_tx -> Int8, + first_appearance_time -> Int8, + last_appearance_tx -> Int8, + last_appearance_time -> Int8, + } +} + +diesel::table! { + chain_identifier (checkpoint_digest) { + checkpoint_digest -> Bytea, + } +} + +diesel::table! { + checkpoints (sequence_number) { + sequence_number -> Int8, + checkpoint_digest -> Bytea, + epoch -> Int8, + network_total_transactions -> Int8, + previous_checkpoint_digest -> Nullable, + end_of_epoch -> Bool, + tx_digests -> Array>, + timestamp_ms -> Int8, + total_gas_cost -> Int8, + computation_cost -> Int8, + storage_cost -> Int8, + storage_rebate -> Int8, + non_refundable_storage_fee -> Int8, + checkpoint_commitments -> Bytea, + validator_signature -> Bytea, + end_of_epoch_data -> Nullable, + min_tx_sequence_number -> Nullable, + max_tx_sequence_number -> Nullable, + } +} + +diesel::table! { + display (object_type) { + object_type -> Text, + id -> Bytea, + version -> Int2, + bcs -> Bytea, + } +} + +diesel::table! { + epoch_peak_tps (epoch) { + epoch -> Int8, + peak_tps -> Float8, + peak_tps_30d -> Float8, + } +} + +diesel::table! { + epochs (epoch) { + epoch -> Int8, + first_checkpoint_id -> Int8, + epoch_start_timestamp -> Int8, + reference_gas_price -> Int8, + protocol_version -> Int8, + total_stake -> Int8, + storage_fund_balance -> Int8, + system_state -> Bytea, + epoch_total_transactions -> Nullable, + last_checkpoint_id -> Nullable, + epoch_end_timestamp -> Nullable, + storage_charge -> Nullable, + storage_rebate -> Nullable, + total_gas_fees -> Nullable, + total_stake_rewards_distributed -> Nullable, + epoch_commitments -> Nullable, + burnt_tokens_amount -> Nullable, + minted_tokens_amount -> Nullable, + } +} + +diesel::table! { + event_emit_module (package, module, tx_sequence_number, event_sequence_number) { + package -> Bytea, + module -> Text, + tx_sequence_number -> Int8, + event_sequence_number -> Int8, + sender -> Bytea, + } +} + +diesel::table! { + event_emit_package (package, tx_sequence_number, event_sequence_number) { + package -> Bytea, + tx_sequence_number -> Int8, + event_sequence_number -> Int8, + sender -> Bytea, + } +} + +diesel::table! { + event_senders (sender, tx_sequence_number, event_sequence_number) { + sender -> Bytea, + tx_sequence_number -> Int8, + event_sequence_number -> Int8, + } +} + +diesel::table! { + event_struct_instantiation (package, module, type_instantiation, tx_sequence_number, event_sequence_number) { + package -> Bytea, + module -> Text, + type_instantiation -> Text, + tx_sequence_number -> Int8, + event_sequence_number -> Int8, + sender -> Bytea, + } +} + +diesel::table! { + event_struct_module (package, module, tx_sequence_number, event_sequence_number) { + package -> Bytea, + module -> Text, + tx_sequence_number -> Int8, + event_sequence_number -> Int8, + sender -> Bytea, + } +} + +diesel::table! { + event_struct_name (package, module, type_name, tx_sequence_number, event_sequence_number) { + package -> Bytea, + module -> Text, + type_name -> Text, + tx_sequence_number -> Int8, + event_sequence_number -> Int8, + sender -> Bytea, + } +} + +diesel::table! { + event_struct_package (package, tx_sequence_number, event_sequence_number) { + package -> Bytea, + tx_sequence_number -> Int8, + event_sequence_number -> Int8, + sender -> Bytea, + } +} + +diesel::table! { + events (tx_sequence_number, event_sequence_number) { + tx_sequence_number -> Int8, + event_sequence_number -> Int8, + transaction_digest -> Bytea, + senders -> Array>, + package -> Bytea, + module -> Text, + event_type -> Text, + timestamp_ms -> Int8, + bcs -> Bytea, + } +} + +diesel::table! { + feature_flags (protocol_version, flag_name) { + protocol_version -> Int8, + flag_name -> Text, + flag_value -> Bool, + } +} + +diesel::table! { + move_call_metrics (id) { + id -> Int8, + epoch -> Int8, + day -> Int8, + move_package -> Text, + move_module -> Text, + move_function -> Text, + count -> Int8, + } +} + +diesel::table! { + move_calls (transaction_sequence_number, move_package, move_module, move_function) { + transaction_sequence_number -> Int8, + checkpoint_sequence_number -> Int8, + epoch -> Int8, + move_package -> Bytea, + move_module -> Text, + move_function -> Text, + } +} + +diesel::table! { + objects (object_id) { + object_id -> Bytea, + object_version -> Int8, + object_digest -> Bytea, + checkpoint_sequence_number -> Int8, + owner_type -> Int2, + owner_id -> Nullable, + object_type -> Nullable, + object_type_package -> Nullable, + object_type_module -> Nullable, + object_type_name -> Nullable, + serialized_object -> Bytea, + coin_type -> Nullable, + coin_balance -> Nullable, + df_kind -> Nullable, + df_name -> Nullable, + df_object_type -> Nullable, + df_object_id -> Nullable, + } +} + +diesel::table! { + objects_history (checkpoint_sequence_number, object_id, object_version) { + object_id -> Bytea, + object_version -> Int8, + object_status -> Int2, + object_digest -> Nullable, + checkpoint_sequence_number -> Int8, + owner_type -> Nullable, + owner_id -> Nullable, + object_type -> Nullable, + object_type_package -> Nullable, + object_type_module -> Nullable, + object_type_name -> Nullable, + serialized_object -> Nullable, + coin_type -> Nullable, + coin_balance -> Nullable, + df_kind -> Nullable, + df_name -> Nullable, + df_object_type -> Nullable, + df_object_id -> Nullable, + } +} + +diesel::table! { + objects_snapshot (object_id) { + object_id -> Bytea, + object_version -> Int8, + object_status -> Int2, + object_digest -> Nullable, + checkpoint_sequence_number -> Int8, + owner_type -> Nullable, + owner_id -> Nullable, + object_type -> Nullable, + object_type_package -> Nullable, + object_type_module -> Nullable, + object_type_name -> Nullable, + serialized_object -> Nullable, + coin_type -> Nullable, + coin_balance -> Nullable, + df_kind -> Nullable, + df_name -> Nullable, + df_object_type -> Nullable, + df_object_id -> Nullable, + } +} + +diesel::table! { + objects_version (object_id, object_version) { + object_id -> Bytea, + object_version -> Int8, + cp_sequence_number -> Int8, + } +} + +diesel::table! { + packages (package_id, original_id, package_version) { + package_id -> Bytea, + original_id -> Bytea, + package_version -> Int8, + move_package -> Bytea, + checkpoint_sequence_number -> Int8, + } +} + +diesel::table! { + protocol_configs (protocol_version, config_name) { + protocol_version -> Int8, + config_name -> Text, + config_value -> Nullable, + } +} + +diesel::table! { + pruner_cp_watermark (checkpoint_sequence_number) { + checkpoint_sequence_number -> Int8, + min_tx_sequence_number -> Int8, + max_tx_sequence_number -> Int8, + } +} + +diesel::table! { + transactions (tx_sequence_number) { + tx_sequence_number -> Int8, + transaction_digest -> Bytea, + raw_transaction -> Bytea, + raw_effects -> Bytea, + checkpoint_sequence_number -> Int8, + timestamp_ms -> Int8, + object_changes -> Array>, + balance_changes -> Array>, + events -> Array>, + transaction_kind -> Int2, + success_command_count -> Int2, + } +} + +diesel::table! { + tx_calls_fun (package, module, func, tx_sequence_number) { + tx_sequence_number -> Int8, + package -> Bytea, + module -> Text, + func -> Text, + sender -> Bytea, + } +} + +diesel::table! { + tx_calls_mod (package, module, tx_sequence_number) { + tx_sequence_number -> Int8, + package -> Bytea, + module -> Text, + sender -> Bytea, + } +} + +diesel::table! { + tx_calls_pkg (package, tx_sequence_number) { + tx_sequence_number -> Int8, + package -> Bytea, + sender -> Bytea, + } +} + +diesel::table! { + tx_changed_objects (object_id, tx_sequence_number) { + tx_sequence_number -> Int8, + object_id -> Bytea, + sender -> Bytea, + } +} + +diesel::table! { + tx_count_metrics (checkpoint_sequence_number) { + checkpoint_sequence_number -> Int8, + epoch -> Int8, + timestamp_ms -> Int8, + total_transaction_blocks -> Int8, + total_successful_transaction_blocks -> Int8, + total_successful_transactions -> Int8, + } +} + +diesel::table! { + tx_digests (tx_digest) { + tx_digest -> Bytea, + tx_sequence_number -> Int8, + } +} + +diesel::table! { + tx_input_objects (object_id, tx_sequence_number) { + tx_sequence_number -> Int8, + object_id -> Bytea, + sender -> Bytea, + } +} + +diesel::table! { + tx_kinds (tx_kind, tx_sequence_number) { + tx_sequence_number -> Int8, + tx_kind -> Int2, + } +} + +diesel::table! { + tx_recipients (recipient, tx_sequence_number) { + tx_sequence_number -> Int8, + recipient -> Bytea, + sender -> Bytea, + } +} + +diesel::table! { + tx_senders (sender, tx_sequence_number) { + tx_sequence_number -> Int8, + sender -> Bytea, + } +} + +#[macro_export] +macro_rules! for_all_tables { + ($action:path) => { + $action!( + active_addresses, + address_metrics, + addresses, + chain_identifier, + checkpoints, + display, + epoch_peak_tps, + epochs, + event_emit_module, + event_emit_package, + event_senders, + event_struct_instantiation, + event_struct_module, + event_struct_name, + event_struct_package, + events, + feature_flags, + move_call_metrics, + move_calls, + objects, + objects_history, + objects_snapshot, + objects_version, + packages, + protocol_configs, + pruner_cp_watermark, + transactions, + tx_calls_fun, + tx_calls_mod, + tx_calls_pkg, + tx_changed_objects, + tx_count_metrics, + tx_digests, + tx_input_objects, + tx_kinds, + tx_recipients, + tx_senders + ); + }; +} +pub use for_all_tables; +for_all_tables!(diesel::allow_tables_to_appear_in_same_query); diff --git a/crates/iota-indexer/src/schema/mod.rs b/crates/iota-indexer/src/schema/mod.rs deleted file mode 100644 index 08cbaa0d02d..00000000000 --- a/crates/iota-indexer/src/schema/mod.rs +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// Modifications Copyright (c) 2024 IOTA Stiftung -// SPDX-License-Identifier: Apache-2.0 - -#![allow(clippy::all)] - -mod pg; - -mod inner { - pub use crate::schema::pg::{ - active_addresses, address_metrics, addresses, chain_identifier, checkpoints, display, - epoch_peak_tps, epochs, event_emit_module, event_emit_package, event_senders, - event_struct_instantiation, event_struct_module, event_struct_name, event_struct_package, - events, feature_flags, move_call_metrics, move_calls, objects, objects_history, - objects_snapshot, objects_version, packages, protocol_configs, pruner_cp_watermark, - transactions, tx_calls_fun, tx_calls_mod, tx_calls_pkg, tx_changed_objects, - tx_count_metrics, tx_digests, tx_input_objects, tx_kinds, tx_recipients, tx_senders, - }; -} - -pub use inner::{ - active_addresses, address_metrics, addresses, chain_identifier, checkpoints, display, - epoch_peak_tps, epochs, event_emit_module, event_emit_package, event_senders, - event_struct_instantiation, event_struct_module, event_struct_name, event_struct_package, - events, feature_flags, move_call_metrics, move_calls, objects, objects_history, - objects_snapshot, objects_version, packages, protocol_configs, pruner_cp_watermark, - transactions, tx_calls_fun, tx_calls_mod, tx_calls_pkg, tx_changed_objects, tx_count_metrics, - tx_digests, tx_input_objects, tx_kinds, tx_recipients, tx_senders, -}; - -pub use crate::schema::pg::{ - events_partition_0, objects_history_partition_0, transactions_partition_0, -}; diff --git a/crates/iota-indexer/src/schema/pg.rs b/crates/iota-indexer/src/schema/pg.rs deleted file mode 100644 index 81fbcc963e6..00000000000 --- a/crates/iota-indexer/src/schema/pg.rs +++ /dev/null @@ -1,2568 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// Modifications Copyright (c) 2024 IOTA Stiftung -// SPDX-License-Identifier: Apache-2.0 -// @generated automatically by Diesel CLI. - -diesel::table! { - active_addresses (address) { - address -> Bytea, - first_appearance_tx -> Int8, - first_appearance_time -> Int8, - last_appearance_tx -> Int8, - last_appearance_time -> Int8, - } -} - -diesel::table! { - address_metrics (checkpoint) { - checkpoint -> Int8, - epoch -> Int8, - timestamp_ms -> Int8, - cumulative_addresses -> Int8, - cumulative_active_addresses -> Int8, - daily_active_addresses -> Int8, - } -} - -diesel::table! { - addresses (address) { - address -> Bytea, - first_appearance_tx -> Int8, - first_appearance_time -> Int8, - last_appearance_tx -> Int8, - last_appearance_time -> Int8, - } -} - -diesel::table! { - chain_identifier (checkpoint_digest) { - checkpoint_digest -> Bytea, - } -} - -diesel::table! { - checkpoints (sequence_number) { - sequence_number -> Int8, - checkpoint_digest -> Bytea, - epoch -> Int8, - network_total_transactions -> Int8, - previous_checkpoint_digest -> Nullable, - end_of_epoch -> Bool, - tx_digests -> Array>, - timestamp_ms -> Int8, - total_gas_cost -> Int8, - computation_cost -> Int8, - storage_cost -> Int8, - storage_rebate -> Int8, - non_refundable_storage_fee -> Int8, - checkpoint_commitments -> Bytea, - validator_signature -> Bytea, - end_of_epoch_data -> Nullable, - min_tx_sequence_number -> Nullable, - max_tx_sequence_number -> Nullable, - } -} - -diesel::table! { - display (object_type) { - object_type -> Text, - id -> Bytea, - version -> Int2, - bcs -> Bytea, - } -} - -diesel::table! { - epoch_peak_tps (epoch) { - epoch -> Int8, - peak_tps -> Float8, - peak_tps_30d -> Float8, - } -} - -diesel::table! { - epochs (epoch) { - epoch -> Int8, - first_checkpoint_id -> Int8, - epoch_start_timestamp -> Int8, - reference_gas_price -> Int8, - protocol_version -> Int8, - total_stake -> Int8, - storage_fund_balance -> Int8, - system_state -> Bytea, - epoch_total_transactions -> Nullable, - last_checkpoint_id -> Nullable, - epoch_end_timestamp -> Nullable, - storage_charge -> Nullable, - storage_rebate -> Nullable, - total_gas_fees -> Nullable, - total_stake_rewards_distributed -> Nullable, - epoch_commitments -> Nullable, - burnt_tokens_amount -> Nullable, - minted_tokens_amount -> Nullable, - } -} - -diesel::table! { - event_emit_module (package, module, tx_sequence_number, event_sequence_number) { - package -> Bytea, - module -> Text, - tx_sequence_number -> Int8, - event_sequence_number -> Int8, - sender -> Bytea, - } -} - -diesel::table! { - event_emit_package (package, tx_sequence_number, event_sequence_number) { - package -> Bytea, - tx_sequence_number -> Int8, - event_sequence_number -> Int8, - sender -> Bytea, - } -} - -diesel::table! { - event_senders (sender, tx_sequence_number, event_sequence_number) { - sender -> Bytea, - tx_sequence_number -> Int8, - event_sequence_number -> Int8, - } -} - -diesel::table! { - event_struct_instantiation (package, module, type_instantiation, tx_sequence_number, event_sequence_number) { - package -> Bytea, - module -> Text, - type_instantiation -> Text, - tx_sequence_number -> Int8, - event_sequence_number -> Int8, - sender -> Bytea, - } -} - -diesel::table! { - event_struct_module (package, module, tx_sequence_number, event_sequence_number) { - package -> Bytea, - module -> Text, - tx_sequence_number -> Int8, - event_sequence_number -> Int8, - sender -> Bytea, - } -} - -diesel::table! { - event_struct_name (package, module, type_name, tx_sequence_number, event_sequence_number) { - package -> Bytea, - module -> Text, - type_name -> Text, - tx_sequence_number -> Int8, - event_sequence_number -> Int8, - sender -> Bytea, - } -} - -diesel::table! { - event_struct_package (package, tx_sequence_number, event_sequence_number) { - package -> Bytea, - tx_sequence_number -> Int8, - event_sequence_number -> Int8, - sender -> Bytea, - } -} - -diesel::table! { - events (tx_sequence_number, event_sequence_number) { - tx_sequence_number -> Int8, - event_sequence_number -> Int8, - transaction_digest -> Bytea, - senders -> Array>, - package -> Bytea, - module -> Text, - event_type -> Text, - timestamp_ms -> Int8, - bcs -> Bytea, - } -} - -diesel::table! { - events_partition_0 (tx_sequence_number, event_sequence_number) { - tx_sequence_number -> Int8, - event_sequence_number -> Int8, - transaction_digest -> Bytea, - senders -> Array>, - package -> Bytea, - module -> Text, - event_type -> Text, - timestamp_ms -> Int8, - bcs -> Bytea, - } -} - -diesel::table! { - feature_flags (protocol_version, flag_name) { - protocol_version -> Int8, - flag_name -> Text, - flag_value -> Bool, - } -} - -diesel::table! { - move_call_metrics (id) { - id -> Int8, - epoch -> Int8, - day -> Int8, - move_package -> Text, - move_module -> Text, - move_function -> Text, - count -> Int8, - } -} - -diesel::table! { - move_calls (transaction_sequence_number, move_package, move_module, move_function) { - transaction_sequence_number -> Int8, - checkpoint_sequence_number -> Int8, - epoch -> Int8, - move_package -> Bytea, - move_module -> Text, - move_function -> Text, - } -} - -diesel::table! { - objects (object_id) { - object_id -> Bytea, - object_version -> Int8, - object_digest -> Bytea, - checkpoint_sequence_number -> Int8, - owner_type -> Int2, - owner_id -> Nullable, - object_type -> Nullable, - object_type_package -> Nullable, - object_type_module -> Nullable, - object_type_name -> Nullable, - serialized_object -> Bytea, - coin_type -> Nullable, - coin_balance -> Nullable, - df_kind -> Nullable, - df_name -> Nullable, - df_object_type -> Nullable, - df_object_id -> Nullable, - } -} - -diesel::table! { - objects_history (checkpoint_sequence_number, object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - object_status -> Int2, - object_digest -> Nullable, - checkpoint_sequence_number -> Int8, - owner_type -> Nullable, - owner_id -> Nullable, - object_type -> Nullable, - object_type_package -> Nullable, - object_type_module -> Nullable, - object_type_name -> Nullable, - serialized_object -> Nullable, - coin_type -> Nullable, - coin_balance -> Nullable, - df_kind -> Nullable, - df_name -> Nullable, - df_object_type -> Nullable, - df_object_id -> Nullable, - } -} - -diesel::table! { - objects_history_partition_0 (checkpoint_sequence_number, object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - object_status -> Int2, - object_digest -> Nullable, - checkpoint_sequence_number -> Int8, - owner_type -> Nullable, - owner_id -> Nullable, - object_type -> Nullable, - object_type_package -> Nullable, - object_type_module -> Nullable, - object_type_name -> Nullable, - serialized_object -> Nullable, - coin_type -> Nullable, - coin_balance -> Nullable, - df_kind -> Nullable, - df_name -> Nullable, - df_object_type -> Nullable, - df_object_id -> Nullable, - } -} - -diesel::table! { - objects_snapshot (object_id) { - object_id -> Bytea, - object_version -> Int8, - object_status -> Int2, - object_digest -> Nullable, - checkpoint_sequence_number -> Int8, - owner_type -> Nullable, - owner_id -> Nullable, - object_type -> Nullable, - object_type_package -> Nullable, - object_type_module -> Nullable, - object_type_name -> Nullable, - serialized_object -> Nullable, - coin_type -> Nullable, - coin_balance -> Nullable, - df_kind -> Nullable, - df_name -> Nullable, - df_object_type -> Nullable, - df_object_id -> Nullable, - } -} - -diesel::table! { - objects_version (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_00 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_01 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_02 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_03 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_04 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_05 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_06 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_07 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_08 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_09 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_0a (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_0b (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_0c (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_0d (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_0e (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_0f (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_10 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_11 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_12 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_13 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_14 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_15 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_16 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_17 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_18 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_19 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_1a (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_1b (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_1c (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_1d (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_1e (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_1f (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_20 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_21 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_22 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_23 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_24 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_25 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_26 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_27 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_28 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_29 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_2a (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_2b (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_2c (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_2d (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_2e (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_2f (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_30 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_31 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_32 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_33 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_34 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_35 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_36 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_37 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_38 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_39 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_3a (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_3b (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_3c (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_3d (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_3e (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_3f (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_40 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_41 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_42 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_43 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_44 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_45 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_46 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_47 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_48 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_49 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_4a (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_4b (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_4c (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_4d (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_4e (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_4f (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_50 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_51 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_52 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_53 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_54 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_55 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_56 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_57 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_58 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_59 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_5a (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_5b (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_5c (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_5d (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_5e (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_5f (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_60 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_61 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_62 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_63 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_64 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_65 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_66 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_67 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_68 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_69 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_6a (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_6b (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_6c (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_6d (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_6e (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_6f (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_70 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_71 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_72 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_73 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_74 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_75 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_76 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_77 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_78 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_79 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_7a (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_7b (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_7c (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_7d (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_7e (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_7f (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_80 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_81 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_82 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_83 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_84 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_85 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_86 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_87 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_88 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_89 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_8a (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_8b (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_8c (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_8d (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_8e (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_8f (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_90 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_91 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_92 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_93 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_94 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_95 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_96 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_97 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_98 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_99 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_9a (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_9b (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_9c (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_9d (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_9e (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_9f (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_a0 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_a1 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_a2 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_a3 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_a4 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_a5 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_a6 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_a7 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_a8 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_a9 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_aa (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_ab (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_ac (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_ad (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_ae (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_af (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_b0 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_b1 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_b2 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_b3 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_b4 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_b5 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_b6 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_b7 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_b8 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_b9 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_ba (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_bb (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_bc (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_bd (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_be (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_bf (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_c0 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_c1 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_c2 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_c3 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_c4 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_c5 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_c6 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_c7 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_c8 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_c9 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_ca (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_cb (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_cc (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_cd (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_ce (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_cf (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_d0 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_d1 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_d2 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_d3 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_d4 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_d5 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_d6 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_d7 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_d8 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_d9 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_da (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_db (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_dc (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_dd (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_de (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_df (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_e0 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_e1 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_e2 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_e3 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_e4 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_e5 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_e6 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_e7 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_e8 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_e9 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_ea (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_eb (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_ec (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_ed (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_ee (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_ef (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_f0 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_f1 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_f2 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_f3 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_f4 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_f5 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_f6 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_f7 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_f8 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_f9 (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_fa (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_fb (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_fc (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_fd (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_fe (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - objects_version_ff (object_id, object_version) { - object_id -> Bytea, - object_version -> Int8, - cp_sequence_number -> Int8, - } -} - -diesel::table! { - packages (package_id, original_id, package_version) { - package_id -> Bytea, - original_id -> Bytea, - package_version -> Int8, - move_package -> Bytea, - checkpoint_sequence_number -> Int8, - } -} - -diesel::table! { - protocol_configs (protocol_version, config_name) { - protocol_version -> Int8, - config_name -> Text, - config_value -> Nullable, - } -} - -diesel::table! { - pruner_cp_watermark (checkpoint_sequence_number) { - checkpoint_sequence_number -> Int8, - min_tx_sequence_number -> Int8, - max_tx_sequence_number -> Int8, - } -} - -diesel::table! { - transactions (tx_sequence_number) { - tx_sequence_number -> Int8, - transaction_digest -> Bytea, - raw_transaction -> Bytea, - raw_effects -> Bytea, - checkpoint_sequence_number -> Int8, - timestamp_ms -> Int8, - object_changes -> Array>, - balance_changes -> Array>, - events -> Array>, - transaction_kind -> Int2, - success_command_count -> Int2, - } -} - -diesel::table! { - transactions_partition_0 (tx_sequence_number) { - tx_sequence_number -> Int8, - transaction_digest -> Bytea, - raw_transaction -> Bytea, - raw_effects -> Bytea, - checkpoint_sequence_number -> Int8, - timestamp_ms -> Int8, - object_changes -> Array>, - balance_changes -> Array>, - events -> Array>, - transaction_kind -> Int2, - success_command_count -> Int2, - } -} - -diesel::table! { - tx_calls_fun (package, module, func, tx_sequence_number) { - tx_sequence_number -> Int8, - package -> Bytea, - module -> Text, - func -> Text, - sender -> Bytea, - } -} - -diesel::table! { - tx_calls_mod (package, module, tx_sequence_number) { - tx_sequence_number -> Int8, - package -> Bytea, - module -> Text, - sender -> Bytea, - } -} - -diesel::table! { - tx_calls_pkg (package, tx_sequence_number) { - tx_sequence_number -> Int8, - package -> Bytea, - sender -> Bytea, - } -} - -diesel::table! { - tx_changed_objects (object_id, tx_sequence_number) { - tx_sequence_number -> Int8, - object_id -> Bytea, - sender -> Bytea, - } -} - -diesel::table! { - tx_count_metrics (checkpoint_sequence_number) { - checkpoint_sequence_number -> Int8, - epoch -> Int8, - timestamp_ms -> Int8, - total_transaction_blocks -> Int8, - total_successful_transaction_blocks -> Int8, - total_successful_transactions -> Int8, - } -} - -diesel::table! { - tx_digests (tx_digest) { - tx_digest -> Bytea, - tx_sequence_number -> Int8, - } -} - -diesel::table! { - tx_input_objects (object_id, tx_sequence_number) { - tx_sequence_number -> Int8, - object_id -> Bytea, - sender -> Bytea, - } -} - -diesel::table! { - tx_kinds (tx_kind, tx_sequence_number) { - tx_sequence_number -> Int8, - tx_kind -> Int2, - } -} - -diesel::table! { - tx_recipients (recipient, tx_sequence_number) { - tx_sequence_number -> Int8, - recipient -> Bytea, - sender -> Bytea, - } -} - -diesel::table! { - tx_senders (sender, tx_sequence_number) { - tx_sequence_number -> Int8, - sender -> Bytea, - } -} - -#[macro_export] -macro_rules! for_all_tables { - ($action:path) => { - $action!( - active_addresses, - address_metrics, - addresses, - chain_identifier, - checkpoints, - display, - epoch_peak_tps, - epochs, - event_emit_module, - event_emit_package, - event_senders, - event_struct_instantiation, - event_struct_module, - event_struct_name, - event_struct_package, - events, - feature_flags, - move_call_metrics, - move_calls, - objects, - objects_history, - objects_snapshot, - objects_version, - packages, - protocol_configs, - pruner_cp_watermark, - transactions, - transactions_partition_0, - tx_calls_fun, - tx_calls_mod, - tx_calls_pkg, - tx_changed_objects, - tx_count_metrics, - tx_digests, - tx_input_objects, - tx_kinds, - tx_recipients, - tx_senders - ); - }; -} -pub use for_all_tables; - -for_all_tables!(diesel::allow_tables_to_appear_in_same_query); diff --git a/scripts/indexer-schema/Dockerfile b/scripts/indexer-schema/Dockerfile new file mode 100644 index 00000000000..0bccfbd07d2 --- /dev/null +++ b/scripts/indexer-schema/Dockerfile @@ -0,0 +1,21 @@ +# Use the official PostgreSQL image as a base +FROM postgres:15 + +# Install dependencies +RUN apt-get update && apt-get install -y \ + curl \ + build-essential \ + libpq-dev && \ + rm -rf /var/lib/apt/lists/* + +ARG RUST_TOOLCHAIN_VERSION + +# Install Rust +RUN curl https://sh.rustup.rs -sSf | sh -s -- -y --default-toolchain ${RUST_TOOLCHAIN_VERSION} + +# Install Diesel CLI +RUN /root/.cargo/bin/cargo install diesel_cli --no-default-features --features postgres + +# Add the Rust and Diesel CLI binaries to PATH +ENV PATH="/root/.cargo/bin:${PATH}" + diff --git a/scripts/indexer-schema/build.sh b/scripts/indexer-schema/build.sh new file mode 100755 index 00000000000..eb97c50be16 --- /dev/null +++ b/scripts/indexer-schema/build.sh @@ -0,0 +1,19 @@ +#!/bin/bash +set -x +set -e + +if ! command -v git &> /dev/null; then + echo "git not installed" >&2 + exit 1 +fi + +REPO_ROOT=$(git rev-parse --show-toplevel) + +echo "Parse the rust toolchain version from 'rust-toolchain.toml'..." +RUST_TOOLCHAIN_VERSION=$(grep -oE 'channel = "[^"]+' ${REPO_ROOT}/rust-toolchain.toml | sed 's/channel = "//') +if [ -z "$RUST_TOOLCHAIN_VERSION" ]; then + echo "Failed to parse the rust toolchain version" + exit 1 +fi + +docker build --build-arg RUST_TOOLCHAIN_VERSION=${RUST_TOOLCHAIN_VERSION} -t postgres-rust-diesel ${REPO_ROOT}/scripts/indexer-schema diff --git a/scripts/indexer-schema/generate.sh b/scripts/indexer-schema/generate.sh new file mode 100755 index 00000000000..ce7e3c13ddb --- /dev/null +++ b/scripts/indexer-schema/generate.sh @@ -0,0 +1,67 @@ +#!/bin/bash +# Copyright (c) Mysten Labs, Inc. +# Modifications Copyright (c) 2024 IOTA Stiftung +# SPDX-License-Identifier: Apache-2.0 +# +# Update iota-indexer's generated src/schema.rs based on the schema after +# running all its migrations on a clean database. +set -x +set -e + +if ! command -v git &> /dev/null; then + echo "git not installed" >&2 + exit 1 +fi + +REPO=$(git rev-parse --show-toplevel) + +# Set up the Docker container with PostgreSQL and Diesel CLI +POSTGRES_USER=postgres +POSTGRES_PASSWORD=postgrespw +CONTAINER_NAME=postgres-rust-diesel + +# Ensure the required image is built +if ! docker image inspect ${CONTAINER_NAME} &> /dev/null; then + ${REPO}/scripts/indexer-schema/build.sh +fi + +function cleanup { + # Cleanup: Stop and remove the container + docker stop ${CONTAINER_NAME} +} +trap cleanup EXIT + +docker run --rm -d \ + --name ${CONTAINER_NAME} \ + -e POSTGRES_USER=${POSTGRES_USER} \ + -e POSTGRES_PASSWORD=${POSTGRES_PASSWORD} \ + -e RUST_TOOLCHAIN_VERSION=${RUST_TOOLCHAIN_VERSION} \ + -v "${REPO}:/workspace" \ + -w /workspace \ + ${CONTAINER_NAME} + +# Wait for Postgres to be ready +RETRIES=0 +while ! docker exec ${CONTAINER_NAME} pg_isready -p 5432 --username ${POSTGRES_USER}; do + if [ $RETRIES -gt 30 ]; then + echo "Postgres failed to start" >&2 + docker stop ${CONTAINER_NAME} + exit 1 + fi + sleep 1 + RETRIES=$((RETRIES + 1)) +done + +# Run migrations and generate the schema.rs file +docker exec ${CONTAINER_NAME} diesel migration run \ + --database-url "postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@localhost:5432" \ + --migration-dir "/workspace/crates/iota-indexer/migrations/pg" + +docker exec ${CONTAINER_NAME} diesel print-schema \ + --database-url "postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@localhost:5432" \ + --patch-file "/workspace/crates/iota-indexer/src/schema.patch" \ + --except-tables "^objects_version_|_partition_" \ + > "${REPO}/crates/iota-indexer/src/schema.rs" + +# Applying the patch may destroy the formatting, fix it +rustfmt +nightly "${REPO}/crates/iota-indexer/src/schema.rs" From 45ad36672bccbf996669dcd6e388c8d6f79a284b Mon Sep 17 00:00:00 2001 From: Mirko Zichichi Date: Wed, 29 Jan 2025 10:01:27 +0100 Subject: [PATCH 18/51] fix(genesis-builder): Always destroy allocation objects when picked (#5028) * fix: examine genesis checkpoint * chore: clippy and fmt * refactor: is_maybe to try_from * chore: remove unused functions * refactor: remove unwrap from func * chore: remove unused to_bytes funcs * chore: cargo fmt * chore: correct spelling * fix(genesis-inspector): consider TimelockedStakedIota as a stake * feat(genesis-builder): validate migration objects after build * fix(genesis-builder): always destroy allocation objects when picked * revert changes to pick_objects_for_allocation * fix(iota-genesis-builder): destroy timelocks after split PTB * fix(migration_tx_data): add timelock gas balance check --------- Co-authored-by: nonast <29281463+nonast@users.noreply.github.com> --- crates/iota-config/src/migration_tx_data.rs | 37 ++++- crates/iota-genesis-builder/src/lib.rs | 18 ++- crates/iota-genesis-builder/src/stake.rs | 153 ++++++++++---------- 3 files changed, 130 insertions(+), 78 deletions(-) diff --git a/crates/iota-config/src/migration_tx_data.rs b/crates/iota-config/src/migration_tx_data.rs index 9ae343d9e51..9a2a9face87 100644 --- a/crates/iota-config/src/migration_tx_data.rs +++ b/crates/iota-config/src/migration_tx_data.rs @@ -11,11 +11,15 @@ use std::{ use anyhow::{Context, Result}; use iota_genesis_common::prepare_and_execute_genesis_transaction; use iota_types::{ + balance::Balance, digests::TransactionDigest, effects::{TransactionEffects, TransactionEffectsAPI, TransactionEvents}, + gas_coin::GasCoin, message_envelope::Message, messages_checkpoint::{CheckpointContents, CheckpointSummary}, - object::Object, + object::{Data, Object}, + stardust::output::{AliasOutput, BasicOutput, NftOutput}, + timelock::timelock::{TimeLock, is_timelocked_gas_balance}, transaction::Transaction, }; use serde::{Deserialize, Serialize}; @@ -155,6 +159,37 @@ impl MigrationTxData { ) } + /// Validates the total supply of the migration data adding up the amount of + /// gas coins found in migrated objects. + pub fn validate_total_supply(&self, expected_total_supply: u64) -> anyhow::Result<()> { + let total_supply: u64 = self + .get_objects() + .map(|object| match &object.data { + Data::Move(_) => GasCoin::try_from(&object) + .map(|gas| gas.value()) + .or_else(|_| { + TimeLock::::try_from(&object).map(|t| { + assert!(is_timelocked_gas_balance( + &object.struct_tag().expect("should not be a package") + )); + t.locked().value() + }) + }) + .or_else(|_| AliasOutput::try_from(&object).map(|a| a.balance.value())) + .or_else(|_| BasicOutput::try_from(&object).map(|b| b.balance.value())) + .or_else(|_| NftOutput::try_from(&object).map(|n| n.balance.value())) + .unwrap_or(0), + Data::Package(_) => 0, + }) + .sum(); + + anyhow::ensure!( + total_supply == expected_total_supply, + "the migration data total supply of {total_supply} does not match the expected total supply of {expected_total_supply}" + ); + Ok(()) + } + /// Loads a `MigrationTxData` in memory from a file found in `path`. pub fn load>(path: P) -> Result { let path = path.as_ref(); diff --git a/crates/iota-genesis-builder/src/lib.rs b/crates/iota-genesis-builder/src/lib.rs index bd6818b6c9e..517f20a3838 100644 --- a/crates/iota-genesis-builder/src/lib.rs +++ b/crates/iota-genesis-builder/src/lib.rs @@ -789,6 +789,9 @@ impl Builder { // Validate migration content in order to avoid corrupted or malicious data if let Some(migration_tx_data) = &self.migration_tx_data { + migration_tx_data + .validate_total_supply(token_distribution_schedule.pre_minted_supply) + .expect("the migration data does not contain the expected total supply"); migration_tx_data .validate_from_unsigned_genesis(&unsigned_genesis) .expect("the migration data is corrupted"); @@ -1714,7 +1717,10 @@ pub fn split_timelocks( ChainIdentifier::default().chain(), ); - // Timelock split + // Timelocks split PTB + // It takes a list of timelocks_to_split references; then for each timelock it + // invokes "timelock::split" and then transfers the result to the indicated + // recipient. let mut timelock_split_input_objects: Vec = vec![]; let pt = { let mut builder = ProgrammableTransactionBuilder::new(); @@ -1746,6 +1752,9 @@ pub fn split_timelocks( builder.finish() }; + // Execute the timelocks split PTB in a genesis environment; it returns a list + // of written objects that includes the modified timelocks (the ones that were + // split), plus the newly created timelocks let InnerTemporaryStore { written, .. } = executor.update_genesis_state( &*store, &protocol_config, @@ -1755,8 +1764,15 @@ pub fn split_timelocks( pt, )?; + // Insert the written objects into the store store.finish(written); + // Finally, we can destroy the timelocks that were split, keeping in the store + // only the newly created timelocks + for ((id, _, _), _, _) in timelocks_to_split { + store.remove_object(*id); + } + Ok(()) } diff --git a/crates/iota-genesis-builder/src/stake.rs b/crates/iota-genesis-builder/src/stake.rs index ef856fd7bd8..2d9711b57fb 100644 --- a/crates/iota-genesis-builder/src/stake.rs +++ b/crates/iota-genesis-builder/src/stake.rs @@ -269,13 +269,13 @@ impl GenesisStake { // If some surplus amount is left, then return it to the delegator // In the case of a timelock object, it must be split during the `genesis` PTB // execution - if let (Some(surplus_timelock), surplus_nanos) = timelock_surplus.take() { + if let (Some(surplus_timelock), surplus_nanos, _) = timelock_surplus.take() { self.timelocks_to_split .push((surplus_timelock, surplus_nanos, delegator)); } // In the case of a gas coin, it must be destroyed and the surplus re-allocated // to the delegator (no split) - if let (Some(surplus_gas_coin), surplus_nanos) = gas_surplus.take() { + if let (Some(surplus_gas_coin), surplus_nanos, _) = gas_surplus.take() { self.gas_coins_to_destroy.push(surplus_gas_coin); self.create_token_allocation(delegator, surplus_nanos, None, None); } @@ -319,24 +319,31 @@ impl SurplusCoin { pub fn maybe_reuse_surplus( &mut self, target_amount_nanos: u64, - ) -> (Option, Option, u64) { + ) -> (Option, u64, u64) { + // If the surplus is some, then we can use the surplus nanos if self.coin_object_ref.is_some() { + // If the surplus nanos are less or equal than the target, then use them all and + // return the coin object to be destroyed if self.surplus_nanos <= target_amount_nanos { - let surplus = self.surplus_nanos; - self.surplus_nanos = 0; - (self.coin_object_ref.take(), Some(surplus), self.timestamp) + let (coin_object_ref_opt, surplus, timestamp) = self.take(); + (Some(coin_object_ref_opt.unwrap()), surplus, timestamp) } else { + // If the surplus nanos more than the target, do not return the coin object self.surplus_nanos -= target_amount_nanos; - (None, Some(target_amount_nanos), self.timestamp) + (None, target_amount_nanos, self.timestamp) } } else { - (None, None, 0) + (None, 0, 0) } } // Destroy the `CoinSurplus` and take the fields. - pub fn take(self) -> (Option, u64) { - (self.coin_object_ref, self.surplus_nanos) + pub fn take(&mut self) -> (Option, u64, u64) { + let surplus = self.surplus_nanos; + self.surplus_nanos = 0; + let timestamp = self.timestamp; + self.timestamp = 0; + (self.coin_object_ref.take(), surplus, timestamp) } } @@ -349,87 +356,81 @@ impl SurplusCoin { fn pick_objects_for_allocation<'obj>( pool: &mut impl Iterator, target_amount_nanos: u64, - previous_surplus_coin: &mut SurplusCoin, + surplus_coin: &mut SurplusCoin, ) -> AllocationObjects { - let mut allocation_tot_amount_nanos = 0; - let mut surplus_coin = SurplusCoin::default(); + // Vector used to keep track of timestamps while allocating timelock coins. // Will be left empty in the case of gas coins let mut staked_with_timelock = vec![]; + // Vector used to keep track of the coins to destroy. let mut to_destroy = vec![]; - - if let (surplus_object_option, Some(surplus_nanos), timestamp) = - previous_surplus_coin.maybe_reuse_surplus(target_amount_nanos) - { - // In here it means there are some surplus nanos that can be used. - // `maybe_reuse_surplus` already deducted the `surplus_nanos` from the - // `surplus_object`. So these can be counted in the - // `allocation_tot_amount_nanos`. - allocation_tot_amount_nanos += surplus_nanos; - // If the ´surplus_object´ is a timelock then store also its timestamp. - if timestamp > 0 { - staked_with_timelock.push((surplus_nanos, timestamp)); + // Variable used to keep track of allocated nanos during the picking. + let mut allocation_amount_nanos = 0; + + // Maybe use the surplus coin passed as input. + let (surplus_object_option, used_surplus_nanos, surplus_timestamp) = + surplus_coin.maybe_reuse_surplus(target_amount_nanos); + + // If the surplus coin was used then allocate the nanos and maybe destroy it + if used_surplus_nanos > 0 { + allocation_amount_nanos += used_surplus_nanos; + if surplus_timestamp > 0 { + staked_with_timelock.push((used_surplus_nanos, surplus_timestamp)); } // If the `surplus_object` is returned by `maybe_reuse_surplus`, then it means - // it used all its `surplus_nanos` and it can be destroyed. + // it used all its `used_surplus_nanos` and it can be destroyed. if let Some(surplus_object) = surplus_object_option { to_destroy.push(surplus_object); } - // Else, if the `surplus_object` was not completely drained, then we - // don't need to continue. In this case `allocation_tot_amount_nanos == - // target_amount_nanos`. } + // Else, if the `surplus_object` was not completely drained, then we + // don't need to continue. In this case `allocation_amount_nanos == + // target_amount_nanos`. + + // Only if `allocation_amount_nanos` < `target_amount_nanos` then pick an + // object (if we still have objects in the pool). If this object's balance is + // less than the difference required to reach the target, then push this + // object's reference into the `to_destroy` list. Else, take out only the + // required amount and set the object as a "surplus" (then break the loop). + while allocation_amount_nanos < target_amount_nanos { + if let Some((object, timestamp)) = pool.next() { + // In here we pick an object + let obj_ref = object.compute_object_reference(); + let object_balance = get_gas_balance_maybe(object) + .expect("the pool should only contain gas coins or timelock balance objects") + .value(); + + // Then we create the allocation + let difference_from_target = target_amount_nanos - allocation_amount_nanos; + let to_allocate = object_balance.min(difference_from_target); + allocation_amount_nanos += to_allocate; + if timestamp > 0 { + staked_with_timelock.push((to_allocate, timestamp)); + } - // We need this check to not consume the first element of the pool in the case - // `allocation_tot_amount_nanos == target_amount_nanos`; this case can only - // happen if the `surplus_coin` contained enough balance to cover for - // `target_amount_nanos`. - if allocation_tot_amount_nanos < target_amount_nanos { - to_destroy.append( - &mut pool - .by_ref() - .map_while(|(object, timestamp)| { - if allocation_tot_amount_nanos < target_amount_nanos { - let difference_from_target = - target_amount_nanos - allocation_tot_amount_nanos; - let obj_ref = object.compute_object_reference(); - let object_balance = get_gas_balance_maybe(object)?.value(); - - if object_balance <= difference_from_target { - if timestamp > 0 { - staked_with_timelock.push((object_balance, timestamp)); - } - allocation_tot_amount_nanos += object_balance; - // Place `obj_ref` in `to_destroy` and continue - Some(obj_ref) - } else { - surplus_coin = SurplusCoin { - coin_object_ref: Some(obj_ref), - surplus_nanos: object_balance - difference_from_target, - timestamp, - }; - if timestamp > 0 { - staked_with_timelock.push((difference_from_target, timestamp)); - } - allocation_tot_amount_nanos += difference_from_target; - // Do NOT place `obj_ref` in `to_destroy` because it is reused in the - // CoinSurplus and then break the map_while - None - } - } else { - // Break the map_while - None - } - }) - .collect::>(), - ); + // If the balance is less or equal than the difference from target, then + // place `obj_ref` in `to_destroy` and continue + if object_balance <= difference_from_target { + to_destroy.push(obj_ref); + } else { + // Else, do NOT place `obj_ref` in `to_destroy` because it is reused in + // the SurplusCoin and then BREAK, because we reached the target + *surplus_coin = SurplusCoin { + coin_object_ref: Some(obj_ref), + surplus_nanos: object_balance - difference_from_target, + timestamp, + }; + break; + } + } else { + // We have no more objects to pick from the pool; the function will end with + // allocation_amount_nanos < target_amount_nanos + break; + } } - // Update the surplus coin passed from the caller - *previous_surplus_coin = surplus_coin; - AllocationObjects { to_destroy, - amount_nanos: allocation_tot_amount_nanos, + amount_nanos: allocation_amount_nanos, staked_with_timelock, } } From b1d8ed3093afdb74dc7b1a259d463af56ebcd770 Mon Sep 17 00:00:00 2001 From: Marc Espin Date: Wed, 29 Jan 2025 10:29:37 +0100 Subject: [PATCH 19/51] feat(wallet-dashboard): Integrate Sentry (#4820) * refactor(tooling): Update usage of Sentry deprecated methods * feat(dashboard): Integrate Sentry * attempto to fix * deps * chore: add enabled check * chore: Get sentry traces rate from growthbook * chore: Embedded sentry traces rate * fmt * fix(dashboard): clean debris --------- Co-authored-by: cpl121 Co-authored-by: cpl121 <100352899+cpl121@users.noreply.github.com> --- apps/wallet-dashboard/.gitignore | 3 + apps/wallet-dashboard/app/global-error.tsx | 31 + apps/wallet-dashboard/instrumentation.ts | 5 + .../lib/utils/defaultRpcClient.ts | 36 + apps/wallet-dashboard/next.config.mjs | 37 +- apps/wallet-dashboard/package.json | 8 +- .../providers/AppProviders.tsx | 2 + apps/wallet-dashboard/sentry.client.config.ts | 17 + .../wallet-dashboard/sentry.common.config.mjs | 8 + apps/wallet-dashboard/sentry.edge.config.ts | 17 + apps/wallet-dashboard/sentry.server.config.ts | 17 + pnpm-lock.yaml | 996 +++++++++++------- 12 files changed, 799 insertions(+), 378 deletions(-) create mode 100644 apps/wallet-dashboard/app/global-error.tsx create mode 100644 apps/wallet-dashboard/instrumentation.ts create mode 100644 apps/wallet-dashboard/lib/utils/defaultRpcClient.ts create mode 100644 apps/wallet-dashboard/sentry.client.config.ts create mode 100644 apps/wallet-dashboard/sentry.common.config.mjs create mode 100644 apps/wallet-dashboard/sentry.edge.config.ts create mode 100644 apps/wallet-dashboard/sentry.server.config.ts diff --git a/apps/wallet-dashboard/.gitignore b/apps/wallet-dashboard/.gitignore index fd3dbb571a1..1dd45b20224 100644 --- a/apps/wallet-dashboard/.gitignore +++ b/apps/wallet-dashboard/.gitignore @@ -34,3 +34,6 @@ yarn-error.log* # typescript *.tsbuildinfo next-env.d.ts + +# Sentry Config File +.env.sentry-build-plugin diff --git a/apps/wallet-dashboard/app/global-error.tsx b/apps/wallet-dashboard/app/global-error.tsx new file mode 100644 index 00000000000..55127bd05bb --- /dev/null +++ b/apps/wallet-dashboard/app/global-error.tsx @@ -0,0 +1,31 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +'use client'; + +import '@iota/dapp-kit/dist/index.css'; +import './globals.css'; +import { Inter } from 'next/font/google'; +import { AppProviders } from '@/providers'; +import { FontLinks } from '@/components/FontLinks'; +import { useEffect } from 'react'; +import { captureException } from '@/instrumentation'; + +const inter = Inter({ subsets: ['latin'] }); + +export default function GlobalError({ error }: { error: Error & { digest?: string } }) { + useEffect(() => { + captureException(error); + }, [error]); + + return ( + + + + +

Something went wrong!

+ + + + ); +} diff --git a/apps/wallet-dashboard/instrumentation.ts b/apps/wallet-dashboard/instrumentation.ts new file mode 100644 index 00000000000..e54f0e74003 --- /dev/null +++ b/apps/wallet-dashboard/instrumentation.ts @@ -0,0 +1,5 @@ +export { captureException } from '@sentry/nextjs'; + +export async function register() { + // Only client is needed +} diff --git a/apps/wallet-dashboard/lib/utils/defaultRpcClient.ts b/apps/wallet-dashboard/lib/utils/defaultRpcClient.ts new file mode 100644 index 00000000000..90c69c78cdd --- /dev/null +++ b/apps/wallet-dashboard/lib/utils/defaultRpcClient.ts @@ -0,0 +1,36 @@ +// Copyright (c) Mysten Labs, Inc. +// Modifications Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +import { SentryHttpTransport } from '@iota/core'; +import { + IotaClient, + IotaHTTPTransport, + getNetwork, + Network, + type NetworkId, + getAllNetworks, +} from '@iota/iota-sdk/client'; + +export const SupportedNetworks = getAllNetworks(); + +const defaultClientMap: Map = new Map(); + +// NOTE: This class should not be used directly in React components, prefer to use the useIotaClient() hook instead +export const createIotaClient = (network: NetworkId): IotaClient => { + const existingClient = defaultClientMap.get(network); + if (existingClient) return existingClient; + + const supportedNetwork = getNetwork(network); + // If network is not supported, we use assume we are using a custom RPC + const networkUrl = supportedNetwork?.url ?? network; + + const client = new IotaClient({ + transport: + supportedNetwork && network === Network.Testnet // Sentry dev hint: change this to eg [Network.Localnet] + ? new SentryHttpTransport(networkUrl) + : new IotaHTTPTransport({ url: networkUrl }), + }); + defaultClientMap.set(network, client); + return client; +}; diff --git a/apps/wallet-dashboard/next.config.mjs b/apps/wallet-dashboard/next.config.mjs index 533cbcccda9..7b48bc6a491 100644 --- a/apps/wallet-dashboard/next.config.mjs +++ b/apps/wallet-dashboard/next.config.mjs @@ -1,6 +1,8 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 +import { SENTRY_ORG_NAME, SENTRY_PROJECT_NAME } from './sentry.common.config.mjs'; +import { withSentryConfig } from '@sentry/nextjs'; import { execSync } from 'child_process'; const NEXT_PUBLIC_DASHBOARD_REV = execSync('git rev-parse HEAD').toString().trim().toString(); @@ -24,4 +26,37 @@ const nextConfig = { }, }; -export default nextConfig; +export default withSentryConfig(nextConfig, { + // For all available options, see: + // https://github.com/getsentry/sentry-webpack-plugin#options + + org: SENTRY_ORG_NAME, + project: SENTRY_PROJECT_NAME, + + // Only print logs for uploading source maps in CI + silent: !process.env.CI, + + // For all available options, see: + // https://docs.sentry.io/platforms/javascript/guides/nextjs/manual-setup/ + + // Upload a larger set of source maps for prettier stack traces (increases build time) + widenClientFileUpload: true, + + // Uncomment to route browser requests to Sentry through a Next.js rewrite to circumvent ad-blockers. + // This can increase your server load as well as your hosting bill. + // Note: Check that the configured route will not match with your Next.js middleware, otherwise reporting of client- + // side errors will fail. + // tunnelRoute: "/monitoring", + + // Hides source maps from generated client bundles + hideSourceMaps: false, + + // Automatically tree-shake Sentry logger statements to reduce bundle size + disableLogger: true, + + // Enables automatic instrumentation of Vercel Cron Monitors. (Does not yet work with App Router route handlers.) + // See the following for more information: + // https://docs.sentry.io/product/crons/ + // https://vercel.com/docs/cron-jobs + automaticVercelMonitors: false, +}); diff --git a/apps/wallet-dashboard/package.json b/apps/wallet-dashboard/package.json index 8f2ff1358dd..eb0d2f527c7 100644 --- a/apps/wallet-dashboard/package.json +++ b/apps/wallet-dashboard/package.json @@ -3,8 +3,8 @@ "version": "0.1.0", "private": true, "scripts": { - "dev": "next dev", - "build": "next build", + "dev": "cross-env NODE_ENV=\"development\" next dev", + "build": "cross-env NODE_ENV=\"production\" next build", "start": "next start", "lint": "next lint && pnpm run prettier:check", "prettier:check": "prettier -c --ignore-unknown --ignore-path=../../.prettierignore --ignore-path=.prettierignore .", @@ -23,11 +23,12 @@ "@iota/dapp-kit": "workspace:*", "@iota/iota-sdk": "workspace:*", "@iota/wallet-standard": "workspace:*", + "@sentry/nextjs": "^7.120.3", "@tanstack/react-query": "^5.50.1", "@tanstack/react-virtual": "^3.5.0", "clsx": "^2.1.1", "formik": "^2.4.2", - "next": "14.2.15", + "next": "14.2.23", "react": "^18.3.1", "react-hot-toast": "^2.4.1", "zustand": "^4.4.1" @@ -37,6 +38,7 @@ "@types/jest": "^29.5.2", "@types/node": "^20.14.10", "@types/react": "^18.3.3", + "cross-env": "^7.0.3", "eslint": "^8.45.0", "eslint-config-next": "14.2.3", "jest": "^29.5.0", diff --git a/apps/wallet-dashboard/providers/AppProviders.tsx b/apps/wallet-dashboard/providers/AppProviders.tsx index f2af54c8658..9fc6ef3ead4 100644 --- a/apps/wallet-dashboard/providers/AppProviders.tsx +++ b/apps/wallet-dashboard/providers/AppProviders.tsx @@ -13,6 +13,7 @@ import { useState } from 'react'; import { KioskClientProvider, useLocalStorage } from '@iota/core'; import { growthbook } from '@/lib/utils'; import { ThemeProvider } from '@iota/core'; +import { createIotaClient } from '@/lib/utils/defaultRpcClient'; growthbook.init(); @@ -31,6 +32,7 @@ export function AppProviders({ children }: React.PropsWithChildren) { diff --git a/apps/wallet-dashboard/sentry.client.config.ts b/apps/wallet-dashboard/sentry.client.config.ts new file mode 100644 index 00000000000..ba4cbef2372 --- /dev/null +++ b/apps/wallet-dashboard/sentry.client.config.ts @@ -0,0 +1,17 @@ +// This file configures the initialization of Sentry on the client. +// The config you add here will be used whenever a users loads a page in their browser. +// https://docs.sentry.io/platforms/javascript/guides/nextjs/ + +import * as Sentry from '@sentry/nextjs'; +import { IS_PROD, SENTRY_DSN } from './sentry.common.config.mjs'; + +Sentry.init({ + enabled: IS_PROD, + dsn: SENTRY_DSN, + + // Define how likely traces are sampled. Adjust this value in production, or use tracesSampler for greater control. + tracesSampleRate: 0.0025, + + // Setting this option to true will print useful information to the console while you're setting up Sentry. + debug: false, +}); diff --git a/apps/wallet-dashboard/sentry.common.config.mjs b/apps/wallet-dashboard/sentry.common.config.mjs new file mode 100644 index 00000000000..33b6a30f0e3 --- /dev/null +++ b/apps/wallet-dashboard/sentry.common.config.mjs @@ -0,0 +1,8 @@ +export const IS_PROD = process.env.NODE_ENV === 'production'; + +export const SENTRY_DSN = IS_PROD + ? 'https://cb83626ca07d6cf66ca2f901cf53c051@o4508279186718720.ingest.de.sentry.io/4508647247249488' + : 'https://ba5d6596291f12e88625e02eb942b742@o4508279186718720.ingest.de.sentry.io/4508647248691280'; + +export const SENTRY_PROJECT_NAME = IS_PROD ? 'iota-wallet-dashboard' : 'iota-wallet-dashboard-dev'; +export const SENTRY_ORG_NAME = 'iota-foundation-eu'; diff --git a/apps/wallet-dashboard/sentry.edge.config.ts b/apps/wallet-dashboard/sentry.edge.config.ts new file mode 100644 index 00000000000..33aa77451c3 --- /dev/null +++ b/apps/wallet-dashboard/sentry.edge.config.ts @@ -0,0 +1,17 @@ +// This file configures the initialization of Sentry on the client. +// The config you add here will be used whenever a users loads a page in their browser. +// https://docs.sentry.io/platforms/javascript/guides/nextjs/ + +import * as Sentry from '@sentry/nextjs'; +import { IS_PROD, SENTRY_DSN } from './sentry.common.config.mjs'; + +Sentry.init({ + enabled: IS_PROD, + dsn: SENTRY_DSN, + + // Define how likely traces are sampled. Adjust this value in production, or use tracesSampler for greater control. + tracesSampleRate: 0, // Server is not traced + + // Setting this option to true will print useful information to the console while you're setting up Sentry. + debug: false, +}); diff --git a/apps/wallet-dashboard/sentry.server.config.ts b/apps/wallet-dashboard/sentry.server.config.ts new file mode 100644 index 00000000000..33aa77451c3 --- /dev/null +++ b/apps/wallet-dashboard/sentry.server.config.ts @@ -0,0 +1,17 @@ +// This file configures the initialization of Sentry on the client. +// The config you add here will be used whenever a users loads a page in their browser. +// https://docs.sentry.io/platforms/javascript/guides/nextjs/ + +import * as Sentry from '@sentry/nextjs'; +import { IS_PROD, SENTRY_DSN } from './sentry.common.config.mjs'; + +Sentry.init({ + enabled: IS_PROD, + dsn: SENTRY_DSN, + + // Define how likely traces are sampled. Adjust this value in production, or use tracesSampler for greater control. + tracesSampleRate: 0, // Server is not traced + + // Setting this option to true will print useful information to the console while you're setting up Sentry. + debug: false, +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6c3b2fb64a3..be805271ad3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -65,13 +65,13 @@ importers: version: 9.1.0(eslint@8.57.1) eslint-import-resolver-typescript: specifier: ^3.6.1 - version: 3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-plugin-import@2.30.0)(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) + version: 3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-plugin-import@2.30.0)(eslint@8.57.1) eslint-plugin-header: specifier: ^3.1.1 version: 3.1.1(eslint@8.57.1) eslint-plugin-import: specifier: ^2.29.1 - version: 2.30.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-plugin-import@2.30.0)(eslint@8.57.1))(eslint@8.57.1) + version: 2.30.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) eslint-plugin-license-check: specifier: link:linting/license-check version: link:linting/license-check @@ -150,7 +150,7 @@ importers: devDependencies: '@nestjs/cli': specifier: ^10.0.0 - version: 10.4.5(@swc/core@1.7.28(@swc/helpers@0.5.5)) + version: 10.4.5(@swc/core@1.7.28) '@nestjs/schematics': specifier: ^10.0.0 version: 10.1.4(chokidar@3.6.0)(typescript@5.6.2) @@ -186,7 +186,7 @@ importers: version: 5.2.1(@types/eslint@8.56.12)(eslint-config-prettier@9.1.0(eslint@8.57.1))(eslint@8.57.1)(prettier@3.3.3) jest: specifier: ^29.5.0 - version: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)) + version: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)) prettier: specifier: ^3.3.1 version: 3.3.3 @@ -198,13 +198,13 @@ importers: version: 6.3.4 ts-jest: specifier: ^29.1.0 - version: 29.2.5(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)))(typescript@5.6.2) + version: 29.2.5(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)))(typescript@5.6.2) ts-loader: specifier: ^9.4.4 - version: 9.5.1(typescript@5.6.2)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + version: 9.5.1(typescript@5.6.2)(webpack@5.95.0(@swc/core@1.7.28)) ts-node: specifier: ^10.9.1 - version: 10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2) + version: 10.9.2(@swc/core@1.7.28)(@types/node@20.16.9)(typescript@5.6.2) tsconfig-paths: specifier: ^4.2.0 version: 4.2.0 @@ -286,13 +286,13 @@ importers: devDependencies: '@headlessui/tailwindcss': specifier: ^0.1.3 - version: 0.1.3(tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2))) + version: 0.1.3(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2))) '@tailwindcss/aspect-ratio': specifier: ^0.4.2 - version: 0.4.2(tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2))) + version: 0.4.2(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2))) '@tailwindcss/forms': specifier: ^0.5.7 - version: 0.5.9(tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2))) + version: 0.5.9(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2))) '@types/react': specifier: ^18.3.3 version: 18.3.9 @@ -304,7 +304,7 @@ importers: version: 8.4.47 tailwindcss: specifier: ^3.3.3 - version: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2)) + version: 3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2)) typescript: specifier: ^5.5.3 version: 5.6.2 @@ -527,7 +527,7 @@ importers: version: 2.0.8 tailwindcss: specifier: ^3.3.3 - version: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)) + version: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28)(@types/node@20.16.9)(typescript@5.6.2)) tsconfig-paths: specifier: ^4.2.0 version: 4.2.0 @@ -563,7 +563,7 @@ importers: version: 5.0.10 tsup: specifier: ^8.3.5 - version: 8.3.5(@microsoft/api-extractor@7.48.1(@types/node@22.7.3))(@swc/core@1.7.28(@swc/helpers@0.5.5))(jiti@1.21.6)(postcss@8.4.47)(tsx@3.14.0)(typescript@5.6.2)(yaml@2.5.1) + version: 8.3.5(@microsoft/api-extractor@7.48.1(@types/node@22.7.3))(@swc/core@1.7.28)(jiti@1.21.6)(postcss@8.4.47)(tsx@3.14.0)(typescript@5.6.2)(yaml@2.5.1) typescript: specifier: ^5.5.3 version: 5.6.2 @@ -657,7 +657,7 @@ importers: version: 4.0.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@7.6.20) tailwindcss: specifier: ^3.3.3 - version: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)) + version: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28)(@types/node@20.16.9)(typescript@5.6.2)) typescript: specifier: ^5.5.3 version: 5.6.2 @@ -919,7 +919,7 @@ importers: version: 0.10.7 '@types/webpack': specifier: ^5.28.1 - version: 5.28.5(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4(webpack@5.95.0)) + version: 5.28.5(@swc/core@1.7.28)(webpack-cli@5.1.4(webpack@5.95.0)) '@types/zxcvbn': specifier: ^4.4.1 version: 4.4.5 @@ -928,19 +928,19 @@ importers: version: 4.3.1(vite@5.4.8(@types/node@20.16.9)(sass@1.79.3)(terser@5.34.0)) copy-webpack-plugin: specifier: ^11.0.0 - version: 11.0.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4)) + version: 11.0.0(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)) cross-env: specifier: ^7.0.3 version: 7.0.3 css-loader: specifier: ^6.7.3 - version: 6.11.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4)) + version: 6.11.0(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)) dotenv: specifier: ^16.4.5 version: 16.4.5 eslint-webpack-plugin: specifier: ^4.0.1 - version: 4.2.0(eslint@8.57.1)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4)) + version: 4.2.0(eslint@8.57.1)(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)) git-rev-sync: specifier: ^3.0.2 version: 3.0.2 @@ -949,10 +949,10 @@ importers: version: 15.11.7 html-webpack-plugin: specifier: ^5.5.3 - version: 5.6.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4)) + version: 5.6.0(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)) mini-css-extract-plugin: specifier: ^2.7.6 - version: 2.9.1(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4)) + version: 2.9.1(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)) onchange: specifier: ^7.1.0 version: 7.1.0 @@ -961,7 +961,7 @@ importers: version: 8.4.47 postcss-loader: specifier: ^7.3.3 - version: 7.3.4(postcss@8.4.47)(typescript@5.6.2)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4)) + version: 7.3.4(postcss@8.4.47)(typescript@5.6.2)(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)) postcss-preset-env: specifier: ^9.0.0 version: 9.6.0(postcss@8.4.47) @@ -970,19 +970,19 @@ importers: version: 1.79.3 sass-loader: specifier: ^13.3.2 - version: 13.3.3(sass@1.79.3)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4)) + version: 13.3.3(sass@1.79.3)(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)) tailwindcss: specifier: ^3.3.3 - version: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)) + version: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28)(@types/node@20.16.9)(typescript@5.6.2)) tailwindcss-animate: specifier: ^1.0.7 - version: 1.0.7(tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2))) + version: 1.0.7(tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28)(@types/node@20.16.9)(typescript@5.6.2))) ts-loader: specifier: ^9.4.4 - version: 9.5.1(typescript@5.6.2)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4)) + version: 9.5.1(typescript@5.6.2)(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)) ts-node: specifier: ^10.9.1 - version: 10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2) + version: 10.9.2(@swc/core@1.7.28)(@types/node@20.16.9)(typescript@5.6.2) tsconfig-paths: specifier: ^4.2.0 version: 4.2.0 @@ -1003,7 +1003,7 @@ importers: version: 8.3.0(body-parser@1.20.3) webpack: specifier: ^5.79.0 - version: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) + version: 5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4) webpack-cli: specifier: ^5.0.1 version: 5.1.4(webpack@5.95.0) @@ -1037,6 +1037,9 @@ importers: '@iota/wallet-standard': specifier: workspace:* version: link:../../sdk/wallet-standard + '@sentry/nextjs': + specifier: ^7.120.3 + version: 7.120.3(next@14.2.23(@babel/core@7.25.2)(@playwright/test@1.47.2)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.79.3))(react@18.3.1)(webpack@5.95.0) '@tanstack/react-query': specifier: ^5.50.1 version: 5.56.2(react@18.3.1) @@ -1050,8 +1053,8 @@ importers: specifier: ^2.4.2 version: 2.4.6(react@18.3.1) next: - specifier: 14.2.15 - version: 14.2.15(@babel/core@7.25.2)(@playwright/test@1.47.2)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.79.3) + specifier: 14.2.23 + version: 14.2.23(@babel/core@7.25.2)(@playwright/test@1.47.2)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.79.3) react: specifier: ^18.3.1 version: 18.3.1 @@ -1074,6 +1077,9 @@ importers: '@types/react': specifier: ^18.3.3 version: 18.3.9 + cross-env: + specifier: ^7.0.3 + version: 7.0.3 eslint: specifier: 8.57.1 version: 8.57.1 @@ -1082,16 +1088,16 @@ importers: version: 14.2.3(eslint@8.57.1)(typescript@5.6.2) jest: specifier: ^29.5.0 - version: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)) + version: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)) postcss: specifier: ^8.4.31 version: 8.4.47 tailwindcss: specifier: ^3.3.3 - version: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)) + version: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28)(@types/node@20.16.9)(typescript@5.6.2)) ts-jest: specifier: ^29.1.0 - version: 29.2.5(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)))(typescript@5.6.2) + version: 29.2.5(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)))(typescript@5.6.2) typescript: specifier: ^5.5.3 version: 5.6.2 @@ -1131,7 +1137,7 @@ importers: devDependencies: '@headlessui/tailwindcss': specifier: ^0.1.3 - version: 0.1.3(tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2))) + version: 0.1.3(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2))) '@types/react': specifier: ^18.3.3 version: 18.3.9 @@ -1149,7 +1155,7 @@ importers: version: 8.4.47 tailwindcss: specifier: ^3.3.3 - version: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2)) + version: 3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2)) typescript: specifier: ^5.5.3 version: 5.6.2 @@ -1243,7 +1249,7 @@ importers: devDependencies: '@tailwindcss/forms': specifier: ^0.5.7 - version: 0.5.9(tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2))) + version: 0.5.9(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2))) '@tsconfig/docusaurus': specifier: ^2.0.3 version: 2.0.3 @@ -1264,10 +1270,10 @@ importers: version: 8.4.47 tailwindcss: specifier: ^3.3.3 - version: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2)) + version: 3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2)) tailwindcss-animate: specifier: ^1.0.7 - version: 1.0.7(tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2))) + version: 1.0.7(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2))) typescript: specifier: ^5.5.3 version: 5.6.2 @@ -1313,7 +1319,7 @@ importers: version: 8.4.47 tailwindcss: specifier: ^3.3.3 - version: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2)) + version: 3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2)) typescript: specifier: ^5.5.3 version: 5.6.2 @@ -1334,28 +1340,28 @@ importers: version: 3.6.1(@algolia/client-search@4.24.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/core': specifier: 3.5.2 - version: 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + version: 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) '@docusaurus/plugin-client-redirects': specifier: 3.5.2 - version: 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + version: 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) '@docusaurus/preset-classic': specifier: 3.5.2 - version: 3.5.2(@algolia/client-search@4.24.0)(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + version: 3.5.2(@algolia/client-search@4.24.0)(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) '@docusaurus/remark-plugin-npm2yarn': specifier: ^3.5.2 version: 3.5.2 '@docusaurus/theme-common': specifier: ^3.5.2 - version: 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2))(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + version: 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) '@docusaurus/theme-live-codeblock': specifier: ^3.5.2 - version: 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2))(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + version: 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) '@docusaurus/theme-mermaid': specifier: ^3.5.2 - version: 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + version: 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) '@docusaurus/theme-search-algolia': specifier: ^3.5.2 - version: 3.5.2(@algolia/client-search@4.24.0)(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + version: 3.5.2(@algolia/client-search@4.24.0)(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) '@emotion/react': specifier: ^11.11.4 version: 11.13.3(@types/react@18.3.9)(react@18.3.1) @@ -1364,7 +1370,7 @@ importers: version: 11.13.0(@emotion/react@11.13.3(@types/react@18.3.9)(react@18.3.1))(@types/react@18.3.9)(react@18.3.1) '@graphql-markdown/docusaurus': specifier: ^1.24.1 - version: 1.26.2(@docusaurus/logger@3.5.2)(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(graphql-config@5.1.2(@types/node@22.7.3)(graphql@16.9.0)(typescript@5.6.2))(graphql@16.9.0)(prettier@3.3.3)(typescript@5.6.2) + version: 1.26.2(@docusaurus/logger@3.5.2)(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(graphql-config@5.1.2(@types/node@22.7.3)(graphql@16.9.0)(typescript@5.6.2))(graphql@16.9.0)(prettier@3.3.3)(typescript@5.6.2) '@graphql-tools/graphql-file-loader': specifier: ^8.0.1 version: 8.0.1(graphql@16.9.0) @@ -1460,7 +1466,7 @@ importers: version: 6.0.0 tailwindcss: specifier: ^3.3.3 - version: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2)) + version: 3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2)) web3: specifier: ^4.2.2 version: 4.13.0(typescript@5.6.2)(zod@3.23.8) @@ -1470,13 +1476,13 @@ importers: version: 7.25.2(@babel/core@7.25.2) '@docusaurus/module-type-aliases': specifier: 3.5.2 - version: 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/tsconfig': specifier: 3.5.2 version: 3.5.2 '@docusaurus/types': specifier: 3.5.2 - version: 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@metamask/providers': specifier: ^10.2.1 version: 10.2.1 @@ -1932,7 +1938,7 @@ importers: version: 5.6.2 typescript-json-schema: specifier: ^0.64.0 - version: 0.64.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + version: 0.64.0(@swc/core@1.7.28) packages: @@ -4836,62 +4842,62 @@ packages: '@nestjs/platform-express': optional: true - '@next/env@14.2.15': - resolution: {integrity: sha512-S1qaj25Wru2dUpcIZMjxeMVSwkt8BK4dmWHHiBuRstcIyOsMapqT4A4jSB6onvqeygkSSmOkyny9VVx8JIGamQ==} + '@next/env@14.2.23': + resolution: {integrity: sha512-CysUC9IO+2Bh0omJ3qrb47S8DtsTKbFidGm6ow4gXIG6reZybqxbkH2nhdEm1tC8SmgzDdpq3BIML0PWsmyUYA==} '@next/eslint-plugin-next@14.2.3': resolution: {integrity: sha512-L3oDricIIjgj1AVnRdRor21gI7mShlSwU/1ZGHmqM3LzHhXXhdkrfeNY5zif25Bi5Dd7fiJHsbhoZCHfXYvlAw==} - '@next/swc-darwin-arm64@14.2.15': - resolution: {integrity: sha512-Rvh7KU9hOUBnZ9TJ28n2Oa7dD9cvDBKua9IKx7cfQQ0GoYUwg9ig31O2oMwH3wm+pE3IkAQ67ZobPfEgurPZIA==} + '@next/swc-darwin-arm64@14.2.23': + resolution: {integrity: sha512-WhtEntt6NcbABA8ypEoFd3uzq5iAnrl9AnZt9dXdO+PZLACE32z3a3qA5OoV20JrbJfSJ6Sd6EqGZTrlRnGxQQ==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@14.2.15': - resolution: {integrity: sha512-5TGyjFcf8ampZP3e+FyCax5zFVHi+Oe7sZyaKOngsqyaNEpOgkKB3sqmymkZfowy3ufGA/tUgDPPxpQx931lHg==} + '@next/swc-darwin-x64@14.2.23': + resolution: {integrity: sha512-vwLw0HN2gVclT/ikO6EcE+LcIN+0mddJ53yG4eZd0rXkuEr/RnOaMH8wg/sYl5iz5AYYRo/l6XX7FIo6kwbw1Q==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@14.2.15': - resolution: {integrity: sha512-3Bwv4oc08ONiQ3FiOLKT72Q+ndEMyLNsc/D3qnLMbtUYTQAmkx9E/JRu0DBpHxNddBmNT5hxz1mYBphJ3mfrrw==} + '@next/swc-linux-arm64-gnu@14.2.23': + resolution: {integrity: sha512-uuAYwD3At2fu5CH1wD7FpP87mnjAv4+DNvLaR9kiIi8DLStWSW304kF09p1EQfhcbUI1Py2vZlBO2VaVqMRtpg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@14.2.15': - resolution: {integrity: sha512-k5xf/tg1FBv/M4CMd8S+JL3uV9BnnRmoe7F+GWC3DxkTCD9aewFRH1s5rJ1zkzDa+Do4zyN8qD0N8c84Hu96FQ==} + '@next/swc-linux-arm64-musl@14.2.23': + resolution: {integrity: sha512-Mm5KHd7nGgeJ4EETvVgFuqKOyDh+UMXHXxye6wRRFDr4FdVRI6YTxajoV2aHE8jqC14xeAMVZvLqYqS7isHL+g==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-x64-gnu@14.2.15': - resolution: {integrity: sha512-kE6q38hbrRbKEkkVn62reLXhThLRh6/TvgSP56GkFNhU22TbIrQDEMrO7j0IcQHcew2wfykq8lZyHFabz0oBrA==} + '@next/swc-linux-x64-gnu@14.2.23': + resolution: {integrity: sha512-Ybfqlyzm4sMSEQO6lDksggAIxnvWSG2cDWnG2jgd+MLbHYn2pvFA8DQ4pT2Vjk3Cwrv+HIg7vXJ8lCiLz79qoQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@14.2.15': - resolution: {integrity: sha512-PZ5YE9ouy/IdO7QVJeIcyLn/Rc4ml9M2G4y3kCM9MNf1YKvFY4heg3pVa/jQbMro+tP6yc4G2o9LjAz1zxD7tQ==} + '@next/swc-linux-x64-musl@14.2.23': + resolution: {integrity: sha512-OSQX94sxd1gOUz3jhhdocnKsy4/peG8zV1HVaW6DLEbEmRRtUCUQZcKxUD9atLYa3RZA+YJx+WZdOnTkDuNDNA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-win32-arm64-msvc@14.2.15': - resolution: {integrity: sha512-2raR16703kBvYEQD9HNLyb0/394yfqzmIeyp2nDzcPV4yPjqNUG3ohX6jX00WryXz6s1FXpVhsCo3i+g4RUX+g==} + '@next/swc-win32-arm64-msvc@14.2.23': + resolution: {integrity: sha512-ezmbgZy++XpIMTcTNd0L4k7+cNI4ET5vMv/oqNfTuSXkZtSA9BURElPFyarjjGtRgZ9/zuKDHoMdZwDZIY3ehQ==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-ia32-msvc@14.2.15': - resolution: {integrity: sha512-fyTE8cklgkyR1p03kJa5zXEaZ9El+kDNM5A+66+8evQS5e/6v0Gk28LqA0Jet8gKSOyP+OTm/tJHzMlGdQerdQ==} + '@next/swc-win32-ia32-msvc@14.2.23': + resolution: {integrity: sha512-zfHZOGguFCqAJ7zldTKg4tJHPJyJCOFhpoJcVxKL9BSUHScVDnMdDuOU1zPPGdOzr/GWxbhYTjyiEgLEpAoFPA==} engines: {node: '>= 10'} cpu: [ia32] os: [win32] - '@next/swc-win32-x64-msvc@14.2.15': - resolution: {integrity: sha512-SzqGbsLsP9OwKNUG9nekShTwhj6JSB9ZLMWQ8g1gG6hdE5gQLncbnbymrwy2yVmH9nikSLYRYxYMFu78Ggp7/g==} + '@next/swc-win32-x64-msvc@14.2.23': + resolution: {integrity: sha512-xCtq5BD553SzOgSZ7UH5LH+OATQihydObTrCTvVzOro8QiWYKdBVwcB2Mn2MLMo6DGW9yH1LSPw7jS7HhgJgjw==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -5917,6 +5923,15 @@ packages: '@repeaterjs/repeater@3.0.6': resolution: {integrity: sha512-Javneu5lsuhwNCryN+pXH93VPQ8g0dBX7wItHFgYiwQmzE1sVdg5tWHiOgHywzL2W21XQopa7IwIEnNbmeUJYA==} + '@rollup/plugin-commonjs@24.0.0': + resolution: {integrity: sha512-0w0wyykzdyRRPHOb0cQt14mIBLujfAv6GgP6g8nvg/iBxEm112t3YPPq+Buqe2+imvElTka+bjNlJ/gB56TD8g==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.68.0||^3.0.0 + peerDependenciesMeta: + rollup: + optional: true + '@rollup/pluginutils@5.1.2': resolution: {integrity: sha512-/FIdS3PyZ39bjZlwqFnWqCOVnW7o963LtKMwQOD0NhQqw22gSr2YY1afu3FxRip4ZCZNsD5jq6Aaz6QV3D/Njw==} engines: {node: '>=14.0.0'} @@ -6159,6 +6174,10 @@ packages: resolution: {integrity: sha512-eo2F8cP6X+vr54Mp6vu+NoQEDz0M5O24Tz8jPY0T1CpiWdwCmHb7Sln+oLXeQ3/LlWdVQihBfKDBZfBdUfsBTg==} engines: {node: '>=8'} + '@sentry-internal/tracing@7.120.3': + resolution: {integrity: sha512-Ausx+Jw1pAMbIBHStoQ6ZqDZR60PsCByvHdw/jdH9AqPrNE9xlBSf9EwcycvmrzwyKspSLaB52grlje2cRIUMg==} + engines: {node: '>=8'} + '@sentry/browser@7.120.2': resolution: {integrity: sha512-o5ll2Yv5MfnblbWxTvMlKK3RVXIbeJ+SPC+uw12b4j/pkrQg+/y7dyTLBXh6t0EgokSOsRUyYosQwSvxG/xs/Q==} engines: {node: '>=8'} @@ -6180,6 +6199,10 @@ packages: resolution: {integrity: sha512-eurLBFQJC7WWWYoEna25Z9I/GJjqAmH339tv52XP8sqXV7B5hRcHDcfrsT/UGHpU316M24p3lWhj0eimtCZ0SQ==} engines: {node: '>=8'} + '@sentry/core@7.120.3': + resolution: {integrity: sha512-vyy11fCGpkGK3qI5DSXOjgIboBZTriw0YDx/0KyX5CjIjDDNgp5AGgpgFkfZyiYiaU2Ww3iFuKo4wHmBusz1uA==} + engines: {node: '>=8'} + '@sentry/hub@6.19.7': resolution: {integrity: sha512-y3OtbYFAqKHCWezF0EGGr5lcyI2KbaXW2Ik7Xp8Mu9TxbSTuwTe4rTntwg8ngPjUQU3SUHzgjqVB8qjiGqFXCA==} engines: {node: '>=6'} @@ -6188,20 +6211,45 @@ packages: resolution: {integrity: sha512-bMvL2fD3TGLM5YAUoQ2Qz6bYeVU8f7YRFNSjKNxK4EbvFgAU9j1FD6EKg0V0RNOJYnJjGIZYMmcWTXBbVTJL6w==} engines: {node: '>=8'} + '@sentry/integrations@7.120.3': + resolution: {integrity: sha512-6i/lYp0BubHPDTg91/uxHvNui427df9r17SsIEXa2eKDwQ9gW2qRx5IWgvnxs2GV/GfSbwcx4swUB3RfEWrXrQ==} + engines: {node: '>=8'} + '@sentry/minimal@6.19.7': resolution: {integrity: sha512-wcYmSJOdvk6VAPx8IcmZgN08XTXRwRtB1aOLZm+MVHjIZIhHoBGZJYTVQS/BWjldsamj2cX3YGbGXNunaCfYJQ==} engines: {node: '>=6'} + '@sentry/nextjs@7.120.3': + resolution: {integrity: sha512-dP7yyziUi7IzAfalakYzDDCwitI6pmh+9fKInsk4WeGRU+zRZphLOngj2ZYqUurjXeOUHaO3DIlnRB9R9WG5WA==} + engines: {node: '>=8'} + peerDependencies: + next: ^10.0.8 || ^11.0 || ^12.0 || ^13.0 || ^14.0 + react: 16.x || 17.x || 18.x + webpack: '>= 4.0.0' + peerDependenciesMeta: + webpack: + optional: true + '@sentry/node@6.19.7': resolution: {integrity: sha512-gtmRC4dAXKODMpHXKfrkfvyBL3cI8y64vEi3fDD046uqYcrWdgoQsffuBbxMAizc6Ez1ia+f0Flue6p15Qaltg==} engines: {node: '>=6'} + '@sentry/node@7.120.3': + resolution: {integrity: sha512-t+QtekZedEfiZjbkRAk1QWJPnJlFBH/ti96tQhEq7wmlk3VszDXraZvLWZA0P2vXyglKzbWRGkT31aD3/kX+5Q==} + engines: {node: '>=8'} + '@sentry/react@7.119.0': resolution: {integrity: sha512-cf8Cei+qdSA26gx+IMAuc/k44PeBImNzIpXi3930SLhUe44ypT5OZ/44L6xTODHZzTIyMSJPduf59vT2+eW9yg==} engines: {node: '>=8'} peerDependencies: react: 15.x || 16.x || 17.x || 18.x + '@sentry/react@7.120.3': + resolution: {integrity: sha512-BcpoK9dwblfb20xwjn/1DRtplvPEXFc3XCRkYSnTfnfZNU8yPOcVX4X2X0I8R+/gsg+MWiFOdEtXJ3FqpJiJ4Q==} + engines: {node: '>=8'} + peerDependencies: + react: 15.x || 16.x || 17.x || 18.x + '@sentry/replay@7.120.2': resolution: {integrity: sha512-UAw0anHwXeej0Rfx+7qZVbRb3rj3mQ0DuHqdpPTSd9WpfRGOvCfthMIKD7rfHX7GjMnPMgdmsaU8K3lpe60h+w==} engines: {node: '>=12'} @@ -6218,6 +6266,10 @@ packages: resolution: {integrity: sha512-FWVoiblHQJ892GaOqdXx/5/n5XDLF28z81vJ0lCY49PMh8waz8LJ0b9RSmt9tasSDl0OQ7eUlPl1xu1jTrv1NA==} engines: {node: '>=8'} + '@sentry/types@7.120.3': + resolution: {integrity: sha512-C4z+3kGWNFJ303FC+FxAd4KkHvxpNFYAFN8iMIgBwJdpIl25KZ8Q/VdGn0MLLUEHNLvjob0+wvwlcRBBNLXOow==} + engines: {node: '>=8'} + '@sentry/utils@6.19.7': resolution: {integrity: sha512-z95ECmE3i9pbWoXQrD/7PgkBAzJYR+iXtPuTkpBjDKs86O3mT+PXOT3BAn79w2wkn7/i3vOGD2xVr1uiMl26dA==} engines: {node: '>=6'} @@ -6230,6 +6282,14 @@ packages: resolution: {integrity: sha512-jgnQlw11mRfQrQRAXbq4zEd+tbYwHel5eqeS/oU6EImXRjmHNtS79nB8MHvJeQu1FMCpFs1Ymrrs5FICwS6VeQ==} engines: {node: '>=8'} + '@sentry/utils@7.120.3': + resolution: {integrity: sha512-UDAOQJtJDxZHQ5Nm1olycBIsz2wdGX8SdzyGVHmD8EOQYAeDZQyIlQYohDe9nazdIOQLZCIc3fU0G9gqVLkaGQ==} + engines: {node: '>=8'} + + '@sentry/vercel-edge@7.120.3': + resolution: {integrity: sha512-/kfz28EsBpwppZniCjhi07TyupGDyVtA1QFcuIebluYsd9u/4kHKwhxlaLA2qlKxlBnSrvJAfYupNDvE/QXXrg==} + engines: {node: '>=8'} + '@sentry/webpack-plugin@1.21.0': resolution: {integrity: sha512-x0PYIMWcsTauqxgl7vWUY6sANl+XGKtx7DCVnnY7aOIIlIna0jChTAPANTfA2QrK+VK+4I/4JxatCEZBnXh3Og==} engines: {node: '>= 8'} @@ -11327,6 +11387,9 @@ packages: is-potential-custom-element-name@1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + is-reference@1.2.1: + resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} + is-reference@3.0.2: resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==} @@ -12615,8 +12678,8 @@ packages: neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - next@14.2.15: - resolution: {integrity: sha512-h9ctmOokpoDphRvMGnwOJAedT6zKhwqyZML9mDtspgf4Rh3Pn7UTYKqePNoDvhsWBAO5GoPNYshnAUGIazVGmw==} + next@14.2.23: + resolution: {integrity: sha512-mjN3fE6u/tynneLiEg56XnthzuYw+kD7mCujgVqioxyPqbmiotUCGJpIZGS/VaPg3ZDT1tvWxiVyRzeqJFm/kw==} engines: {node: '>=18.17.0'} hasBin: true peerDependencies: @@ -14520,6 +14583,11 @@ packages: robust-predicates@3.0.2: resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} + rollup@2.79.2: + resolution: {integrity: sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==} + engines: {node: '>=10.0.0'} + hasBin: true + rollup@3.29.5: resolution: {integrity: sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w==} engines: {node: '>=14.18.0', npm: '>=8.0.0'} @@ -14914,6 +14982,10 @@ packages: stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + stacktrace-parser@0.1.10: + resolution: {integrity: sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==} + engines: {node: '>=6'} + start-server-and-test@2.0.8: resolution: {integrity: sha512-v2fV6NV2F7tL1ocwfI4Wpait+IKjRbT5l3ZZ+ZikXdMLmxYsS8ynGAsCQAUVXkVyGyS+UibsRnvgHkMvJIvCsw==} engines: {node: '>=16'} @@ -15600,6 +15672,10 @@ packages: resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} engines: {node: '>=8'} + type-fest@0.7.1: + resolution: {integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==} + engines: {node: '>=8'} + type-fest@0.8.1: resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} engines: {node: '>=8'} @@ -18304,7 +18380,7 @@ snapshots: transitivePeerDependencies: - '@algolia/client-search' - '@docusaurus/core@3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)': + '@docusaurus/core@3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)': dependencies: '@babel/core': 7.25.2 '@babel/generator': 7.25.6 @@ -18318,13 +18394,13 @@ snapshots: '@babel/traverse': 7.25.6 '@docusaurus/cssnano-preset': 3.5.2 '@docusaurus/logger': 3.5.2 - '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) - '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) + '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) + '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) '@mdx-js/react': 3.0.1(@types/react@18.3.9)(react@18.3.1) autoprefixer: 10.4.20(postcss@8.4.47) - babel-loader: 9.2.1(@babel/core@7.25.2)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + babel-loader: 9.2.1(@babel/core@7.25.2)(webpack@5.95.0) babel-plugin-dynamic-import-node: 2.3.3 boxen: 6.2.1 chalk: 4.1.2 @@ -18333,34 +18409,34 @@ snapshots: cli-table3: 0.6.5 combine-promises: 1.2.0 commander: 5.1.0 - copy-webpack-plugin: 11.0.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + copy-webpack-plugin: 11.0.0(webpack@5.95.0) core-js: 3.38.1 - css-loader: 6.11.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) - css-minimizer-webpack-plugin: 5.0.1(clean-css@5.3.3)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + css-loader: 6.11.0(webpack@5.95.0) + css-minimizer-webpack-plugin: 5.0.1(clean-css@5.3.3)(webpack@5.95.0) cssnano: 6.1.2(postcss@8.4.47) del: 6.1.1 detect-port: 1.6.1 escape-html: 1.0.3 eta: 2.2.0 eval: 0.1.8 - file-loader: 6.2.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + file-loader: 6.2.0(webpack@5.95.0) fs-extra: 11.2.0 html-minifier-terser: 7.2.0 html-tags: 3.3.1 - html-webpack-plugin: 5.6.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + html-webpack-plugin: 5.6.0(webpack@5.95.0) leven: 3.1.0 lodash: 4.17.21 - mini-css-extract-plugin: 2.9.1(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + mini-css-extract-plugin: 2.9.1(webpack@5.95.0) p-map: 4.0.0 postcss: 8.4.47 - postcss-loader: 7.3.4(postcss@8.4.47)(typescript@5.6.2)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + postcss-loader: 7.3.4(postcss@8.4.47)(typescript@5.6.2)(webpack@5.95.0) prompts: 2.4.2 react: 18.3.1 - react-dev-utils: 12.0.1(eslint@8.57.1)(typescript@5.6.2)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + react-dev-utils: 12.0.1(eslint@8.57.1)(typescript@5.6.2)(webpack@5.95.0) react-dom: 18.3.1(react@18.3.1) react-helmet-async: 1.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-loadable: '@docusaurus/react-loadable@6.0.0(react@18.3.1)' - react-loadable-ssr-addon-v5-slorber: 1.0.1(@docusaurus/react-loadable@6.0.0(react@18.3.1))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + react-loadable-ssr-addon-v5-slorber: 1.0.1(@docusaurus/react-loadable@6.0.0(react@18.3.1))(webpack@5.95.0) react-router: 5.3.4(react@18.3.1) react-router-config: 5.1.1(react-router@5.3.4(react@18.3.1))(react@18.3.1) react-router-dom: 5.3.4(react@18.3.1) @@ -18368,15 +18444,15 @@ snapshots: semver: 7.6.3 serve-handler: 6.1.5 shelljs: 0.8.5 - terser-webpack-plugin: 5.3.10(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + terser-webpack-plugin: 5.3.10(webpack@5.95.0) tslib: 2.7.0 update-notifier: 6.0.2 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.95.0))(webpack@5.95.0) + webpack: 5.95.0 webpack-bundle-analyzer: 4.10.2 - webpack-dev-server: 4.15.2(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + webpack-dev-server: 4.15.2(webpack@5.95.0) webpack-merge: 5.10.0 - webpackbar: 5.0.2(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + webpackbar: 5.0.2(webpack@5.95.0) transitivePeerDependencies: - '@docusaurus/types' - '@parcel/css' @@ -18408,16 +18484,16 @@ snapshots: chalk: 4.1.2 tslib: 2.7.0 - '@docusaurus/mdx-loader@3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)': + '@docusaurus/mdx-loader@3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)': dependencies: '@docusaurus/logger': 3.5.2 - '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) - '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) + '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) + '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) '@mdx-js/mdx': 3.0.1 '@slorber/remark-comment': 1.0.0 escape-html: 1.0.3 estree-util-value-to-estree: 3.1.2 - file-loader: 6.2.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + file-loader: 6.2.0(webpack@5.95.0) fs-extra: 11.2.0 image-size: 1.1.1 mdast-util-mdx: 3.0.0 @@ -18433,9 +18509,9 @@ snapshots: tslib: 2.7.0 unified: 11.0.5 unist-util-visit: 5.0.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.95.0))(webpack@5.95.0) vfile: 6.0.3 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.95.0 transitivePeerDependencies: - '@docusaurus/types' - '@swc/core' @@ -18445,9 +18521,9 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/module-type-aliases@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@docusaurus/module-type-aliases@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@docusaurus/types': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@types/history': 4.7.11 '@types/react': 18.3.9 '@types/react-router-config': 5.0.11 @@ -18463,13 +18539,13 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/plugin-client-redirects@3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)': + '@docusaurus/plugin-client-redirects@3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)': dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) '@docusaurus/logger': 3.5.2 - '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) - '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) + '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) + '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) eta: 2.2.0 fs-extra: 11.2.0 lodash: 4.17.21 @@ -18496,17 +18572,17 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/plugin-content-blog@3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)': + '@docusaurus/plugin-content-blog@3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)': dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) '@docusaurus/logger': 3.5.2 - '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/plugin-content-docs': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2))(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/types': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) - '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) + '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/plugin-content-docs': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) + '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) cheerio: 1.0.0-rc.12 feed: 4.2.2 fs-extra: 11.2.0 @@ -18518,7 +18594,7 @@ snapshots: tslib: 2.7.0 unist-util-visit: 5.0.0 utility-types: 3.11.0 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.95.0 transitivePeerDependencies: - '@mdx-js/react' - '@parcel/css' @@ -18538,17 +18614,17 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)': + '@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)': dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) '@docusaurus/logger': 3.5.2 - '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/module-type-aliases': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2))(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/types': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) - '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) + '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/module-type-aliases': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) + '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) '@types/react-router-config': 5.0.11 combine-promises: 1.2.0 fs-extra: 11.2.0 @@ -18558,7 +18634,7 @@ snapshots: react-dom: 18.3.1(react@18.3.1) tslib: 2.7.0 utility-types: 3.11.0 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.95.0 transitivePeerDependencies: - '@mdx-js/react' - '@parcel/css' @@ -18578,18 +18654,18 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/plugin-content-pages@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)': + '@docusaurus/plugin-content-pages@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)': dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/types': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) - '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) + '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) fs-extra: 11.2.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) tslib: 2.7.0 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.95.0 transitivePeerDependencies: - '@mdx-js/react' - '@parcel/css' @@ -18609,11 +18685,11 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/plugin-debug@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)': + '@docusaurus/plugin-debug@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)': dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/types': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) fs-extra: 11.2.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -18638,11 +18714,11 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/plugin-google-analytics@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)': + '@docusaurus/plugin-google-analytics@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)': dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/types': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) tslib: 2.7.0 @@ -18665,11 +18741,11 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/plugin-google-gtag@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)': + '@docusaurus/plugin-google-gtag@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)': dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/types': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) '@types/gtag.js': 0.0.12 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -18693,11 +18769,11 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/plugin-google-tag-manager@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)': + '@docusaurus/plugin-google-tag-manager@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)': dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/types': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) tslib: 2.7.0 @@ -18720,14 +18796,14 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/plugin-sitemap@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)': + '@docusaurus/plugin-sitemap@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)': dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) '@docusaurus/logger': 3.5.2 - '@docusaurus/types': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) - '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) + '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) + '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) fs-extra: 11.2.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -18752,21 +18828,21 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/preset-classic@3.5.2(@algolia/client-search@4.24.0)(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)': - dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/plugin-content-blog': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/plugin-content-docs': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/plugin-content-pages': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/plugin-debug': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/plugin-google-analytics': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/plugin-google-gtag': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/plugin-google-tag-manager': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/plugin-sitemap': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/theme-classic': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2))(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/theme-search-algolia': 3.5.2(@algolia/client-search@4.24.0)(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/types': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/preset-classic@3.5.2(@algolia/client-search@4.24.0)(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)': + dependencies: + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/plugin-content-blog': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/plugin-content-docs': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/plugin-content-pages': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/plugin-debug': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/plugin-google-analytics': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/plugin-google-gtag': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/plugin-google-tag-manager': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/plugin-sitemap': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/theme-classic': 3.5.2(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/theme-search-algolia': 3.5.2(@algolia/client-search@4.24.0)(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) transitivePeerDependencies: @@ -18806,20 +18882,20 @@ snapshots: transitivePeerDependencies: - supports-color - '@docusaurus/theme-classic@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)': + '@docusaurus/theme-classic@3.5.2(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)': dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/module-type-aliases': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/plugin-content-blog': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/plugin-content-docs': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/plugin-content-pages': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2))(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/module-type-aliases': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/plugin-content-blog': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/plugin-content-docs': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/plugin-content-pages': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) '@docusaurus/theme-translations': 3.5.2 - '@docusaurus/types': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) - '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) + '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) + '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) '@mdx-js/react': 3.0.1(@types/react@18.3.9)(react@18.3.1) clsx: 2.1.1 copy-text-to-clipboard: 3.2.0 @@ -18854,13 +18930,13 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/theme-common@3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2))(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)': + '@docusaurus/theme-common@3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)': dependencies: - '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/module-type-aliases': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/plugin-content-docs': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) - '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/module-type-aliases': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/plugin-content-docs': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) + '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@types/history': 4.7.11 '@types/react': 18.3.9 '@types/react-router-config': 5.0.11 @@ -18880,12 +18956,12 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/theme-live-codeblock@3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2))(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)': + '@docusaurus/theme-live-codeblock@3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)': dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2))(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) '@docusaurus/theme-translations': 3.5.2 - '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) + '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) '@philpl/buble': 0.19.7 clsx: 2.1.1 fs-extra: 11.2.0 @@ -18914,13 +18990,13 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/theme-mermaid@3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)': + '@docusaurus/theme-mermaid@3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)': dependencies: - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/module-type-aliases': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2))(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/types': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/module-type-aliases': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) mermaid: 10.9.3 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -18945,16 +19021,16 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/theme-search-algolia@3.5.2(@algolia/client-search@4.24.0)(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)': + '@docusaurus/theme-search-algolia@3.5.2(@algolia/client-search@4.24.0)(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@types/react@18.3.9)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)': dependencies: '@docsearch/react': 3.6.1(@algolia/client-search@4.24.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) '@docusaurus/logger': 3.5.2 - '@docusaurus/plugin-content-docs': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) - '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2))(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/plugin-content-docs': 3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1(@types/react@18.3.9)(react@18.3.1))(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) '@docusaurus/theme-translations': 3.5.2 - '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) - '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) + '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) + '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) algoliasearch: 4.24.0 algoliasearch-helper: 3.22.5(algoliasearch@4.24.0) clsx: 2.1.1 @@ -18995,7 +19071,7 @@ snapshots: '@docusaurus/tsconfig@3.5.2': {} - '@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@mdx-js/mdx': 3.0.1 '@types/history': 4.7.11 @@ -19006,7 +19082,7 @@ snapshots: react-dom: 18.3.1(react@18.3.1) react-helmet-async: 1.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) utility-types: 3.11.0 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.95.0 webpack-merge: 5.10.0 transitivePeerDependencies: - '@swc/core' @@ -19015,17 +19091,17 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/utils-common@3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + '@docusaurus/utils-common@3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': dependencies: tslib: 2.7.0 optionalDependencies: - '@docusaurus/types': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-validation@3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2)': + '@docusaurus/utils-validation@3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2)': dependencies: '@docusaurus/logger': 3.5.2 - '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) - '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) + '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) fs-extra: 11.2.0 joi: 17.13.3 js-yaml: 4.1.0 @@ -19040,13 +19116,13 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/utils@3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2)': + '@docusaurus/utils@3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2)': dependencies: '@docusaurus/logger': 3.5.2 - '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@svgr/webpack': 8.1.0(typescript@5.6.2) escape-string-regexp: 4.0.0 - file-loader: 6.2.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + file-loader: 6.2.0(webpack@5.95.0) fs-extra: 11.2.0 github-slugger: 1.5.0 globby: 11.1.0 @@ -19059,11 +19135,11 @@ snapshots: resolve-pathname: 3.0.0 shelljs: 0.8.5 tslib: 2.7.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.95.0))(webpack@5.95.0) utility-types: 3.11.0 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.95.0 optionalDependencies: - '@docusaurus/types': 3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) transitivePeerDependencies: - '@swc/core' - esbuild @@ -19703,24 +19779,24 @@ snapshots: - encoding - supports-color - '@graphql-markdown/core@1.12.0(@graphql-markdown/printer-legacy@1.9.0(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(graphql@16.9.0)(prettier@3.3.3)(typescript@5.6.2))(graphql-config@5.1.2(@types/node@22.7.3)(graphql@16.9.0)(typescript@5.6.2))(graphql@16.9.0)(prettier@3.3.3)': + '@graphql-markdown/core@1.12.0(@graphql-markdown/printer-legacy@1.9.0(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(graphql@16.9.0)(prettier@3.3.3)(typescript@5.6.2))(graphql-config@5.1.2(@types/node@22.7.3)(graphql@16.9.0)(typescript@5.6.2))(graphql@16.9.0)(prettier@3.3.3)': dependencies: '@graphql-markdown/graphql': 1.1.4(graphql@16.9.0)(prettier@3.3.3) '@graphql-markdown/logger': 1.0.4 '@graphql-markdown/utils': 1.7.0(prettier@3.3.3) optionalDependencies: - '@graphql-markdown/printer-legacy': 1.9.0(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(graphql@16.9.0)(prettier@3.3.3)(typescript@5.6.2) + '@graphql-markdown/printer-legacy': 1.9.0(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(graphql@16.9.0)(prettier@3.3.3)(typescript@5.6.2) graphql-config: 5.1.2(@types/node@22.7.3)(graphql@16.9.0)(typescript@5.6.2) transitivePeerDependencies: - graphql - prettier - '@graphql-markdown/docusaurus@1.26.2(@docusaurus/logger@3.5.2)(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(graphql-config@5.1.2(@types/node@22.7.3)(graphql@16.9.0)(typescript@5.6.2))(graphql@16.9.0)(prettier@3.3.3)(typescript@5.6.2)': + '@graphql-markdown/docusaurus@1.26.2(@docusaurus/logger@3.5.2)(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(graphql-config@5.1.2(@types/node@22.7.3)(graphql@16.9.0)(typescript@5.6.2))(graphql@16.9.0)(prettier@3.3.3)(typescript@5.6.2)': dependencies: '@docusaurus/logger': 3.5.2 - '@graphql-markdown/core': 1.12.0(@graphql-markdown/printer-legacy@1.9.0(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(graphql@16.9.0)(prettier@3.3.3)(typescript@5.6.2))(graphql-config@5.1.2(@types/node@22.7.3)(graphql@16.9.0)(typescript@5.6.2))(graphql@16.9.0)(prettier@3.3.3) + '@graphql-markdown/core': 1.12.0(@graphql-markdown/printer-legacy@1.9.0(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(graphql@16.9.0)(prettier@3.3.3)(typescript@5.6.2))(graphql-config@5.1.2(@types/node@22.7.3)(graphql@16.9.0)(typescript@5.6.2))(graphql@16.9.0)(prettier@3.3.3) '@graphql-markdown/logger': 1.0.4 - '@graphql-markdown/printer-legacy': 1.9.0(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(graphql@16.9.0)(prettier@3.3.3)(typescript@5.6.2) + '@graphql-markdown/printer-legacy': 1.9.0(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(graphql@16.9.0)(prettier@3.3.3)(typescript@5.6.2) transitivePeerDependencies: - '@docusaurus/types' - '@graphql-markdown/diff' @@ -19745,9 +19821,9 @@ snapshots: '@graphql-markdown/logger@1.0.4': {} - '@graphql-markdown/printer-legacy@1.9.0(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(graphql@16.9.0)(prettier@3.3.3)(typescript@5.6.2)': + '@graphql-markdown/printer-legacy@1.9.0(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(graphql@16.9.0)(prettier@3.3.3)(typescript@5.6.2)': dependencies: - '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@swc/core@1.7.28(@swc/helpers@0.5.5))(typescript@5.6.2) + '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.2) '@graphql-markdown/graphql': 1.1.4(graphql@16.9.0)(prettier@3.3.3) '@graphql-markdown/utils': 1.7.0(prettier@3.3.3) transitivePeerDependencies: @@ -20085,9 +20161,9 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@headlessui/tailwindcss@0.1.3(tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2)))': + '@headlessui/tailwindcss@0.1.3(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2)))': dependencies: - tailwindcss: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2)) + tailwindcss: 3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2)) '@hookform/resolvers@3.9.0(react-hook-form@7.53.0(react@18.3.1))': dependencies: @@ -20165,7 +20241,7 @@ snapshots: jest-util: 29.7.0 slash: 3.0.0 - '@jest/core@29.7.0(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2))': + '@jest/core@29.7.0(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2))': dependencies: '@jest/console': 29.7.0 '@jest/reporters': 29.7.0(node-notifier@10.0.0) @@ -20179,7 +20255,7 @@ snapshots: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)) + jest-config: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -20728,7 +20804,7 @@ snapshots: cache-manager: 5.7.6 rxjs: 7.8.1 - '@nestjs/cli@10.4.5(@swc/core@1.7.28(@swc/helpers@0.5.5))': + '@nestjs/cli@10.4.5(@swc/core@1.7.28)': dependencies: '@angular-devkit/core': 17.3.8(chokidar@3.6.0) '@angular-devkit/schematics': 17.3.8(chokidar@3.6.0) @@ -20738,7 +20814,7 @@ snapshots: chokidar: 3.6.0 cli-table3: 0.6.5 commander: 4.1.1 - fork-ts-checker-webpack-plugin: 9.0.2(typescript@5.3.3)(webpack@5.94.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + fork-ts-checker-webpack-plugin: 9.0.2(typescript@5.3.3)(webpack@5.94.0(@swc/core@1.7.28)) glob: 10.4.2 inquirer: 8.2.6 node-emoji: 1.11.0 @@ -20747,7 +20823,7 @@ snapshots: tsconfig-paths: 4.2.0 tsconfig-paths-webpack-plugin: 4.1.0 typescript: 5.3.3 - webpack: 5.94.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.94.0(@swc/core@1.7.28) webpack-node-externals: 3.0.0 optionalDependencies: '@swc/core': 1.7.28(@swc/helpers@0.5.5) @@ -20837,37 +20913,37 @@ snapshots: optionalDependencies: '@nestjs/platform-express': 10.4.4(@nestjs/common@10.4.4(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4) - '@next/env@14.2.15': {} + '@next/env@14.2.23': {} '@next/eslint-plugin-next@14.2.3': dependencies: glob: 10.3.10 - '@next/swc-darwin-arm64@14.2.15': + '@next/swc-darwin-arm64@14.2.23': optional: true - '@next/swc-darwin-x64@14.2.15': + '@next/swc-darwin-x64@14.2.23': optional: true - '@next/swc-linux-arm64-gnu@14.2.15': + '@next/swc-linux-arm64-gnu@14.2.23': optional: true - '@next/swc-linux-arm64-musl@14.2.15': + '@next/swc-linux-arm64-musl@14.2.23': optional: true - '@next/swc-linux-x64-gnu@14.2.15': + '@next/swc-linux-x64-gnu@14.2.23': optional: true - '@next/swc-linux-x64-musl@14.2.15': + '@next/swc-linux-x64-musl@14.2.23': optional: true - '@next/swc-win32-arm64-msvc@14.2.15': + '@next/swc-win32-arm64-msvc@14.2.23': optional: true - '@next/swc-win32-ia32-msvc@14.2.15': + '@next/swc-win32-ia32-msvc@14.2.23': optional: true - '@next/swc-win32-x64-msvc@14.2.15': + '@next/swc-win32-x64-msvc@14.2.23': optional: true '@noble/curves@1.4.2': @@ -21988,6 +22064,25 @@ snapshots: '@repeaterjs/repeater@3.0.6': {} + '@rollup/plugin-commonjs@24.0.0(rollup@2.79.2)': + dependencies: + '@rollup/pluginutils': 5.1.2(rollup@2.79.2) + commondir: 1.0.1 + estree-walker: 2.0.2 + glob: 8.1.0 + is-reference: 1.2.1 + magic-string: 0.27.0 + optionalDependencies: + rollup: 2.79.2 + + '@rollup/pluginutils@5.1.2(rollup@2.79.2)': + dependencies: + '@types/estree': 1.0.6 + estree-walker: 2.0.2 + picomatch: 2.3.1 + optionalDependencies: + rollup: 2.79.2 + '@rollup/pluginutils@5.1.2(rollup@4.30.1)': dependencies: '@types/estree': 1.0.6 @@ -22216,6 +22311,12 @@ snapshots: '@sentry/types': 7.120.2 '@sentry/utils': 7.120.2 + '@sentry-internal/tracing@7.120.3': + dependencies: + '@sentry/core': 7.120.3 + '@sentry/types': 7.120.3 + '@sentry/utils': 7.120.3 + '@sentry/browser@7.120.2': dependencies: '@sentry-internal/feedback': 7.120.2 @@ -22257,6 +22358,11 @@ snapshots: '@sentry/types': 7.120.2 '@sentry/utils': 7.120.2 + '@sentry/core@7.120.3': + dependencies: + '@sentry/types': 7.120.3 + '@sentry/utils': 7.120.3 + '@sentry/hub@6.19.7': dependencies: '@sentry/types': 6.19.7 @@ -22270,12 +22376,42 @@ snapshots: '@sentry/utils': 7.120.2 localforage: 1.10.0 + '@sentry/integrations@7.120.3': + dependencies: + '@sentry/core': 7.120.3 + '@sentry/types': 7.120.3 + '@sentry/utils': 7.120.3 + localforage: 1.10.0 + '@sentry/minimal@6.19.7': dependencies: '@sentry/hub': 6.19.7 '@sentry/types': 6.19.7 tslib: 1.14.1 + '@sentry/nextjs@7.120.3(next@14.2.23(@babel/core@7.25.2)(@playwright/test@1.47.2)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.79.3))(react@18.3.1)(webpack@5.95.0)': + dependencies: + '@rollup/plugin-commonjs': 24.0.0(rollup@2.79.2) + '@sentry/core': 7.120.3 + '@sentry/integrations': 7.120.3 + '@sentry/node': 7.120.3 + '@sentry/react': 7.120.3(react@18.3.1) + '@sentry/types': 7.120.3 + '@sentry/utils': 7.120.3 + '@sentry/vercel-edge': 7.120.3 + '@sentry/webpack-plugin': 1.21.0 + chalk: 3.0.0 + next: 14.2.23(@babel/core@7.25.2)(@playwright/test@1.47.2)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.79.3) + react: 18.3.1 + resolve: 1.22.8 + rollup: 2.79.2 + stacktrace-parser: 0.1.10 + optionalDependencies: + webpack: 5.95.0 + transitivePeerDependencies: + - encoding + - supports-color + '@sentry/node@6.19.7': dependencies: '@sentry/core': 6.19.7 @@ -22289,6 +22425,14 @@ snapshots: transitivePeerDependencies: - supports-color + '@sentry/node@7.120.3': + dependencies: + '@sentry-internal/tracing': 7.120.3 + '@sentry/core': 7.120.3 + '@sentry/integrations': 7.120.3 + '@sentry/types': 7.120.3 + '@sentry/utils': 7.120.3 + '@sentry/react@7.119.0(react@18.3.1)': dependencies: '@sentry/browser': 7.120.2 @@ -22298,6 +22442,15 @@ snapshots: hoist-non-react-statics: 3.3.2 react: 18.3.1 + '@sentry/react@7.120.3(react@18.3.1)': + dependencies: + '@sentry/browser': 7.120.2 + '@sentry/core': 7.120.3 + '@sentry/types': 7.120.3 + '@sentry/utils': 7.120.3 + hoist-non-react-statics: 3.3.2 + react: 18.3.1 + '@sentry/replay@7.120.2': dependencies: '@sentry-internal/tracing': 7.120.2 @@ -22311,6 +22464,8 @@ snapshots: '@sentry/types@7.120.2': {} + '@sentry/types@7.120.3': {} + '@sentry/utils@6.19.7': dependencies: '@sentry/types': 6.19.7 @@ -22324,6 +22479,18 @@ snapshots: dependencies: '@sentry/types': 7.120.2 + '@sentry/utils@7.120.3': + dependencies: + '@sentry/types': 7.120.3 + + '@sentry/vercel-edge@7.120.3': + dependencies: + '@sentry-internal/tracing': 7.120.3 + '@sentry/core': 7.120.3 + '@sentry/integrations': 7.120.3 + '@sentry/types': 7.120.3 + '@sentry/utils': 7.120.3 + '@sentry/webpack-plugin@1.21.0': dependencies: '@sentry/cli': 1.77.3 @@ -23289,14 +23456,14 @@ snapshots: dependencies: defer-to-connect: 2.0.1 - '@tailwindcss/aspect-ratio@0.4.2(tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2)))': + '@tailwindcss/aspect-ratio@0.4.2(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2)))': dependencies: - tailwindcss: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2)) + tailwindcss: 3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2)) - '@tailwindcss/forms@0.5.9(tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2)))': + '@tailwindcss/forms@0.5.9(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2)))': dependencies: mini-svg-data-uri: 1.4.4 - tailwindcss: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2)) + tailwindcss: 3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2)) '@tanstack/eslint-plugin-query@5.58.1(eslint@8.57.1)(typescript@5.6.2)': dependencies: @@ -23800,11 +23967,11 @@ snapshots: '@types/webextension-polyfill@0.10.7': {} - '@types/webpack@5.28.5(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4(webpack@5.95.0))': + '@types/webpack@5.28.5(@swc/core@1.7.28)(webpack-cli@5.1.4(webpack@5.95.0))': dependencies: '@types/node': 20.16.9 tapable: 2.2.1 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4) transitivePeerDependencies: - '@swc/core' - esbuild @@ -24575,19 +24742,19 @@ snapshots: '@webassemblyjs/ast': 1.12.1 '@xtuc/long': 4.2.2 - '@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4(webpack@5.95.0))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4))': + '@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4(webpack@5.95.0))(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4))': dependencies: - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4) webpack-cli: 5.1.4(webpack@5.95.0) - '@webpack-cli/info@2.0.2(webpack-cli@5.1.4(webpack@5.95.0))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4))': + '@webpack-cli/info@2.0.2(webpack-cli@5.1.4(webpack@5.95.0))(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4))': dependencies: - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4) webpack-cli: 5.1.4(webpack@5.95.0) - '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4(webpack@5.95.0))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4))': + '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4(webpack@5.95.0))(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4))': dependencies: - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4) webpack-cli: 5.1.4(webpack@5.95.0) '@whatwg-node/events@0.0.3': {} @@ -25078,12 +25245,12 @@ snapshots: transitivePeerDependencies: - supports-color - babel-loader@9.2.1(@babel/core@7.25.2)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): + babel-loader@9.2.1(@babel/core@7.25.2)(webpack@5.95.0): dependencies: '@babel/core': 7.25.2 find-cache-dir: 4.0.0 schema-utils: 4.2.0 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.95.0 babel-plugin-dynamic-import-node@2.3.3: dependencies: @@ -25897,7 +26064,7 @@ snapshots: copy-text-to-clipboard@3.2.0: {} - copy-webpack-plugin@11.0.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4)): + copy-webpack-plugin@11.0.0(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)): dependencies: fast-glob: 3.3.2 glob-parent: 6.0.2 @@ -25905,9 +26072,9 @@ snapshots: normalize-path: 3.0.0 schema-utils: 4.2.0 serialize-javascript: 6.0.2 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4) - copy-webpack-plugin@11.0.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): + copy-webpack-plugin@11.0.0(webpack@5.95.0): dependencies: fast-glob: 3.3.2 glob-parent: 6.0.2 @@ -25915,7 +26082,7 @@ snapshots: normalize-path: 3.0.0 schema-utils: 4.2.0 serialize-javascript: 6.0.2 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.95.0 core-js-compat@3.38.1: dependencies: @@ -25981,13 +26148,13 @@ snapshots: crc-32@1.2.2: {} - create-jest@29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)): + create-jest@29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)) + jest-config: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -26051,7 +26218,7 @@ snapshots: postcss-selector-parser: 6.1.2 postcss-value-parser: 4.2.0 - css-loader@6.11.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4)): + css-loader@6.11.0(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)): dependencies: icss-utils: 5.1.0(postcss@8.4.47) postcss: 8.4.47 @@ -26062,9 +26229,9 @@ snapshots: postcss-value-parser: 4.2.0 semver: 7.6.3 optionalDependencies: - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4) - css-loader@6.11.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): + css-loader@6.11.0(webpack@5.95.0): dependencies: icss-utils: 5.1.0(postcss@8.4.47) postcss: 8.4.47 @@ -26075,9 +26242,9 @@ snapshots: postcss-value-parser: 4.2.0 semver: 7.6.3 optionalDependencies: - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.95.0 - css-minimizer-webpack-plugin@5.0.1(clean-css@5.3.3)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): + css-minimizer-webpack-plugin@5.0.1(clean-css@5.3.3)(webpack@5.95.0): dependencies: '@jridgewell/trace-mapping': 0.3.25 cssnano: 6.1.2(postcss@8.4.47) @@ -26085,7 +26252,7 @@ snapshots: postcss: 8.4.47 schema-utils: 4.2.0 serialize-javascript: 6.0.2 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.95.0 optionalDependencies: clean-css: 5.3.3 @@ -27030,8 +27197,8 @@ snapshots: '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.6.2) eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-plugin-import@2.30.0)(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) - eslint-plugin-import: 2.30.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-plugin-import@2.30.0)(eslint@8.57.1))(eslint@8.57.1) + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.1) + eslint-plugin-import: 2.30.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) eslint-plugin-jsx-a11y: 6.10.0(eslint@8.57.1) eslint-plugin-react: 7.37.0(eslint@8.57.1) eslint-plugin-react-hooks: 4.6.2(eslint@8.57.1) @@ -27054,7 +27221,26 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-plugin-import@2.30.0)(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1): + eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.1): + dependencies: + '@nolyfill/is-core-module': 1.0.39 + debug: 4.3.7(supports-color@8.1.1) + enhanced-resolve: 5.17.1 + eslint: 8.57.1 + eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.1))(eslint@8.57.1) + fast-glob: 3.3.2 + get-tsconfig: 4.8.1 + is-bun-module: 1.2.1 + is-glob: 4.0.3 + optionalDependencies: + eslint-plugin-import: 2.30.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) + transitivePeerDependencies: + - '@typescript-eslint/parser' + - eslint-import-resolver-node + - eslint-import-resolver-webpack + - supports-color + + eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-plugin-import@2.30.0)(eslint@8.57.1): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.3.7(supports-color@8.1.1) @@ -27066,13 +27252,24 @@ snapshots: is-bun-module: 1.2.1 is-glob: 4.0.3 optionalDependencies: - eslint-plugin-import: 2.30.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-plugin-import@2.30.0)(eslint@8.57.1))(eslint@8.57.1) + eslint-plugin-import: 2.30.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) transitivePeerDependencies: - '@typescript-eslint/parser' - eslint-import-resolver-node - eslint-import-resolver-webpack - supports-color + eslint-module-utils@2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.1))(eslint@8.57.1): + dependencies: + debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.6.2) + eslint: 8.57.1 + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.1) + transitivePeerDependencies: + - supports-color + eslint-module-utils@2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-plugin-import@2.30.0)(eslint@8.57.1))(eslint@8.57.1): dependencies: debug: 3.2.7 @@ -27080,7 +27277,7 @@ snapshots: '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.6.2) eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-plugin-import@2.30.0)(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-plugin-import@2.30.0)(eslint@8.57.1) transitivePeerDependencies: - supports-color @@ -27088,7 +27285,7 @@ snapshots: dependencies: eslint: 8.57.1 - eslint-plugin-import@2.30.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-plugin-import@2.30.0)(eslint@8.57.1))(eslint@8.57.1): + eslint-plugin-import@2.30.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -27210,7 +27407,7 @@ snapshots: eslint-visitor-keys@4.1.0: {} - eslint-webpack-plugin@4.2.0(eslint@8.57.1)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4)): + eslint-webpack-plugin@4.2.0(eslint@8.57.1)(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)): dependencies: '@types/eslint': 8.56.12 eslint: 8.57.1 @@ -27218,7 +27415,7 @@ snapshots: micromatch: 4.0.8 normalize-path: 3.0.0 schema-utils: 4.2.0 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4) eslint@8.57.1: dependencies: @@ -27592,11 +27789,11 @@ snapshots: dependencies: flat-cache: 3.2.0 - file-loader@6.2.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): + file-loader@6.2.0(webpack@5.95.0): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.95.0 file-system-cache@2.3.0: dependencies: @@ -27702,7 +27899,7 @@ snapshots: cross-spawn: 7.0.5 signal-exit: 4.1.0 - fork-ts-checker-webpack-plugin@6.5.3(eslint@8.57.1)(typescript@5.6.2)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): + fork-ts-checker-webpack-plugin@6.5.3(eslint@8.57.1)(typescript@5.6.2)(webpack@5.95.0): dependencies: '@babel/code-frame': 7.24.7 '@types/json-schema': 7.0.15 @@ -27718,11 +27915,11 @@ snapshots: semver: 7.6.3 tapable: 1.1.3 typescript: 5.6.2 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.95.0 optionalDependencies: eslint: 8.57.1 - fork-ts-checker-webpack-plugin@9.0.2(typescript@5.3.3)(webpack@5.94.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): + fork-ts-checker-webpack-plugin@9.0.2(typescript@5.3.3)(webpack@5.94.0(@swc/core@1.7.28)): dependencies: '@babel/code-frame': 7.24.7 chalk: 4.1.2 @@ -27737,7 +27934,7 @@ snapshots: semver: 7.6.3 tapable: 2.2.1 typescript: 5.3.3 - webpack: 5.94.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.94.0(@swc/core@1.7.28) form-data-encoder@2.1.4: {} @@ -28473,7 +28670,7 @@ snapshots: html-void-elements@3.0.0: {} - html-webpack-plugin@5.6.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4)): + html-webpack-plugin@5.6.0(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)): dependencies: '@types/html-minifier-terser': 6.1.0 html-minifier-terser: 6.1.0 @@ -28481,9 +28678,9 @@ snapshots: pretty-error: 4.0.0 tapable: 2.2.1 optionalDependencies: - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4) - html-webpack-plugin@5.6.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): + html-webpack-plugin@5.6.0(webpack@5.95.0): dependencies: '@types/html-minifier-terser': 6.1.0 html-minifier-terser: 6.1.0 @@ -28491,7 +28688,7 @@ snapshots: pretty-error: 4.0.0 tapable: 2.2.1 optionalDependencies: - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.95.0 htmlparser2@6.1.0: dependencies: @@ -28942,6 +29139,10 @@ snapshots: is-potential-custom-element-name@1.0.1: {} + is-reference@1.2.1: + dependencies: + '@types/estree': 1.0.6 + is-reference@3.0.2: dependencies: '@types/estree': 1.0.6 @@ -29144,16 +29345,16 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)): + jest-cli@29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)): dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)) + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)) + create-jest: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)) exit: 0.1.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)) + jest-config: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -29165,7 +29366,7 @@ snapshots: - supports-color - ts-node - jest-config@29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)): + jest-config@29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)): dependencies: '@babel/core': 7.25.2 '@jest/test-sequencer': 29.7.0 @@ -29191,7 +29392,7 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 20.16.9 - ts-node: 10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2) + ts-node: 10.9.2(@swc/core@1.7.28)(@types/node@20.16.9)(typescript@5.6.2) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -29422,12 +29623,12 @@ snapshots: merge-stream: 2.0.0 supports-color: 8.1.1 - jest@29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)): + jest@29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)): dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)) + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)) '@jest/types': 29.6.3 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)) + jest-cli: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)) optionalDependencies: node-notifier: 10.0.0 transitivePeerDependencies: @@ -29630,7 +29831,7 @@ snapshots: launch-editor@2.9.1: dependencies: - picocolors: 1.1.0 + picocolors: 1.1.1 shell-quote: 1.8.1 layout-base@1.0.2: {} @@ -30691,17 +30892,17 @@ snapshots: min-indent@1.0.1: {} - mini-css-extract-plugin@2.9.1(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4)): + mini-css-extract-plugin@2.9.1(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)): dependencies: schema-utils: 4.2.0 tapable: 2.2.1 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4) - mini-css-extract-plugin@2.9.1(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): + mini-css-extract-plugin@2.9.1(webpack@5.95.0): dependencies: schema-utils: 4.2.0 tapable: 2.2.1 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.95.0 mini-svg-data-uri@1.4.4: {} @@ -30850,9 +31051,9 @@ snapshots: neo-async@2.6.2: {} - next@14.2.15(@babel/core@7.25.2)(@playwright/test@1.47.2)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.79.3): + next@14.2.23(@babel/core@7.25.2)(@playwright/test@1.47.2)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.79.3): dependencies: - '@next/env': 14.2.15 + '@next/env': 14.2.23 '@swc/helpers': 0.5.5 busboy: 1.6.0 caniuse-lite: 1.0.30001664 @@ -30862,15 +31063,15 @@ snapshots: react-dom: 18.3.1(react@18.3.1) styled-jsx: 5.1.1(@babel/core@7.25.2)(babel-plugin-macros@3.1.0)(react@18.3.1) optionalDependencies: - '@next/swc-darwin-arm64': 14.2.15 - '@next/swc-darwin-x64': 14.2.15 - '@next/swc-linux-arm64-gnu': 14.2.15 - '@next/swc-linux-arm64-musl': 14.2.15 - '@next/swc-linux-x64-gnu': 14.2.15 - '@next/swc-linux-x64-musl': 14.2.15 - '@next/swc-win32-arm64-msvc': 14.2.15 - '@next/swc-win32-ia32-msvc': 14.2.15 - '@next/swc-win32-x64-msvc': 14.2.15 + '@next/swc-darwin-arm64': 14.2.23 + '@next/swc-darwin-x64': 14.2.23 + '@next/swc-linux-arm64-gnu': 14.2.23 + '@next/swc-linux-arm64-musl': 14.2.23 + '@next/swc-linux-x64-gnu': 14.2.23 + '@next/swc-linux-x64-musl': 14.2.23 + '@next/swc-win32-arm64-msvc': 14.2.23 + '@next/swc-win32-ia32-msvc': 14.2.23 + '@next/swc-win32-x64-msvc': 14.2.23 '@playwright/test': 1.47.2 sass: 1.79.3 transitivePeerDependencies: @@ -31659,21 +31860,21 @@ snapshots: '@csstools/utilities': 1.0.0(postcss@8.4.47) postcss: 8.4.47 - postcss-load-config@4.0.2(postcss@8.4.47)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)): + postcss-load-config@4.0.2(postcss@8.4.47)(ts-node@10.9.2(@swc/core@1.7.28)(@types/node@20.16.9)(typescript@5.6.2)): dependencies: lilconfig: 3.1.2 yaml: 2.5.1 optionalDependencies: postcss: 8.4.47 - ts-node: 10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2) + ts-node: 10.9.2(@swc/core@1.7.28)(@types/node@20.16.9)(typescript@5.6.2) - postcss-load-config@4.0.2(postcss@8.4.47)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2)): + postcss-load-config@4.0.2(postcss@8.4.47)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2)): dependencies: lilconfig: 3.1.2 yaml: 2.5.1 optionalDependencies: postcss: 8.4.47 - ts-node: 10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2) + ts-node: 10.9.2(@types/node@22.7.3)(typescript@5.6.2) postcss-load-config@6.0.1(jiti@1.21.6)(postcss@8.4.47)(tsx@3.14.0)(yaml@2.5.1): dependencies: @@ -31684,23 +31885,23 @@ snapshots: tsx: 3.14.0 yaml: 2.5.1 - postcss-loader@7.3.4(postcss@8.4.47)(typescript@5.6.2)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4)): + postcss-loader@7.3.4(postcss@8.4.47)(typescript@5.6.2)(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)): dependencies: cosmiconfig: 8.3.6(typescript@5.6.2) jiti: 1.21.6 postcss: 8.4.47 semver: 7.6.3 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4) transitivePeerDependencies: - typescript - postcss-loader@7.3.4(postcss@8.4.47)(typescript@5.6.2)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): + postcss-loader@7.3.4(postcss@8.4.47)(typescript@5.6.2)(webpack@5.95.0): dependencies: cosmiconfig: 8.3.6(typescript@5.6.2) jiti: 1.21.6 postcss: 8.4.47 semver: 7.6.3 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.95.0 transitivePeerDependencies: - typescript @@ -31984,7 +32185,7 @@ snapshots: postcss@8.4.31: dependencies: nanoid: 3.3.8 - picocolors: 1.1.0 + picocolors: 1.1.1 source-map-js: 1.2.1 postcss@8.4.47: @@ -32205,7 +32406,7 @@ snapshots: react: 18.3.1 tween-functions: 1.2.0 - react-dev-utils@12.0.1(eslint@8.57.1)(typescript@5.6.2)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): + react-dev-utils@12.0.1(eslint@8.57.1)(typescript@5.6.2)(webpack@5.95.0): dependencies: '@babel/code-frame': 7.24.7 address: 1.2.2 @@ -32216,7 +32417,7 @@ snapshots: escape-string-regexp: 4.0.0 filesize: 8.0.7 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.5.3(eslint@8.57.1)(typescript@5.6.2)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@8.57.1)(typescript@5.6.2)(webpack@5.95.0) global-modules: 2.0.0 globby: 11.1.0 gzip-size: 6.0.0 @@ -32231,7 +32432,7 @@ snapshots: shell-quote: 1.8.1 strip-ansi: 6.0.1 text-table: 0.2.0 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.95.0 optionalDependencies: typescript: 5.6.2 transitivePeerDependencies: @@ -32332,11 +32533,11 @@ snapshots: sucrase: 3.35.0 use-editable: 2.3.3(react@18.3.1) - react-loadable-ssr-addon-v5-slorber@1.0.1(@docusaurus/react-loadable@6.0.0(react@18.3.1))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): + react-loadable-ssr-addon-v5-slorber@1.0.1(@docusaurus/react-loadable@6.0.0(react@18.3.1))(webpack@5.95.0): dependencies: '@babel/runtime': 7.25.6 react-loadable: '@docusaurus/react-loadable@6.0.0(react@18.3.1)' - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.95.0 react-number-format@5.4.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: @@ -32918,6 +33119,10 @@ snapshots: robust-predicates@3.0.2: {} + rollup@2.79.2: + optionalDependencies: + fsevents: 2.3.3 + rollup@3.29.5: optionalDependencies: fsevents: 2.3.3 @@ -32976,7 +33181,7 @@ snapshots: rtlcss@4.3.0: dependencies: escalade: 3.2.0 - picocolors: 1.1.0 + picocolors: 1.1.1 postcss: 8.4.47 strip-json-comments: 3.1.1 @@ -33023,10 +33228,10 @@ snapshots: safer-buffer@2.1.2: {} - sass-loader@13.3.3(sass@1.79.3)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4)): + sass-loader@13.3.3(sass@1.79.3)(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)): dependencies: neo-async: 2.6.2 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4) optionalDependencies: sass: 1.79.3 @@ -33407,6 +33612,10 @@ snapshots: stackback@0.0.2: {} + stacktrace-parser@0.1.10: + dependencies: + type-fest: 0.7.1 + start-server-and-test@2.0.8: dependencies: arg: 5.0.2 @@ -33724,15 +33933,15 @@ snapshots: tailwind-merge@2.5.2: {} - tailwindcss-animate@1.0.7(tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2))): + tailwindcss-animate@1.0.7(tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28)(@types/node@20.16.9)(typescript@5.6.2))): dependencies: - tailwindcss: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)) + tailwindcss: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28)(@types/node@20.16.9)(typescript@5.6.2)) - tailwindcss-animate@1.0.7(tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2))): + tailwindcss-animate@1.0.7(tailwindcss@3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2))): dependencies: - tailwindcss: 3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2)) + tailwindcss: 3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2)) - tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)): + tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28)(@types/node@20.16.9)(typescript@5.6.2)): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -33751,7 +33960,7 @@ snapshots: postcss: 8.4.47 postcss-import: 15.1.0(postcss@8.4.47) postcss-js: 4.0.1(postcss@8.4.47) - postcss-load-config: 4.0.2(postcss@8.4.47)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)) + postcss-load-config: 4.0.2(postcss@8.4.47)(ts-node@10.9.2(@swc/core@1.7.28)(@types/node@20.16.9)(typescript@5.6.2)) postcss-nested: 6.2.0(postcss@8.4.47) postcss-selector-parser: 6.1.2 resolve: 1.22.8 @@ -33759,7 +33968,7 @@ snapshots: transitivePeerDependencies: - ts-node - tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2)): + tailwindcss@3.4.13(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2)): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -33778,7 +33987,7 @@ snapshots: postcss: 8.4.47 postcss-import: 15.1.0(postcss@8.4.47) postcss-js: 4.0.1(postcss@8.4.47) - postcss-load-config: 4.0.2(postcss@8.4.47)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2)) + postcss-load-config: 4.0.2(postcss@8.4.47)(ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2)) postcss-nested: 6.2.0(postcss@8.4.47) postcss-selector-parser: 6.1.2 resolve: 1.22.8 @@ -33834,39 +34043,48 @@ snapshots: term-size@2.2.1: {} - terser-webpack-plugin@5.3.10(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack@5.94.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): + terser-webpack-plugin@5.3.10(@swc/core@1.7.28)(webpack@5.94.0(@swc/core@1.7.28)): dependencies: '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.2 terser: 5.34.0 - webpack: 5.94.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.94.0(@swc/core@1.7.28) optionalDependencies: '@swc/core': 1.7.28(@swc/helpers@0.5.5) - terser-webpack-plugin@5.3.10(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4)): + terser-webpack-plugin@5.3.10(@swc/core@1.7.28)(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)): dependencies: '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.2 terser: 5.34.0 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4) optionalDependencies: '@swc/core': 1.7.28(@swc/helpers@0.5.5) - terser-webpack-plugin@5.3.10(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): + terser-webpack-plugin@5.3.10(@swc/core@1.7.28)(webpack@5.95.0(@swc/core@1.7.28)): dependencies: '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.2 terser: 5.34.0 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.95.0(@swc/core@1.7.28) optionalDependencies: '@swc/core': 1.7.28(@swc/helpers@0.5.5) + terser-webpack-plugin@5.3.10(webpack@5.95.0): + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + jest-worker: 27.5.1 + schema-utils: 3.3.0 + serialize-javascript: 6.0.2 + terser: 5.34.0 + webpack: 5.95.0 + terser@5.34.0: dependencies: '@jridgewell/source-map': 0.3.6 @@ -34017,12 +34235,12 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-jest@29.2.5(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)))(typescript@5.6.2): + ts-jest@29.2.5(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)))(typescript@5.6.2): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2)) + jest: 29.7.0(@types/node@20.16.9)(babel-plugin-macros@3.1.0)(node-notifier@10.0.0)(ts-node@10.9.2(@types/node@20.16.9)(typescript@5.6.2)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -34036,7 +34254,7 @@ snapshots: '@jest/types': 29.6.3 babel-jest: 29.7.0(@babel/core@7.25.2) - ts-loader@9.5.1(typescript@5.6.2)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4)): + ts-loader@9.5.1(typescript@5.6.2)(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)): dependencies: chalk: 4.1.2 enhanced-resolve: 5.17.1 @@ -34044,9 +34262,9 @@ snapshots: semver: 7.6.3 source-map: 0.7.4 typescript: 5.6.2 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4) - ts-loader@9.5.1(typescript@5.6.2)(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): + ts-loader@9.5.1(typescript@5.6.2)(webpack@5.95.0(@swc/core@1.7.28)): dependencies: chalk: 4.1.2 enhanced-resolve: 5.17.1 @@ -34054,11 +34272,11 @@ snapshots: semver: 7.6.3 source-map: 0.7.4 typescript: 5.6.2 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.95.0(@swc/core@1.7.28) ts-log@2.2.5: {} - ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@16.18.111)(typescript@5.1.6): + ts-node@10.9.2(@swc/core@1.7.28)(@types/node@16.18.111)(typescript@5.1.6): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 @@ -34078,7 +34296,7 @@ snapshots: optionalDependencies: '@swc/core': 1.7.28(@swc/helpers@0.5.5) - ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@20.16.9)(typescript@5.6.2): + ts-node@10.9.2(@swc/core@1.7.28)(@types/node@20.16.9)(typescript@5.6.2): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 @@ -34098,7 +34316,7 @@ snapshots: optionalDependencies: '@swc/core': 1.7.28(@swc/helpers@0.5.5) - ts-node@10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@22.7.3)(typescript@5.6.2): + ts-node@10.9.2(@types/node@22.7.3)(typescript@5.6.2): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 @@ -34115,8 +34333,6 @@ snapshots: typescript: 5.6.2 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - optionalDependencies: - '@swc/core': 1.7.28(@swc/helpers@0.5.5) optional: true ts-retry-promise@0.8.1: {} @@ -34150,7 +34366,7 @@ snapshots: tslib@2.7.0: {} - tsup@8.3.5(@microsoft/api-extractor@7.48.1(@types/node@22.7.3))(@swc/core@1.7.28(@swc/helpers@0.5.5))(jiti@1.21.6)(postcss@8.4.47)(tsx@3.14.0)(typescript@5.6.2)(yaml@2.5.1): + tsup@8.3.5(@microsoft/api-extractor@7.48.1(@types/node@22.7.3))(@swc/core@1.7.28)(jiti@1.21.6)(postcss@8.4.47)(tsx@3.14.0)(typescript@5.6.2)(yaml@2.5.1): dependencies: bundle-require: 5.1.0(esbuild@0.24.2) cac: 6.7.14 @@ -34236,6 +34452,8 @@ snapshots: type-fest@0.6.0: {} + type-fest@0.7.1: {} + type-fest@0.8.1: {} type-fest@1.4.0: {} @@ -34313,14 +34531,14 @@ snapshots: transitivePeerDependencies: - supports-color - typescript-json-schema@0.64.0(@swc/core@1.7.28(@swc/helpers@0.5.5)): + typescript-json-schema@0.64.0(@swc/core@1.7.28): dependencies: '@types/json-schema': 7.0.15 '@types/node': 16.18.111 glob: 7.2.3 path-equal: 1.2.5 safe-stable-stringify: 2.5.0 - ts-node: 10.9.2(@swc/core@1.7.28(@swc/helpers@0.5.5))(@types/node@16.18.111)(typescript@5.1.6) + ts-node: 10.9.2(@swc/core@1.7.28)(@types/node@16.18.111)(typescript@5.1.6) typescript: 5.1.6 yargs: 17.7.2 transitivePeerDependencies: @@ -34538,14 +34756,14 @@ snapshots: dependencies: punycode: 2.3.1 - url-loader@4.1.1(file-loader@6.2.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): + url-loader@4.1.1(file-loader@6.2.0(webpack@5.95.0))(webpack@5.95.0): dependencies: loader-utils: 2.0.4 mime-types: 2.1.35 schema-utils: 3.3.0 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.95.0 optionalDependencies: - file-loader: 6.2.0(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + file-loader: 6.2.0(webpack@5.95.0) url-parse@1.5.10: dependencies: @@ -35268,9 +35486,9 @@ snapshots: webpack-cli@5.1.4(webpack@5.95.0): dependencies: '@discoveryjs/json-ext': 0.5.7 - '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4(webpack@5.95.0))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4)) - '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4(webpack@5.95.0))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4)) - '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4(webpack@5.95.0))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4)) + '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4(webpack@5.95.0))(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)) + '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4(webpack@5.95.0))(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)) + '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4(webpack@5.95.0))(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)) colorette: 2.0.20 commander: 10.0.1 cross-spawn: 7.0.5 @@ -35279,19 +35497,19 @@ snapshots: import-local: 3.2.0 interpret: 3.1.1 rechoir: 0.8.0 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4) + webpack: 5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4) webpack-merge: 5.10.0 - webpack-dev-middleware@5.3.4(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): + webpack-dev-middleware@5.3.4(webpack@5.95.0): dependencies: colorette: 2.0.20 memfs: 3.5.3 mime-types: 2.1.35 range-parser: 1.2.1 schema-utils: 4.2.0 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.95.0 - webpack-dev-server@4.15.2(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): + webpack-dev-server@4.15.2(webpack@5.95.0): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 @@ -35321,10 +35539,10 @@ snapshots: serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 - webpack-dev-middleware: 5.3.4(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + webpack-dev-middleware: 5.3.4(webpack@5.95.0) ws: 8.18.0 optionalDependencies: - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.95.0 transitivePeerDependencies: - bufferutil - debug @@ -35343,7 +35561,37 @@ snapshots: webpack-virtual-modules@0.6.2: {} - webpack@5.94.0(@swc/core@1.7.28(@swc/helpers@0.5.5)): + webpack@5.94.0(@swc/core@1.7.28): + dependencies: + '@types/estree': 1.0.6 + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/wasm-edit': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 + acorn: 8.12.1 + acorn-import-attributes: 1.9.5(acorn@8.12.1) + browserslist: 4.24.0 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.17.1 + es-module-lexer: 1.5.4 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.0 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 3.3.0 + tapable: 2.2.1 + terser-webpack-plugin: 5.3.10(@swc/core@1.7.28)(webpack@5.94.0(@swc/core@1.7.28)) + watchpack: 2.4.2 + webpack-sources: 3.2.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + + webpack@5.95.0: dependencies: '@types/estree': 1.0.6 '@webassemblyjs/ast': 1.12.1 @@ -35365,7 +35613,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack@5.94.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + terser-webpack-plugin: 5.3.10(webpack@5.95.0) watchpack: 2.4.2 webpack-sources: 3.2.3 transitivePeerDependencies: @@ -35373,7 +35621,7 @@ snapshots: - esbuild - uglify-js - webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)): + webpack@5.95.0(@swc/core@1.7.28): dependencies: '@types/estree': 1.0.6 '@webassemblyjs/ast': 1.12.1 @@ -35395,7 +35643,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))) + terser-webpack-plugin: 5.3.10(@swc/core@1.7.28)(webpack@5.95.0(@swc/core@1.7.28)) watchpack: 2.4.2 webpack-sources: 3.2.3 transitivePeerDependencies: @@ -35403,7 +35651,7 @@ snapshots: - esbuild - uglify-js - webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4): + webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4): dependencies: '@types/estree': 1.0.6 '@webassemblyjs/ast': 1.12.1 @@ -35425,7 +35673,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))(webpack-cli@5.1.4)) + terser-webpack-plugin: 5.3.10(@swc/core@1.7.28)(webpack@5.95.0(@swc/core@1.7.28)(webpack-cli@5.1.4)) watchpack: 2.4.2 webpack-sources: 3.2.3 optionalDependencies: @@ -35435,13 +35683,13 @@ snapshots: - esbuild - uglify-js - webpackbar@5.0.2(webpack@5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5))): + webpackbar@5.0.2(webpack@5.95.0): dependencies: chalk: 4.1.2 consola: 2.15.3 pretty-time: 1.1.0 std-env: 3.7.0 - webpack: 5.95.0(@swc/core@1.7.28(@swc/helpers@0.5.5)) + webpack: 5.95.0 websocket-driver@0.7.4: dependencies: From bfca1eb89ee6fbad0a0c7a039fe53d09dbc1d11c Mon Sep 17 00:00:00 2001 From: DaughterOfMars Date: Wed, 29 Jan 2025 06:07:06 -0500 Subject: [PATCH 20/51] chore(CI): Move split cluster check into hierarchy (#4749) * chore(CI): Move split cluster check into hierarchy * Split the hierarchy :c * fix concurrency * use github runners for diffs * fix check * remove unused var --------- Co-authored-by: Thibault Martinez --- .../{split_cluster.yml => _split_cluster.yml} | 6 +- .github/workflows/hierarchy.yml | 49 +++------------- .github/workflows/turbo_hierarchy.yml | 58 +++++++++++++++++++ 3 files changed, 69 insertions(+), 44 deletions(-) rename .github/workflows/{split_cluster.yml => _split_cluster.yml} (87%) create mode 100644 .github/workflows/turbo_hierarchy.yml diff --git a/.github/workflows/split_cluster.yml b/.github/workflows/_split_cluster.yml similarity index 87% rename from .github/workflows/split_cluster.yml rename to .github/workflows/_split_cluster.yml index 3c45c361d91..ca7eb2cf3a6 100644 --- a/.github/workflows/split_cluster.yml +++ b/.github/workflows/_split_cluster.yml @@ -2,8 +2,10 @@ name: Split Cluster Check on: workflow_call: - pull_request: - types: [opened, synchronize, reopened, ready_for_review] + +concurrency: + group: split-cluster-${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: ${{ github.ref != 'refs/heads/develop' }} env: CARGO_TERM_COLOR: always diff --git a/.github/workflows/hierarchy.yml b/.github/workflows/hierarchy.yml index 8d3465af6b0..64de07fda16 100644 --- a/.github/workflows/hierarchy.yml +++ b/.github/workflows/hierarchy.yml @@ -27,18 +27,8 @@ jobs: isDoc: ${{ steps.diff.outputs.isDoc }} isReleaseNotesEligible: ${{ steps.diff.outputs.isReleaseNotesEligible }} isExternalCrates: ${{ steps.diff.outputs.isExternalCrates }} - isWallet: ${{ (steps.turbo.outputs.packages && contains(fromJson(steps.turbo.outputs.packages), 'iota-wallet')) }} - isExplorer: ${{ (steps.turbo.outputs.packages && contains(fromJson(steps.turbo.outputs.packages), 'iota-explorer')) }} - isTypescriptSDK: ${{ (steps.turbo.outputs.packages && contains(fromJson(steps.turbo.outputs.packages), '@iota/iota-sdk')) }} - isAppsBackend: ${{ (steps.turbo.outputs.packages && contains(fromJson(steps.turbo.outputs.packages), 'apps-backend')) }} - isAppsUiKit: ${{ (steps.turbo.outputs.packages && contains(fromJson(steps.turbo.outputs.packages), '@iota/apps-ui-kit')) }} - isGraphQlTransport: ${{ (steps.turbo.outputs.packages && contains(fromJson(steps.turbo.outputs.packages), '@iota/graphql-transport')) }} - isLedgerjs: ${{ (steps.turbo.outputs.packages && contains(fromJson(steps.turbo.outputs.packages), '@iota/ledgerjs-hw-app-iota')) }} steps: - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 - - name: Detect Changes (turbo) - uses: "./.github/actions/turbo-diffs" - id: turbo - name: Detect Changes (diff) uses: "./.github/actions/diffs" id: diff @@ -79,12 +69,6 @@ jobs: if: (!cancelled() && needs.diff.outputs.isDoc == 'true') uses: ./.github/workflows/_docs_lint.yml - turborepo: - needs: - - dprint-format - - typos - uses: ./.github/workflows/_turborepo.yml - move-tests: needs: - diff @@ -122,32 +106,6 @@ jobs: (needs.diff.outputs.isRosetta == 'true' || needs.diff.outputs.isRust == 'true') uses: ./.github/workflows/_rosetta.yml - e2e: - if: (!cancelled() && !failure() && !github.event.pull_request.draft && github.ref_name != 'develop') - needs: - - diff - - dprint-format - - license-check - - typos - uses: ./.github/workflows/_e2e.yml - with: - isRpc: ${{ needs.diff.outputs.isRpc == 'true' }} - isWallet: ${{ needs.diff.outputs.isWallet == 'true' }} - isExplorer: ${{ needs.diff.outputs.isExplorer == 'true' }} - isAppsBackend: ${{ needs.diff.outputs.isAppsBackend == 'true' }} - isTypescriptSDK: ${{ needs.diff.outputs.isTypescriptSDK == 'true' }} - isGraphQlTransport: ${{ needs.diff.outputs.isGraphQlTransport == 'true' }} - - ledgernano: - if: (!cancelled() && !failure()) && needs.diff.outputs.isLedgerjs == 'true' && github.event.pull_request.draft == false - needs: - - diff - - dprint-format - - license-check - - typos - uses: ./.github/workflows/_ledgernano.yml - secrets: inherit - move-ide: if: (!cancelled() && !failure()) && needs.diff.outputs.isExternalCrates == 'true' && github.event.pull_request.draft == false needs: @@ -156,3 +114,10 @@ jobs: - license-check - typos uses: ./.github/workflows/_move_ide.yml + + split-cluster: + if: (!cancelled() && !failure()) && needs.diff.outputs.isRust == 'true' && github.event.pull_request.draft == false + needs: + - diff + - rust + uses: ./.github/workflows/_split_cluster.yml diff --git a/.github/workflows/turbo_hierarchy.yml b/.github/workflows/turbo_hierarchy.yml new file mode 100644 index 00000000000..eea642d664c --- /dev/null +++ b/.github/workflows/turbo_hierarchy.yml @@ -0,0 +1,58 @@ +name: Turborepo Hierarchy + +on: + push: + branches: + - "develop" + - "devnet" + - "testnet" + - "mainnet" + - "releases/iota-*-release" + pull_request: + types: [opened, synchronize, reopened, ready_for_review] + +jobs: + diff: + runs-on: [ubuntu-latest] + concurrency: + group: turbo-diff-${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: ${{ github.ref != 'refs/heads/develop' }} + outputs: + isRpc: ${{ steps.diff.outputs.isRpc }} + isWallet: ${{ (steps.turbo.outputs.packages && contains(fromJson(steps.turbo.outputs.packages), 'iota-wallet')) }} + isExplorer: ${{ (steps.turbo.outputs.packages && contains(fromJson(steps.turbo.outputs.packages), 'iota-explorer')) }} + isTypescriptSDK: ${{ (steps.turbo.outputs.packages && contains(fromJson(steps.turbo.outputs.packages), '@iota/iota-sdk')) }} + isAppsBackend: ${{ (steps.turbo.outputs.packages && contains(fromJson(steps.turbo.outputs.packages), 'apps-backend')) }} + isGraphQlTransport: ${{ (steps.turbo.outputs.packages && contains(fromJson(steps.turbo.outputs.packages), '@iota/graphql-transport')) }} + isLedgerjs: ${{ (steps.turbo.outputs.packages && contains(fromJson(steps.turbo.outputs.packages), '@iota/ledgerjs-hw-app-iota')) }} + steps: + - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 + - name: Detect Changes (turbo) + uses: "./.github/actions/turbo-diffs" + id: turbo + - name: Detect Changes (diff) + uses: "./.github/actions/diffs" + id: diff + + turborepo: + uses: ./.github/workflows/_turborepo.yml + + e2e: + if: (!cancelled() && !failure() && !github.event.pull_request.draft && github.ref_name != 'develop') + needs: + - diff + uses: ./.github/workflows/_e2e.yml + with: + isRpc: ${{ needs.diff.outputs.isRpc == 'true' }} + isWallet: ${{ needs.diff.outputs.isWallet == 'true' }} + isExplorer: ${{ needs.diff.outputs.isExplorer == 'true' }} + isAppsBackend: ${{ needs.diff.outputs.isAppsBackend == 'true' }} + isTypescriptSDK: ${{ needs.diff.outputs.isTypescriptSDK == 'true' }} + isGraphQlTransport: ${{ needs.diff.outputs.isGraphQlTransport == 'true' }} + + ledgernano: + if: (!cancelled() && !failure()) && needs.diff.outputs.isLedgerjs == 'true' && github.event.pull_request.draft == false + needs: + - diff + uses: ./.github/workflows/_ledgernano.yml + secrets: inherit From fca46b1927e626e930efb8ee84f61ac5c61b9203 Mon Sep 17 00:00:00 2001 From: Samuel Rufinatscha Date: Wed, 29 Jan 2025 12:40:08 +0100 Subject: [PATCH 21/51] Upgrade async-graphql deps (#4128) * refactor: Update to async-graphql = "=7.0.11" * refactor: Update schema_sdl_export.snap test snapshot --- Cargo.lock | 254 +++++++++--------- Cargo.toml | 2 +- crates/iota-graphql-rpc/Cargo.toml | 4 +- crates/iota-graphql-rpc/schema.graphql | 1 + .../src/data/package_resolver.rs | 1 - .../iota-graphql-rpc/src/types/checkpoint.rs | 2 - crates/iota-graphql-rpc/src/types/epoch.rs | 1 - .../src/types/move_package.rs | 2 - .../iota-graphql-rpc/src/types/move_value.rs | 2 +- crates/iota-graphql-rpc/src/types/object.rs | 3 - .../src/types/transaction_block/mod.rs | 1 - .../iota-graphql-rpc/src/types/validator.rs | 1 - .../snapshot_tests__schema_sdl_export.snap | 1 + .../iota-transactional-test-runner/Cargo.toml | 1 + .../src/test_adapter.rs | 11 +- 15 files changed, 139 insertions(+), 148 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a66ea05654b..e403b74057a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -213,7 +213,7 @@ dependencies = [ "prettyplease", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.96", ] [[package]] @@ -851,16 +851,16 @@ dependencies = [ [[package]] name = "async-graphql" -version = "7.0.1" +version = "7.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b16926f97f683ff3b47b035cc79622f3d6a374730b07a5d9051e81e88b5f1904" +checksum = "0ba6d24703c5adc5ba9116901b92ee4e4c0643c01a56c4fd303f3818638d7449" dependencies = [ "async-graphql-derive", "async-graphql-parser", "async-graphql-value", "async-stream", "async-trait", - "base64 0.13.1", + "base64 0.22.1", "bytes", "chrono", "fast_chemail", @@ -871,12 +871,12 @@ dependencies = [ "handlebars", "http 1.1.0", "indexmap 2.5.0", - "lru 0.7.8", + "lru", "mime", "multer", "num-traits", "once_cell", - "opentelemetry 0.21.0", + "opentelemetry 0.25.0", "pin-project-lite", "regex", "serde", @@ -891,9 +891,9 @@ dependencies = [ [[package]] name = "async-graphql-axum" -version = "7.0.1" +version = "7.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3415c9dbaf54397292da0bb81a907e2b989661ce068e4ccfebac33dc9e245e" +checksum = "e9aa80e171205c6d562057fd5a49167c8fbe61f7db2bed6540f6d4f2234d7ff2" dependencies = [ "async-graphql", "async-trait", @@ -909,26 +909,26 @@ dependencies = [ [[package]] name = "async-graphql-derive" -version = "7.0.1" +version = "7.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6a7349168b79030e3172a620f4f0e0062268a954604e41475eff082380fe505" +checksum = "a94c2d176893486bd37cd1b6defadd999f7357bf5804e92f510c08bcf16c538f" dependencies = [ "Inflector", "async-graphql-parser", "darling 0.20.10", - "proc-macro-crate 1.3.1", + "proc-macro-crate 3.2.0", "proc-macro2", "quote", - "strum 0.25.0", - "syn 2.0.77", + "strum 0.26.3", + "syn 2.0.96", "thiserror", ] [[package]] name = "async-graphql-parser" -version = "7.0.1" +version = "7.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58fdc0adf9f53c2b65bb0ff5170cba1912299f248d0e48266f444b6f005deb1d" +checksum = "79272bdbf26af97866e149f05b2b546edb5c00e51b5f916289931ed233e208ad" dependencies = [ "async-graphql-value", "pest", @@ -938,9 +938,9 @@ dependencies = [ [[package]] name = "async-graphql-value" -version = "7.0.1" +version = "7.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cf4d4e86208f4f9b81a503943c07e6e7f29ad3505e6c9ce6431fe64dc241681" +checksum = "ef5ec94176a12a8cbe985cd73f2e54dc9c702c88c766bdef12f1f3a67cedbee1" dependencies = [ "bytes", "indexmap 2.5.0", @@ -956,7 +956,7 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.96", ] [[package]] @@ -978,7 +978,7 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.96", ] [[package]] @@ -995,7 +995,7 @@ checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.96", ] [[package]] @@ -1044,7 +1044,7 @@ checksum = "3c87f3f15e7794432337fc718554eaa4dc8f04c9677a950ffe366f20a162ae42" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.96", ] [[package]] @@ -1249,7 +1249,7 @@ dependencies = [ "hmac", "http 0.2.12", "http-body 0.4.6", - "lru 0.12.4", + "lru", "once_cell", "percent-encoding", "regex-lite", @@ -1561,7 +1561,7 @@ dependencies = [ "sync_wrapper 1.0.1", "tokio", "tokio-tungstenite 0.23.1", - "tower 0.5.1", + "tower 0.5.2", "tower-layer", "tower-service", "tracing", @@ -1605,7 +1605,7 @@ dependencies = [ "mime", "pin-project-lite", "serde", - "tower 0.5.1", + "tower 0.5.2", "tower-layer", "tower-service", "tracing", @@ -1864,7 +1864,7 @@ dependencies = [ "regex", "rustc-hash 1.1.0", "shlex", - "syn 2.0.77", + "syn 2.0.96", ] [[package]] @@ -1886,7 +1886,7 @@ dependencies = [ "regex", "rustc-hash 1.1.0", "shlex", - "syn 2.0.77", + "syn 2.0.96", "which", ] @@ -2175,9 +2175,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.7.2" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "428d9aa8fbc0670b7b8d6030a7fadd0f86151cae55e4dbbece15f3780a3dfaf3" +checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" dependencies = [ "serde", ] @@ -2500,7 +2500,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.96", ] [[package]] @@ -3172,7 +3172,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.96", ] [[package]] @@ -3217,7 +3217,7 @@ dependencies = [ "proc-macro2", "quote", "strsim 0.10.0", - "syn 2.0.77", + "syn 2.0.96", "thiserror", ] @@ -3241,7 +3241,7 @@ dependencies = [ "cynic-codegen", "darling 0.20.10", "quote", - "syn 2.0.77", + "syn 2.0.96", ] [[package]] @@ -3289,7 +3289,7 @@ dependencies = [ "proc-macro2", "quote", "strsim 0.11.1", - "syn 2.0.77", + "syn 2.0.96", ] [[package]] @@ -3311,7 +3311,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core 0.20.10", "quote", - "syn 2.0.77", + "syn 2.0.96", ] [[package]] @@ -3454,7 +3454,7 @@ checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.96", ] [[package]] @@ -3467,7 +3467,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version", - "syn 2.0.77", + "syn 2.0.96", ] [[package]] @@ -3487,7 +3487,7 @@ checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.96", "unicode-xid", ] @@ -3517,7 +3517,7 @@ dependencies = [ "dsl_auto_type", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.96", ] [[package]] @@ -3537,7 +3537,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "209c735641a413bc68c4923a9d6ad4bcb3ca306b794edaa7eb0b3228a99ffb25" dependencies = [ - "syn 2.0.77", + "syn 2.0.96", ] [[package]] @@ -3658,7 +3658,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.96", ] [[package]] @@ -3696,7 +3696,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.96", ] [[package]] @@ -3934,7 +3934,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.96", ] [[package]] @@ -3953,7 +3953,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.96", ] [[package]] @@ -3973,7 +3973,7 @@ checksum = "3bf679796c0322556351f287a51b49e48f7c4986e727b5dd78c972d30e2e16cc" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.96", ] [[package]] @@ -4144,7 +4144,7 @@ dependencies = [ "reqwest 0.11.27", "serde", "serde_json", - "syn 2.0.77", + "syn 2.0.96", "toml 0.8.19", "walkdir", ] @@ -4162,7 +4162,7 @@ dependencies = [ "proc-macro2", "quote", "serde_json", - "syn 2.0.77", + "syn 2.0.96", ] [[package]] @@ -4188,7 +4188,7 @@ dependencies = [ "serde", "serde_json", "strum 0.26.3", - "syn 2.0.77", + "syn 2.0.96", "tempfile", "thiserror", "tiny-keccak", @@ -4789,7 +4789,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.96", ] [[package]] @@ -4909,7 +4909,7 @@ dependencies = [ "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.96", ] [[package]] @@ -4945,7 +4945,7 @@ checksum = "53010ccb100b96a67bc32c0175f0ed1426b31b655d562898e57325f81c023ac0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.96", ] [[package]] @@ -5107,9 +5107,9 @@ dependencies = [ [[package]] name = "handlebars" -version = "4.5.0" +version = "5.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "faa67bab9ff362228eb3d00bd024a4965d8231bbb7921167f0cfa66c6626b225" +checksum = "d08485b96a0e6393e9e4d1b8d48cf74ad6c063cd905eb33f42c1ce3f0377539b" dependencies = [ "log", "pest", @@ -5604,7 +5604,7 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.96", ] [[package]] @@ -6174,7 +6174,7 @@ dependencies = [ "iota-sdk 0.9.0-alpha", "iota-test-transaction-builder", "iota-types", - "lru 0.12.4", + "lru", "maplit", "move-core-types", "num_enum", @@ -6382,7 +6382,7 @@ dependencies = [ "iota-types", "itertools 0.13.0", "jsonrpsee", - "lru 0.12.4", + "lru", "mockall", "moka", "more-asserts", @@ -6871,7 +6871,7 @@ dependencies = [ "iota-test-transaction-builder", "iota-types", "itertools 0.13.0", - "lru 0.12.4", + "lru", "move-binary-format", "move-bytecode-utils", "move-core-types", @@ -7541,7 +7541,7 @@ dependencies = [ "insta", "iota-move-build", "iota-types", - "lru 0.12.4", + "lru", "move-binary-format", "move-command-line-common", "move-compiler", @@ -7560,7 +7560,7 @@ dependencies = [ "msim-macros", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.96", ] [[package]] @@ -7653,7 +7653,7 @@ dependencies = [ "iota-transaction-checks", "iota-types", "jsonrpsee", - "lru 0.12.4", + "lru", "move-binary-format", "move-bytecode-utils", "move-core-types", @@ -7884,7 +7884,7 @@ dependencies = [ "iota-framework", "iota-move-build", "iota-types", - "lru 0.12.4", + "lru", "move-package", "msim", "rand 0.8.5", @@ -8059,7 +8059,7 @@ dependencies = [ "iota-test-transaction-builder", "iota-types", "itertools 0.13.0", - "lru 0.12.4", + "lru", "move-binary-format", "move-bytecode-utils", "move-core-types", @@ -8279,6 +8279,7 @@ version = "0.9.0-alpha" dependencies = [ "anyhow", "async-trait", + "base64 0.21.7", "bcs", "bimap", "clap", @@ -8356,7 +8357,7 @@ dependencies = [ "iota-sdk 1.1.5", "iota-util-mem", "itertools 0.13.0", - "lru 0.12.4", + "lru", "move-binary-format", "move-bytecode-utils", "move-command-line-common", @@ -8751,7 +8752,7 @@ dependencies = [ "proc-macro-crate 3.2.0", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.96", ] [[package]] @@ -9042,7 +9043,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" dependencies = [ "cfg-if", - "windows-targets 0.48.5", + "windows-targets 0.52.6", ] [[package]] @@ -9181,7 +9182,7 @@ dependencies = [ "proc-macro2", "quote", "regex-syntax 0.8.4", - "syn 2.0.77", + "syn 2.0.96", ] [[package]] @@ -9193,15 +9194,6 @@ dependencies = [ "logos-codegen", ] -[[package]] -name = "lru" -version = "0.7.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999beba7b6e8345721bd280141ed958096a2e4abdf74f67ff4ce49b4b54e47a" -dependencies = [ - "hashbrown 0.12.3", -] - [[package]] name = "lru" version = "0.12.4" @@ -9360,7 +9352,7 @@ checksum = "dcf09caffaac8068c346b6df2a7fc27a177fd20b39421a39ce0a211bde679a6c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.96", ] [[package]] @@ -9916,7 +9908,7 @@ name = "move-proc-macros" version = "0.1.0" dependencies = [ "quote", - "syn 2.0.77", + "syn 2.0.96", ] [[package]] @@ -10267,7 +10259,7 @@ checksum = "254a5372af8fc138e36684761d3c0cdb758a4410e938babcff1c860ce14ddbfc" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.96", ] [[package]] @@ -10541,7 +10533,7 @@ checksum = "e238432a7881ec7164503ccc516c014bf009be7984cde1ba56837862543bdec3" dependencies = [ "bitvec 1.0.1", "either", - "lru 0.12.4", + "lru", "num-bigint 0.4.6", "num-integer", "num-modular", @@ -10598,7 +10590,7 @@ dependencies = [ "proc-macro-crate 3.2.0", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.96", ] [[package]] @@ -10757,25 +10749,23 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "opentelemetry" -version = "0.21.0" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e32339a5dc40459130b3bd269e9892439f55b33e772d2a9d402a789baaf4e8a" +checksum = "4c365a63eec4f55b7efeceb724f1336f26a9cf3427b70e59e2cd2a5b947fba96" dependencies = [ "futures-core", "futures-sink", - "indexmap 2.5.0", "js-sys", "once_cell", "pin-project-lite", "thiserror", - "urlencoding", ] [[package]] name = "opentelemetry" -version = "0.24.0" +version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c365a63eec4f55b7efeceb724f1336f26a9cf3427b70e59e2cd2a5b947fba96" +checksum = "803801d3d3b71cd026851a53f974ea03df3d179cb758b260136a6c9e22e196af" dependencies = [ "futures-core", "futures-sink", @@ -10885,7 +10875,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.96", ] [[package]] @@ -10899,7 +10889,7 @@ dependencies = [ "proc-macro2", "proc-macro2-diagnostics", "quote", - "syn 2.0.77", + "syn 2.0.96", ] [[package]] @@ -11349,7 +11339,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.96", ] [[package]] @@ -11423,7 +11413,7 @@ dependencies = [ "phf_shared 0.11.2", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.96", ] [[package]] @@ -11461,7 +11451,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.96", ] [[package]] @@ -11719,7 +11709,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "479cf940fbbb3426c32c5d5176f62ad57549a0bb84773423ba8be9d089f5faba" dependencies = [ "proc-macro2", - "syn 2.0.77", + "syn 2.0.96", ] [[package]] @@ -11833,14 +11823,14 @@ dependencies = [ "proc-macro-error-attr2", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.96", ] [[package]] name = "proc-macro2" -version = "1.0.86" +version = "1.0.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" dependencies = [ "unicode-ident", ] @@ -11853,7 +11843,7 @@ checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.96", "version_check", "yansi 1.0.1", ] @@ -11936,7 +11926,7 @@ checksum = "4ee1c9ac207483d5e7db4940700de86a9aae46ef90c48b57f99fe7edb8345e49" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.96", ] [[package]] @@ -11966,7 +11956,7 @@ dependencies = [ "prost", "prost-types", "regex", - "syn 2.0.77", + "syn 2.0.96", "tempfile", ] @@ -11980,7 +11970,7 @@ dependencies = [ "itertools 0.13.0", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.96", ] [[package]] @@ -12311,7 +12301,7 @@ checksum = "a25d631e41bfb5fdcde1d4e2215f62f7f0afa3ff11e26563765bd6ea1d229aeb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.96", ] [[package]] @@ -12377,7 +12367,7 @@ checksum = "bcc303e793d3734489387d205e9b186fac9c6cfacedd98cbb2e8a5943595f3e6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.96", ] [[package]] @@ -13140,7 +13130,7 @@ checksum = "e5af959c8bf6af1aff6d2b463a57f71aae53d1332da58419e30ad8dc7011d951" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.96", ] [[package]] @@ -13240,7 +13230,7 @@ dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn 2.0.77", + "syn 2.0.96", ] [[package]] @@ -13444,7 +13434,7 @@ checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.96", ] [[package]] @@ -13455,7 +13445,7 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.96", ] [[package]] @@ -13489,7 +13479,7 @@ checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.96", ] [[package]] @@ -13540,7 +13530,7 @@ dependencies = [ "darling 0.20.10", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.96", ] [[package]] @@ -13587,7 +13577,7 @@ checksum = "91d129178576168c589c9ec973feedf7d3126c01ac2bf08795109aa35b69fb8f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.96", ] [[package]] @@ -13919,7 +13909,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.96", ] [[package]] @@ -14275,7 +14265,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.77", + "syn 2.0.96", ] [[package]] @@ -14288,7 +14278,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.77", + "syn 2.0.96", ] [[package]] @@ -14390,9 +14380,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.77" +version = "2.0.96" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f35bcdf61fd8e7be6caf75f429fdca8beb3ed76584befb503b1569faee373ed" +checksum = "d5d0adab1ae378d7f53bdebc67a39f1f151407ef230f0ce2883572f5d8985c80" dependencies = [ "proc-macro2", "quote", @@ -14434,7 +14424,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.96", ] [[package]] @@ -14679,7 +14669,7 @@ dependencies = [ "proc-macro2", "quote", "subprocess", - "syn 2.0.77", + "syn 2.0.96", "test-fuzz-internal", "toolchain_find", ] @@ -14726,7 +14716,7 @@ checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.96", ] [[package]] @@ -14882,7 +14872,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.96", ] [[package]] @@ -14892,7 +14882,7 @@ source = "git+https://github.com/iotaledger/tokio-madsim-fork.git?branch=main#e3 dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.96", ] [[package]] @@ -15108,7 +15098,7 @@ dependencies = [ "proc-macro2", "prost-build", "quote", - "syn 2.0.77", + "syn 2.0.96", ] [[package]] @@ -15160,14 +15150,14 @@ dependencies = [ [[package]] name = "tower" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2873938d487c3cfb9aed7546dc9f2711d867c9f90c46b889989a2cb84eba6b4f" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" dependencies = [ "futures-core", "futures-util", "pin-project-lite", - "sync_wrapper 0.1.2", + "sync_wrapper 1.0.1", "tokio", "tower-layer", "tower-service", @@ -15249,7 +15239,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.96", ] [[package]] @@ -15544,7 +15534,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a615d6c2764852a2e88a4f16e9ce1ea49bb776b5872956309e170d63a042a34f" dependencies = [ "quote", - "syn 2.0.77", + "syn 2.0.96", ] [[package]] @@ -15849,7 +15839,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.96", "wasm-bindgen-shared", ] @@ -15883,7 +15873,7 @@ checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.96", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -16079,7 +16069,7 @@ checksum = "9107ddc059d5b6fbfbffdfa7a7fe3e22a226def0b2608f72e9d552763d3e1ad7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.96", ] [[package]] @@ -16090,7 +16080,7 @@ checksum = "29bee4b38ea3cde66011baa44dba677c432a78593e202392d1e9070cf2a7fca7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.96", ] [[package]] @@ -16480,7 +16470,7 @@ checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.96", "synstructure 0.13.1", ] @@ -16529,7 +16519,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.96", ] [[package]] @@ -16549,7 +16539,7 @@ checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.96", "synstructure 0.13.1", ] @@ -16571,7 +16561,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.96", ] [[package]] @@ -16593,7 +16583,7 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.96", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index e91e9c7d489..2acc8002f84 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -212,7 +212,7 @@ anemo-build = { git = "https://github.com/mystenlabs/anemo.git", rev = "e609f769 anemo-tower = { git = "https://github.com/mystenlabs/anemo.git", rev = "e609f7697ed6169bf0760882a0b6c032a57e4f3b" } anyhow = "1.0.71" arc-swap = { version = "1.5.1", features = ["serde"] } -async-graphql = "=7.0.1" +async-graphql = "=7.0.11" async-recursion = "1.0.4" async-trait = "0.1.61" aws-config = "0.56" diff --git a/crates/iota-graphql-rpc/Cargo.toml b/crates/iota-graphql-rpc/Cargo.toml index 56e8abcc493..c287f0f79c1 100644 --- a/crates/iota-graphql-rpc/Cargo.toml +++ b/crates/iota-graphql-rpc/Cargo.toml @@ -10,8 +10,8 @@ publish = false # external dependencies anyhow.workspace = true async-graphql = { workspace = true, features = ["dataloader", "apollo_tracing", "tracing", "opentelemetry"] } -async-graphql-axum = "=7.0.1" -async-graphql-value = "=7.0.1" +async-graphql-axum = "=7.0.11" +async-graphql-value = "=7.0.11" async-trait.workspace = true axum.workspace = true axum-extra.workspace = true diff --git a/crates/iota-graphql-rpc/schema.graphql b/crates/iota-graphql-rpc/schema.graphql index ec5f1a351d7..7bac27a2f22 100644 --- a/crates/iota-graphql-rpc/schema.graphql +++ b/crates/iota-graphql-rpc/schema.graphql @@ -4591,6 +4591,7 @@ type ZkLoginVerifyResult { errors: [String!]! } +directive @deprecated(reason: String = "No longer supported") on FIELD_DEFINITION | ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION | ENUM_VALUE directive @include(if: Boolean!) on FIELD | FRAGMENT_SPREAD | INLINE_FRAGMENT directive @skip(if: Boolean!) on FIELD | FRAGMENT_SPREAD | INLINE_FRAGMENT schema { diff --git a/crates/iota-graphql-rpc/src/data/package_resolver.rs b/crates/iota-graphql-rpc/src/data/package_resolver.rs index f8781753c91..e97c286964f 100644 --- a/crates/iota-graphql-rpc/src/data/package_resolver.rs +++ b/crates/iota-graphql-rpc/src/data/package_resolver.rs @@ -50,7 +50,6 @@ impl PackageStore for DbPackageStore { } } -#[async_trait::async_trait] impl Loader for Db { type Value = Arc; type Error = PackageResolverError; diff --git a/crates/iota-graphql-rpc/src/types/checkpoint.rs b/crates/iota-graphql-rpc/src/types/checkpoint.rs index ab464fe101a..e4091d5c26a 100644 --- a/crates/iota-graphql-rpc/src/types/checkpoint.rs +++ b/crates/iota-graphql-rpc/src/types/checkpoint.rs @@ -387,7 +387,6 @@ impl Checkpointed for Cursor { impl ScanLimited for Cursor {} -#[async_trait::async_trait] impl Loader for Db { type Value = Checkpoint; type Error = Error; @@ -439,7 +438,6 @@ impl Loader for Db { } } -#[async_trait::async_trait] impl Loader for Db { type Value = Checkpoint; type Error = Error; diff --git a/crates/iota-graphql-rpc/src/types/epoch.rs b/crates/iota-graphql-rpc/src/types/epoch.rs index 696ebdfe0fd..59a380a77aa 100644 --- a/crates/iota-graphql-rpc/src/types/epoch.rs +++ b/crates/iota-graphql-rpc/src/types/epoch.rs @@ -343,7 +343,6 @@ impl Epoch { } } -#[async_trait::async_trait] impl Loader for Db { type Value = Epoch; type Error = Error; diff --git a/crates/iota-graphql-rpc/src/types/move_package.rs b/crates/iota-graphql-rpc/src/types/move_package.rs index 57e68062c09..49b6f92d589 100644 --- a/crates/iota-graphql-rpc/src/types/move_package.rs +++ b/crates/iota-graphql-rpc/src/types/move_package.rs @@ -891,7 +891,6 @@ impl Target for StoredHistoryPackage { impl ScanLimited for BcsCursor {} -#[async_trait::async_trait] impl Loader for Db { type Value = IotaAddress; type Error = Error; @@ -949,7 +948,6 @@ impl Loader for Db { } } -#[async_trait::async_trait] impl Loader for Db { type Value = IotaAddress; type Error = Error; diff --git a/crates/iota-graphql-rpc/src/types/move_value.rs b/crates/iota-graphql-rpc/src/types/move_value.rs index 32a3080db8a..8d4267a2df2 100644 --- a/crates/iota-graphql-rpc/src/types/move_value.rs +++ b/crates/iota-graphql-rpc/src/types/move_value.rs @@ -942,7 +942,7 @@ mod tests { .unwrap(); let expect = expect![[ - r#"{baz: null,qux: [{quy: 44,quz: "Hello, world!",frob: "0x0000000000000000000000000000000000000000000000000000000000000045"},{quy: 46,quz: null,frob: "0x0000000000000000000000000000000000000000000000000000000000000047"}]}"# + r#"{baz: null, qux: [{quy: 44, quz: "Hello, world!", frob: "0x0000000000000000000000000000000000000000000000000000000000000045"}, {quy: 46, quz: null, frob: "0x0000000000000000000000000000000000000000000000000000000000000047"}]}"# ]]; expect.assert_eq(&format!("{v}")); } diff --git a/crates/iota-graphql-rpc/src/types/object.rs b/crates/iota-graphql-rpc/src/types/object.rs index d6211443f8a..ddb1a344a13 100644 --- a/crates/iota-graphql-rpc/src/types/object.rs +++ b/crates/iota-graphql-rpc/src/types/object.rs @@ -1245,7 +1245,6 @@ impl Target for StoredHistoryObject { } } -#[async_trait::async_trait] impl Loader for Db { type Value = Object; type Error = Error; @@ -1315,7 +1314,6 @@ impl Loader for Db { } } -#[async_trait::async_trait] impl Loader for Db { type Value = Object; type Error = Error; @@ -1415,7 +1413,6 @@ impl Loader for Db { } } -#[async_trait::async_trait] impl Loader for Db { type Value = Object; type Error = Error; diff --git a/crates/iota-graphql-rpc/src/types/transaction_block/mod.rs b/crates/iota-graphql-rpc/src/types/transaction_block/mod.rs index d6b38f291e3..40e524913fa 100644 --- a/crates/iota-graphql-rpc/src/types/transaction_block/mod.rs +++ b/crates/iota-graphql-rpc/src/types/transaction_block/mod.rs @@ -437,7 +437,6 @@ impl TransactionBlock { } } -#[async_trait::async_trait] impl Loader for Db { type Value = TransactionBlock; type Error = Error; diff --git a/crates/iota-graphql-rpc/src/types/validator.rs b/crates/iota-graphql-rpc/src/types/validator.rs index 4f9b3cfb87a..4b1e14eb6a6 100644 --- a/crates/iota-graphql-rpc/src/types/validator.rs +++ b/crates/iota-graphql-rpc/src/types/validator.rs @@ -57,7 +57,6 @@ pub(crate) struct Validator { /// /// It automatically filters the exchange rate table to only include data for /// the epochs that are less than or equal to the requested epoch. -#[async_trait::async_trait] impl Loader for Db { type Value = BTreeMap>; diff --git a/crates/iota-graphql-rpc/tests/snapshots/snapshot_tests__schema_sdl_export.snap b/crates/iota-graphql-rpc/tests/snapshots/snapshot_tests__schema_sdl_export.snap index f9ff85e3efb..39faa395417 100644 --- a/crates/iota-graphql-rpc/tests/snapshots/snapshot_tests__schema_sdl_export.snap +++ b/crates/iota-graphql-rpc/tests/snapshots/snapshot_tests__schema_sdl_export.snap @@ -4595,6 +4595,7 @@ type ZkLoginVerifyResult { errors: [String!]! } +directive @deprecated(reason: String = "No longer supported") on FIELD_DEFINITION | ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION | ENUM_VALUE directive @include(if: Boolean!) on FIELD | FRAGMENT_SPREAD | INLINE_FRAGMENT directive @skip(if: Boolean!) on FIELD | FRAGMENT_SPREAD | INLINE_FRAGMENT schema { diff --git a/crates/iota-transactional-test-runner/Cargo.toml b/crates/iota-transactional-test-runner/Cargo.toml index 4b9ccbf2ca8..9af5f6afa8f 100644 --- a/crates/iota-transactional-test-runner/Cargo.toml +++ b/crates/iota-transactional-test-runner/Cargo.toml @@ -14,6 +14,7 @@ workspace = true # external dependencies anyhow.workspace = true async-trait.workspace = true +base64.workspace = true bcs.workspace = true bimap = "0.6" clap.workspace = true diff --git a/crates/iota-transactional-test-runner/src/test_adapter.rs b/crates/iota-transactional-test-runner/src/test_adapter.rs index a5c8c88158e..2dadada3e9b 100644 --- a/crates/iota-transactional-test-runner/src/test_adapter.rs +++ b/crates/iota-transactional-test-runner/src/test_adapter.rs @@ -1237,7 +1237,16 @@ impl IotaTestAdapter { variables.insert(format!("cursor_{idx}"), base64d); } else { - variables.insert(format!("cursor_{idx}"), Base64::encode(s)); + use base64::Engine; + + // To comply with how `iota-graphql-rpc` decodes the json cursor + // (see `iota_graphql_rpc::types::cursor::JsonCursor`). + // + // This traces back to `async_graphql = 7.0.7` that uses no padding for + // encoding/decoding. + let base64d = base64::engine::general_purpose::URL_SAFE_NO_PAD.encode(s); + + variables.insert(format!("cursor_{idx}"), base64d); } } From 83d668b15ba615d57b718d99b55f607f567afcda Mon Sep 17 00:00:00 2001 From: vivekjain23 <165671934+vivekjain23@users.noreply.github.com> Date: Wed, 29 Jan 2025 18:39:37 +0530 Subject: [PATCH 22/51] feat(docs): simple token transfer tutorial (#4442) * Add simple token transfer tutorial --- .../getting-started/simple-token-transfer.mdx | 477 ++++++++++++++++++ docs/content/sidebars/developer.js | 1 + .../token-transfer/Dashboard.png | Bin 0 -> 52068 bytes .../token-transfer/check-balance.png | Bin 0 -> 57689 bytes .../token-transfer/check-transaction.png | Bin 0 -> 50340 bytes .../token-transfer/minting-token.png | Bin 0 -> 66737 bytes .../token-transfer/transaction-successful.png | Bin 0 -> 89614 bytes .../token-transfer/wallet-check.png | Bin 0 -> 41436 bytes .../token-transfer/wallet-connect.png | Bin 0 -> 83521 bytes .../token-transfer/wallet-connected.png | Bin 0 -> 57190 bytes .../token-transfer/wallet-transaction.png | Bin 0 -> 53569 bytes 11 files changed, 478 insertions(+) create mode 100644 docs/content/developer/getting-started/simple-token-transfer.mdx create mode 100644 docs/site/static/img/developer/getting-started/token-transfer/Dashboard.png create mode 100644 docs/site/static/img/developer/getting-started/token-transfer/check-balance.png create mode 100644 docs/site/static/img/developer/getting-started/token-transfer/check-transaction.png create mode 100644 docs/site/static/img/developer/getting-started/token-transfer/minting-token.png create mode 100644 docs/site/static/img/developer/getting-started/token-transfer/transaction-successful.png create mode 100644 docs/site/static/img/developer/getting-started/token-transfer/wallet-check.png create mode 100644 docs/site/static/img/developer/getting-started/token-transfer/wallet-connect.png create mode 100644 docs/site/static/img/developer/getting-started/token-transfer/wallet-connected.png create mode 100644 docs/site/static/img/developer/getting-started/token-transfer/wallet-transaction.png diff --git a/docs/content/developer/getting-started/simple-token-transfer.mdx b/docs/content/developer/getting-started/simple-token-transfer.mdx new file mode 100644 index 00000000000..b43da6b2162 --- /dev/null +++ b/docs/content/developer/getting-started/simple-token-transfer.mdx @@ -0,0 +1,477 @@ +--- +description: Tutorial for simple token transfer +tags: + - explanation + - tutorial +--- + +# Simple Token Transfer Tutorial + +In this tutorial, we will walk you through the process of building a simple token transfer dApp using the IOTA Move language and the IOTA dApp kit. You will learn how to create a move package that enables token transfers on the IOTA blockchain and how to integrate it with a frontend application that interacts with the package functions. The tutorial covers everything from move package creation to frontend development, giving you a hands-on understanding of how token transfers work within the IOTA ecosystem. By the end, you'll have a fully functional dApp that allows users to transfer tokens effortlessly. + +## Simple Token Transfer Architecture Overview + +```mermaid +sequenceDiagram + participant Sender + participant Contract + participant Treasury + participant Recipient + + Sender->>Contract: init(witness, ctx) + Contract->>Treasury: create_currency(witness) + Treasury-->>Contract: Returns TreasuryCap, Metadata + Contract->>Sender: transfer(treasury, sender) + + Sender->>Contract: mint(treasury_cap, amount, recipient, ctx) + Contract->>Treasury: mint(treasury_cap, amount) + Treasury-->>Contract: Returns Coin + Contract->>Recipient: transfer(coin, recipient) + + Sender->>Contract: transfer(token, amount, recipient, ctx) + Contract->>Treasury: split(token, amount) + Treasury-->>Contract: Returns CoinToTransfer + Contract->>Recipient: transfer(CoinToTransfer, recipient) + + Sender->>Contract: balances(token) + Contract-->>Sender: Returns token.balance +``` + +## Prerequisites + +- [Node.js](https://nodejs.org/) >=v20.18.0 +- [npx](https://www.npmjs.com/package/npx) >=10.8.2 +- [iota](https://github.com/iotaledger/iota/releases) >=0.7.3 + +## Create a Move Package + +Run the following command to create a Move package + +```bash +iota move new token_transfer_tutorial +``` + +This will generate a new Move package in a folder named `token_transfer`. + +## Configure the IOTA CLI + +To run the `mint` function from the frontend app, you must be the owner of the package; otherwise, you cannot execute the function. To become the owner, you need to publish the package, and this process can only be done through the CLI. Note that the CLI and browser wallet extension use separate accounts. In the CLI, you can update the active address and private key to match the account used in the browser wallet extension. By aligning these accounts, you ensure the same account is used in both the CLI and the wallet extension, enabling seamless transactions in your frontend app. + +Before publishing the package, you need to configure your IOTA CLI with your wallet details. + +### Navigate to the IOTA Configuration Directory + +```bash +cd ~/.iota/iota_config/ +``` + +### Update the Private Key and Active Address + +`iota.keystore`: Replace the existing private key with your IOTA wallet private key. + +`client.yaml`: Replace the `active_address` field with your IOTA wallet address. + +### Package Overview + +#### [`init`](https://github.com/iota-community/token-transfer-tutorial/blob/ea71112c1156d1885567353fee0a03e09308e293/sources/token_transfer.move#L9-L13) + +- Executes at the time of publication of the package. +- Takes `MY_TOKEN` as a witness and the transaction context ([ctx](https://docs.iota.org/references/framework/iota-framework/tx_context#0x2_tx_context_sender)). +- Uses the [`coin::create_currency`](https://docs.iota.org/references/framework/iota-framework/coin#0x2_coin_create_currency) function to create the token by specifying the name, symbol, and decimal precision of the token. +- The [`coin::create_currency`](https://docs.iota.org/references/framework/iota-framework/coin#0x2_coin_create_currency) function returns a TreasuryCap, which allows the owner to mint and transfer the token, and the metadata of the token. +- Transfers the metadata to the owner of the contract using [`transfer::public_freeze_object(metadata)`](https://docs.iota.org/references/framework/iota-framework/transfer#0x2_transfer_public_freeze_object) and [`transfer::public_transfer(treasury, ctx.sender())`](https://docs.iota.org/references/framework/iota-framework/transfer#function-public_transfer). + +```move reference +https://github.com/iota-community/token-transfer-tutorial/blob/ea71112c1156d1885567353fee0a03e09308e293/sources/token_transfer.move#L9-L13 +``` + +#### [`mint`](https://github.com/iota-community/token-transfer-tutorial/blob/ea71112c1156d1885567353fee0a03e09308e293/sources/token_transfer.move#L15-L23) + +- Mints the token and transfers it to the recipient address. +- Can only be called by the owner of the contract. +- Creates a new object of the `MY_TOKEN` token using the TreasuryCap. +- The TreasuryCap address (which was generated during the contract's publication) is required to mint the tokens. +- Transfers the minted tokens to the recipient after they are created. + +```move reference +https://github.com/iota-community/token-transfer-tutorial/blob/ea71112c1156d1885567353fee0a03e09308e293/sources/token_transfer.move#L15-L23 +``` + +#### [`transfer`](https://github.com/iota-community/token-transfer-tutorial/blob/ea71112c1156d1885567353fee0a03e09308e293/sources/token_transfer.move#L25-L33) + +- Transfers the token from the caller address to the recipient address. +- Requires the correct token object address that is owned by the caller. +- The function first uses the [`coin::split`](https://docs.iota.org/references/framework/iota-framework/coin#function-split) function to split the specified amount from the token and then uses [`transfer::public_transfer`](https://docs.iota.org/references/framework/iota-framework/transfer#function-public_transfer) to transfer the split tokens to the recipient. + +```move reference +https://github.com/iota-community/token-transfer-tutorial/blob/ea71112c1156d1885567353fee0a03e09308e293/sources/token_transfer.move#L25-L33 +``` + +#### [`balance`](https://github.com/iota-community/token-transfer-tutorial/blob/ea71112c1156d1885567353fee0a03e09308e293/sources/token_transfer.move#L34-L37) + +- Returns the balance of the token for the specified owner. +- Requires passing the token address to retrieve the balance. +- Uses [`coin::balance`](https://docs.iota.org/references/framework/iota-framework/coin#function-balance) to query the balance and returns the value held by the coin object. + +```move reference +https://github.com/iota-community/token-transfer-tutorial/blob/ea71112c1156d1885567353fee0a03e09308e293/sources/token_transfer.move#L34-L37 +``` + +Navigate to the [`source/token-transfer.move`](https://github.com/iota-community/token-transfer-tutorial/blob/ea71112c1156d1885567353fee0a03e09308e293/sources/token_transfer.move#L1-L38) file and paste the following code: + +```move reference +https://github.com/iota-community/token-transfer-tutorial/blob/ea71112c1156d1885567353fee0a03e09308e293/sources/token_transfer.move#L1-L38 +``` + +### [Build the Package](https://docs.iota.org/developer/getting-started/build-test) + +Once the contract is ready, build the package by running: + +```bash +iota move build +``` + +### [Publish the Package](https://docs.iota.org/developer/getting-started/publish) + +Publish the package to the IOTA testnet using the following command: + +```bash +iota client publish + +``` + +After publishing, you will receive a detailed transaction output. Here’s an example: + +
+ + Transaction Output + + +```bash +Transaction Digest: EV17EsY3LXgzwFVSZAK6Xr3ohTnWjrYajo3G7yg88Qa4 +╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ +│ Transaction Data │ +├──────────────────────────────────────────────────────────────────────────────────────────────────────────────┤ +│ Sender: 0xedeca9d6897cf86917e45f5c5cd596da48a5c4e3e1d9425aee42bed37c9ee44d │ +│ Gas Owner: 0xedeca9d6897cf86917e45f5c5cd596da48a5c4e3e1d9425aee42bed37c9ee44d │ +│ Gas Budget: 16424800 NANOS │ +│ Gas Price: 1000 NANOS │ +│ Gas Payment: │ +│ ┌── │ +│ │ ID: 0x410eb60409b8e7ff4b0db6c0ec0e2ba4869359352e8cbb6e6298f38b4f9e8cb6 │ +│ │ Version: 470532 │ +│ │ Digest: HEgegyRiXyWZotuRK46uaQJgrVketTtWVX8kfBCPXFAs │ +│ └── │ +│ │ +│ Transaction Kind: Programmable │ +│ ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ +│ │ Input Objects │ │ +│ ├──────────────────────────────────────────────────────────────────────────────────────────────────────────┤ │ +│ │ 0 Pure Arg: Type: address, Value: "0xedeca9d6897cf86917e45f5c5cd596da48a5c4e3e1d9425aee42bed37c9ee44d" │ │ +│ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │ +│ ╭─────────────────────────────────────────────────────────────────────────╮ │ +│ │ Commands │ │ +│ ├─────────────────────────────────────────────────────────────────────────┤ │ +│ │ 0 Publish: │ │ +│ │ ┌ │ │ +│ │ │ Dependencies: │ │ +│ │ │ 0x0000000000000000000000000000000000000000000000000000000000000002 │ │ +│ │ │ 0x0000000000000000000000000000000000000000000000000000000000000001 │ │ +│ │ └ │ │ +│ │ │ │ +│ │ 1 TransferObjects: │ │ +│ │ ┌ │ │ +│ │ │ Arguments: │ │ +│ │ │ Result 0 │ │ +│ │ │ Address: Input 0 │ │ +│ │ └ │ │ +│ ╰─────────────────────────────────────────────────────────────────────────╯ │ +│ │ +│ Signatures: │ +│ GGL+ZaqdoxGOmpySTP/GFnVrK50VwuhKptc/5K2aOCcaTAIUKhknn2L9cCN2gG8p9mEVpUDDeb/bt7nzXl4yBw== │ +│ │ +╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ +╭───────────────────────────────────────────────────────────────────────────────────────────────────╮ +│ Transaction Effects │ +├───────────────────────────────────────────────────────────────────────────────────────────────────┤ +│ Digest: EV17EsY3LXgzwFVSZAK6Xr3ohTnWjrYajo3G7yg88Qa4 │ +│ Status: Success │ +│ Executed Epoch: 18 │ +│ │ +│ Created Objects: │ +│ ┌── │ +│ │ ID: 0x425d4962e3e0dc0c08f87900a7577b240c3778adf54183e10b9832b7e9a51278 │ +│ │ Owner: Immutable │ +│ │ Version: 470533 │ +│ │ Digest: GYr4WDEwJq95S9NYcVu5koKEH85uc9HUiq3vFkjvaJ7Y │ +│ └── │ +│ ┌── │ +│ │ ID: 0x537d7c04ddd8f7611de17910909c99c610227f9949126e684ba4a7b6eb55e3e1 │ +│ │ Owner: Immutable │ +│ │ Version: 1 │ +│ │ Digest: AqFmepZJmqEMi2qPYscZf1X4vZtXs3oUgSg2vn2X7CDz │ +│ └── │ +│ ┌── │ +│ │ ID: 0x9e54291864e24091153c6f6250cb2788d2e928c438ee15c2be4db7614f85ae3e │ +│ │ Owner: Account Address ( 0xedeca9d6897cf86917e45f5c5cd596da48a5c4e3e1d9425aee42bed37c9ee44d ) │ +│ │ Version: 470533 │ +│ │ Digest: EVNTfuzZhBVCageRiKraDHf9vb8uDLxw8yYwEY8zVmqY │ +│ └── │ +│ ┌── │ +│ │ ID: 0xf64b55e996f1ba79ba6517c4d98c604bbf21876841af6088a72150bee8908f09 │ +│ │ Owner: Account Address ( 0xedeca9d6897cf86917e45f5c5cd596da48a5c4e3e1d9425aee42bed37c9ee44d ) │ +│ │ Version: 470533 │ +│ │ Digest: 4gYHJNnTERVcFYrpqLBpr3YoYZhaVPV2L73YwmZYbyJ3 │ +│ └── │ +│ Mutated Objects: │ +│ ┌── │ +│ │ ID: 0x410eb60409b8e7ff4b0db6c0ec0e2ba4869359352e8cbb6e6298f38b4f9e8cb6 │ +│ │ Owner: Account Address ( 0xedeca9d6897cf86917e45f5c5cd596da48a5c4e3e1d9425aee42bed37c9ee44d ) │ +│ │ Version: 470533 │ +│ │ Digest: 3KUZySKTbg5SV41WCCi2bFodjQVp9CTWBQCsSiYX7GMf │ +│ └── │ +│ Gas Object: │ +│ ┌── │ +│ │ ID: 0x410eb60409b8e7ff4b0db6c0ec0e2ba4869359352e8cbb6e6298f38b4f9e8cb6 │ +│ │ Owner: Account Address ( 0xedeca9d6897cf86917e45f5c5cd596da48a5c4e3e1d9425aee42bed37c9ee44d ) │ +│ │ Version: 470533 │ +│ │ Digest: 3KUZySKTbg5SV41WCCi2bFodjQVp9CTWBQCsSiYX7GMf │ +│ └── │ +│ Gas Cost Summary: │ +│ Storage Cost: 14424800 NANOS │ +│ Computation Cost: 1000000 NANOS │ +│ Storage Rebate: 980400 NANOS │ +│ Non-refundable Storage Fee: 0 NANOS │ +│ │ +│ Transaction Dependencies: │ +│ 63X49x2QuuYNduExZWoJjfXut3s3WDWZ7Tr7nXJu32ZT │ +│ 6EUKtb4nRKGwzLBBQ8zY38rHsEU6aZJJSYDuGrDDKaht │ +╰───────────────────────────────────────────────────────────────────────────────────────────────────╯ +╭─────────────────────────────╮ +│ No transaction block events │ +╰─────────────────────────────╯ + +╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ +│ Object Changes │ +├─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤ +│ Created Objects: │ +│ ┌── │ +│ │ ObjectID: 0x425d4962e3e0dc0c08f87900a7577b240c3778adf54183e10b9832b7e9a51278 │ +│ │ Sender: 0xedeca9d6897cf86917e45f5c5cd596da48a5c4e3e1d9425aee42bed37c9ee44d │ +│ │ Owner: Immutable │ +│ │ ObjectType: 0x2::coin::CoinMetadata<0x537d7c04ddd8f7611de17910909c99c610227f9949126e684ba4a7b6eb55e3e1::my_token::MY_TOKEN> │ +│ │ Version: 470533 │ +│ │ Digest: GYr4WDEwJq95S9NYcVu5koKEH85uc9HUiq3vFkjvaJ7Y │ +│ └── │ +│ ┌── │ +│ │ ObjectID: 0x9e54291864e24091153c6f6250cb2788d2e928c438ee15c2be4db7614f85ae3e │ +│ │ Sender: 0xedeca9d6897cf86917e45f5c5cd596da48a5c4e3e1d9425aee42bed37c9ee44d │ +│ │ Owner: Account Address ( 0xedeca9d6897cf86917e45f5c5cd596da48a5c4e3e1d9425aee42bed37c9ee44d ) │ +│ │ ObjectType: 0x2::coin::TreasuryCap<0x537d7c04ddd8f7611de17910909c99c610227f9949126e684ba4a7b6eb55e3e1::my_token::MY_TOKEN> │ +│ │ Version: 470533 │ +│ │ Digest: EVNTfuzZhBVCageRiKraDHf9vb8uDLxw8yYwEY8zVmqY │ +│ └── │ +│ ┌── │ +│ │ ObjectID: 0xf64b55e996f1ba79ba6517c4d98c604bbf21876841af6088a72150bee8908f09 │ +│ │ Sender: 0xedeca9d6897cf86917e45f5c5cd596da48a5c4e3e1d9425aee42bed37c9ee44d │ +│ │ Owner: Account Address ( 0xedeca9d6897cf86917e45f5c5cd596da48a5c4e3e1d9425aee42bed37c9ee44d ) │ +│ │ ObjectType: 0x2::package::UpgradeCap │ +│ │ Version: 470533 │ +│ │ Digest: 4gYHJNnTERVcFYrpqLBpr3YoYZhaVPV2L73YwmZYbyJ3 │ +│ └── │ +│ Mutated Objects: │ +│ ┌── │ +│ │ ObjectID: 0x410eb60409b8e7ff4b0db6c0ec0e2ba4869359352e8cbb6e6298f38b4f9e8cb6 │ +│ │ Sender: 0xedeca9d6897cf86917e45f5c5cd596da48a5c4e3e1d9425aee42bed37c9ee44d │ +│ │ Owner: Account Address ( 0xedeca9d6897cf86917e45f5c5cd596da48a5c4e3e1d9425aee42bed37c9ee44d ) │ +│ │ ObjectType: 0x2::coin::Coin<0x2::iota::IOTA> │ +│ │ Version: 470533 │ +│ │ Digest: 3KUZySKTbg5SV41WCCi2bFodjQVp9CTWBQCsSiYX7GMf │ +│ └── │ +│ Published Objects: │ +│ ┌── │ +│ │ PackageID: 0x537d7c04ddd8f7611de17910909c99c610227f9949126e684ba4a7b6eb55e3e1 │ +│ │ Version: 1 │ +│ │ Digest: AqFmepZJmqEMi2qPYscZf1X4vZtXs3oUgSg2vn2X7CDz │ +│ │ Modules: my_token │ +│ └── │ +╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ +╭───────────────────────────────────────────────────────────────────────────────────────────────────╮ +│ Balance Changes │ +├───────────────────────────────────────────────────────────────────────────────────────────────────┤ +│ ┌── │ +│ │ Owner: Account Address ( 0xedeca9d6897cf86917e45f5c5cd596da48a5c4e3e1d9425aee42bed37c9ee44d ) │ +│ │ CoinType: 0x2::iota::IOTA │ +│ │ Amount: -14444400 │ +│ └── │ +╰───────────────────────────────────────────────────────────────────────────────────────────────────╯ +``` +
+ +## Simple Token Transfer UI + +Let’s now set up the frontend application using the [IOTA dApp kit](../../ts-sdk/dapp-kit/index.mdx). This kit provides a collection of tools and components that simplify integrating IOTA-based smart contracts into your web applications. By leveraging the dApp kit, you can efficiently build user interfaces that enable users to interact with the blockchain, such as sending transactions, querying contracts, and displaying data. + +The dApp kit is designed to streamline the connection between your frontend and the IOTA blockchain, handling important tasks like wallet integration, transaction signing, and communication with your deployed contract. If you’re new to the dApp kit, you can consult its documentation for comprehensive instructions on how to set it up and use its features to create a smooth frontend experience. + +In this section, we’ll walk you through the process of configuring the frontend and linking it to the smart contract we created earlier. By the end, you’ll have a fully functional dApp that enables users to interact with your IOTA-based token transfer contract directly from the frontend. + +### Setup + +Run the following the command to setup the initial IOTA dApp. + +```npm2yarn +pnpm create @iota/create-dapp +``` + +This will set up an initial IOTA dApp, including all the necessary dependencies. However, keep in mind that you will still need to install the dependencies by running the following command: + +```npm2yarn +pnpm i +``` + +### Code Structure + +- [`networkConfig.ts`](https://github.com/iota-community/token-transfer-tutorial/blob/ea71112c1156d1885567353fee0a03e09308e293/frontend/src/networkConfig.ts#L1-L22) +- [`App.tsx`](https://github.com/iota-community/token-transfer-tutorial/blob/3e2023a7c29aa5cf43305c6c42bd463a7a789750/frontend/src/App.tsx#L1-L58) +- **Components**: The components directory contains separate react components for different operations, such as checking balances, minting tokens, and transferring tokens. + - [`Balance.tsx`](https://github.com/iota-community/token-transfer-tutorial/blob/3e2023a7c29aa5cf43305c6c42bd463a7a789750/frontend/src/components/Balance.tsx#L1-L27) + - [`Buttons.tsx`](https://github.com/iota-community/token-transfer-tutorial/blob/3e2023a7c29aa5cf43305c6c42bd463a7a789750/frontend/src/components/Buttons.tsx#L1-L27) + - [`Mint.tsx`](https://github.com/iota-community/token-transfer-tutorial/blob/3e2023a7c29aa5cf43305c6c42bd463a7a789750/frontend/src/components/Mint.tsx#L1-L144) + - [`Transfer.tsx`](https://github.com/iota-community/token-transfer-tutorial/blob/3e2023a7c29aa5cf43305c6c42bd463a7a789750/frontend/src/components/Transfer.tsx#L1) +- **Utils**: The utils directory contains reusable utility functions that handle common tasks such as minting and transferring tokens. + - [`balance.ts`](https://github.com/iota-community/token-transfer-tutorial/blob/3e2023a7c29aa5cf43305c6c42bd463a7a789750/frontend/src/utils/balance.ts#L1-L26) + - [`mint.ts`](https://github.com/iota-community/token-transfer-tutorial/blob/3e2023a7c29aa5cf43305c6c42bd463a7a789750/frontend/src/utils/mint.ts#L1-L36) + - [`transfer.ts`](https://github.com/iota-community/token-transfer-tutorial/blob/3e2023a7c29aa5cf43305c6c42bd463a7a789750/frontend/src/utils/transfer.ts#L1-L37) + +### Setting Up Network Configuration + +Add the following variables in the `networkConfig.ts` file: +- `packageId`: The package ID for the smart contract. +- `coinAddress`: The address of the token contract. +- `treasuryCap`: The treasury cap address used for minting tokens. + +To retrieve this information, visit the testnet explorer, search for your IOTA wallet address, and review the recent transactions. + +```typescript reference +https://github.com/iota-community/token-transfer-tutorial/blob/ea71112c1156d1885567353fee0a03e09308e293/frontend/src/networkConfig.ts#L1-L22 +``` + +### Components +The `components` folder contains four primary components, each handling a specific functionality. Here's a detailed description of each component: + +#### [`Buttons.tsx`](https://github.com/iota-community/token-transfer-tutorial/blob/3e2023a7c29aa5cf43305c6c42bd463a7a789750/frontend/src/components/Buttons.tsx#L1-L27) + +The `Buttons.tsx` file renders a vertical layout of three customizable buttons ("Transfer," "Mint," and "Check Balance") using Radix UI's `Button`, `Container`, and `Flex` components. Each button toggles a specific state (`transferField`, `mintField`, or `showBalance`) while resetting the others, enabling functionality for switching between actions in the app. + +```typescript reference +https://github.com/iota-community/token-transfer-tutorial/blob/3e2023a7c29aa5cf43305c6c42bd463a7a789750/frontend/src/components/Buttons.tsx#L1-L27 +``` + +#### [`Balance.tsx`](https://github.com/iota-community/token-transfer-tutorial/blob/3e2023a7c29aa5cf43305c6c42bd463a7a789750/frontend/src/components/Balance.tsx#L1-L27) + +This component is designed to fetch and display the balance of the connected wallet for the specified token. It utilizes the blockchain's API to retrieve the token's balance and type, presenting this information to the user in a simple and visually appealing manner. This feature helps users monitor their token holdings without navigating away from the app. It also ensures that data is updated in real time, enhancing the user experience. + +```typescript reference +https://github.com/iota-community/token-transfer-tutorial/blob/3e2023a7c29aa5cf43305c6c42bd463a7a789750/frontend/src/components/Balance.tsx#L1-L27 +``` + +#### [`Transfer.tsx`](https://github.com/iota-community/token-transfer-tutorial/blob/3e2023a7c29aa5cf43305c6c42bd463a7a789750/frontend/src/components/Transfer.tsx#L1) + +The `Transfer.tsx` component handles the process of transferring tokens from the connected wallet to a recipient address. Users can input the recipient's address and the number of tokens they wish to transfer. This component also manages transaction signing and execution using the dApp kit, ensuring that the transfer operation is seamless and secure. Error handling is built in to notify users of any issues during the transaction process. + +```typescript reference +https://github.com/iota-community/token-transfer-tutorial/blob/0bbe1cc9cef5219c6f29b8cef9d1022ab0c5ddc5/frontend/src/components/Transfer.tsx#L1-L94 +``` + +#### [`Mint.tsx`](https://github.com/iota-community/token-transfer-tutorial/blob/3e2023a7c29aa5cf43305c6c42bd463a7a789750/frontend/src/components/Mint.tsx#L1-L144) + +This component allows users to mint new tokens to a specified address. Users can provide the recipient's address and the amount of tokens to mint. The `Mint.tsx` component interacts with the blockchain's treasury cap and package ID to execute the minting operation. This functionality is critical for applications that require dynamic token issuance, such as token reward systems or initial token distribution. + +```typescript reference +https://github.com/iota-community/token-transfer-tutorial/blob/0bbe1cc9cef5219c6f29b8cef9d1022ab0c5ddc5/frontend/src/components/Mint.tsx#L1-L79 +``` + +#### [`App.tsx`](https://github.com/iota-community/token-transfer-tutorial/blob/3e2023a7c29aa5cf43305c6c42bd463a7a789750/frontend/src/App.tsx#L1-L58) + +The `App.tsx` file integrates the components and provides the main structure of the frontend application. + +```typescript reference +https://github.com/iota-community/token-transfer-tutorial/blob/3e2023a7c29aa5cf43305c6c42bd463a7a789750/frontend/src/App.tsx#L1-L58 +``` + +### Putting it all together + +The frontend app for the token transfer tutorial is designed with several components: + +- `Balance.tsx` displays the token balance of the connected wallet by calling the `balance` function in `balance.ts`. +- `Button.tsx` renders a grid of buttons for mint, transfer, and balance operations. +- `Mint.tsx` provides a form to input data for minting tokens, sending the request to the `mint` function in `mint.ts` on submission. +- `Transfer.tsx` includes a form for transferring tokens, which interacts with the `transfer` function in `transfer.ts` on submission. +- The `utils` folder handles contract function calls using the IOTA dApp kit. +- Finally, `App.tsx` ties everything together by rendering the `Buttons.tsx` component for the operation buttons and displaying the forms from `Balance.tsx`, `Mint.tsx`, and `Transfer.tsx` for their respective functionalities. + + +- For more details you can refer the [`Frontend repository`](https://github.com/iota-community/token-transfer-tutorial/blob/frontend). + +### Start Frontend Server + +To run the frontend project run the following command from the root directory of the project. + +```bash +pnpm run dev +``` + +## Usage Example + +### Dashboard + +The dashboard of the token transfer app, displaying different operations like Transfer and Mint. + +![Dashboard](/img/developer/getting-started/token-transfer/Dashboard.png) + +### Connect IOTA Wallet + +Click on the Connect wallet button at the top right corner to connect your IOTA wallet. + +![Connect IOTA wallet](/img/developer/getting-started/token-transfer/wallet-connect.png) + +### Wallet Connected + +When the wallet is connected to the app, the address of the selected account will be displayed at the top right corner. + +![Wallet connected](/img/developer/getting-started/token-transfer/wallet-connected.png) + +### Minting Tokens + +Click the Mint button to mint the token. The account used for minting must be the same as the one used during the publication. + +![Minting token](/img/developer/getting-started/token-transfer/minting-token.png) + +### Wallet Transaction + +The minted amount will be displayed in the balance changes section of the wallet popup, so you can approve the transaction. + +![Wallet transaction](/img/developer/getting-started/token-transfer/wallet-transaction.png) + +### Transaction Successful + +Once you approve the mint transaction, an alert will appear indicating 'Transaction Successful'. + +![Transaction successfull](/img/developer/getting-started/token-transfer/transaction-successful.png) + +### Wallet Check + +After a successful mint transaction, you can check if the balance has increased in the wallet. + +![Wallet check](/img/developer/getting-started/token-transfer/wallet-check.png) + +### Check Balance + +Click on the `Check balance` button to check the token balance. + +![Check balance](/img/developer/getting-started/token-transfer/check-balance.png) + +## Conclusion + +With this setup, you’ve created a straightforward yet robust frontend application using the IOTA dApp kit. The components provided by the dApp kit enable you to effortlessly perform token-related tasks, such as transferring tokens and querying contract data, with smooth integration to the IOTA blockchain. This setup lays a strong foundation for expanding and customizing your dApp to meet your specific requirements. By completing these steps, you’ve successfully linked your frontend to the smart contract, resulting in a fully functional dApp that interacts seamlessly with the blockchain. \ No newline at end of file diff --git a/docs/content/sidebars/developer.js b/docs/content/sidebars/developer.js index 1c96f8c3a9f..cb86d0a2921 100644 --- a/docs/content/sidebars/developer.js +++ b/docs/content/sidebars/developer.js @@ -27,6 +27,7 @@ const developer = [ 'developer/getting-started/debug', 'developer/getting-started/client-tssdk', 'developer/getting-started/coffee-example', + 'developer/getting-started/simple-token-transfer', ], }, { diff --git a/docs/site/static/img/developer/getting-started/token-transfer/Dashboard.png b/docs/site/static/img/developer/getting-started/token-transfer/Dashboard.png new file mode 100644 index 0000000000000000000000000000000000000000..c74fd28d695bfac45eaeb4e6b1ebf90c90064649 GIT binary patch literal 52068 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 literal 0 HcmV?d00001 diff --git a/docs/site/static/img/developer/getting-started/token-transfer/check-balance.png b/docs/site/static/img/developer/getting-started/token-transfer/check-balance.png new file mode 100644 index 0000000000000000000000000000000000000000..39ab22e4dd011feb164a70263bedee3a70936035 GIT binary patch literal 57689 zcmb?^cUV(dw>KaNf(R&rf*`^uAXVu-j7pUvAiXI~2t|4c#lYC;NCydwG?6AX^fE~A zy@U`1DWOUYo$thV=3ad7kodJiVeR^g5mP!7Yj! zu)7C_+M_ygs^}BjrD3ZL_RDLY9y14@?(7evE zV%oJkR#KA`T`ylO@^tI-s(33)evBSuUAt7EHQ%#!K{({hGMKc+r`UW(XZKp$qn4JQ zW#yJjt@qn?51Ny0cl$@qG|<>;rKFyZ_0mY=zrsOd^+dKo@V6=AsVK#xIn*&2yzeq> zNJkcLXD3g%kbh8BDy&)?DEuPPE@Nz=TZe>iX{qZsqLqBY>dczs(hK)*L1zP2YlppS zJ!1Ej5Op{r=AqC#*R_)JDX_}ZF)82Cg8{9yq807`lHihvaO z`y%k?ehSe)zmhtnocZVTnKzpfTWjgM=&C#v zH*>J#ePZtL)PmQ;?m6}r0!a^X;G>;|%M%t4K>E(&9#X77t`G-4W54EOW%+T53s{O( zS4ExWo`aJGi!d)gFF&g^ISUJmq?5U&xW;|Czi$WrCB^#8#pSs;AD_FsJFmL{uY;2n z-yJbAF+Tpge0T5i09Wuhd)m7^@!+v{X8X?~|EzQ0!r9Ep`nij>gFOp&-6u~STwSDC zS+Ruv=fD5(Y2ji0zm)8q|K1j`K|bs+e0O;H`Tl2Z;8scOx8my79u~HG_pR*!@c=ZW z#qRP;{xrNK`_{+K7EbpZ>;RfB(*LWPzi&SIVOcn)H(#QUx zUfh_jUaT8FsoFEOLd{)PsqC0Z%c&g*j+j&*CnwJIE_1EfpWu%i?QF9xbazvPZS334 zc2&>8oL2?hF=163HJMoswXSX5QpZpG$f#LBF9-;Ui2waV%097@ii!$Sq%!^-?kid7 zIilMwXir(^9}+#CMCnoH6K)$;re3Gf{Li&%+#XyTL(aIEdqDtQp=}@g&(a054hJp^trb8o-ABrpsTK`Ehmrq``J;sO*l~`33 zL3)GX#7>EO+XnE1@eMvLzLv8%Bm<2wGOh8PQ%&4L@#lU%C}i8ut*HG9>diV)%U9OnxM z^QmD$u;v|HwpO8HItkrRH*y>24Y|{F1?fh4>u8Joi*r#&pK?Ykdm=Xyavbmy`KAN$ z*E7n8|55J08F&wp$Sg!iTO5<4*?)F17m190dK3X-fu(xDrpj-Bu&765ur>+Z!X;<> z%Wnt}yH?3DF^1j+_SF|6!wiYmBpaO{-zN~En23?*<#E4vIs+hO$snv-P!w_1JLuBEJ*aL#e?i>pE#j=rxgPUf;_^YgLWT!EAw#&Y2*^5VNEU-$CBe~+% zDyB!WbC*sJY@1}z&OL__w!DT1fSVbu9RPO-B{R9JoT`Q^S;StQf@b~)Mws0jAnUp7X0Oozl?81qYZSu^QURpzeIt@No}G|kdd zx}+xgXv?a&S8g#+8NFF$7Aj`BRWZ$63}dJ69xm=zjXe6?@;lb4)uzK_jJqopbnc(R zkXIR~_ObTDSDpEFIT9$1&jtBarL=SGaV&PV%i7i}sP1UX6(m=P^j`Q^nZ2Fq&9?0P z^!B_majET{6idy#m_ydbHeuI4uNr5qHXJL-93MCrNh1#}W26N#x%jG6ysjG9R{MDE z#m{|Og{(I%9BQlXuarQxF3y>lzt!T6&0e*0$*(JH=Z-$hEXWcf(be;^A2VWg?9yG0 zabJBIpL9x`1tLU@iCetM=;g}sh(|2222E8NaG66c5MgL0CD%sSHqQSQqqC97nW3;& zG|x(rDbOt~W8~3lF-S0FmF#D{eAIY+Xc9&-uFaP>8KTG@{~J@;@x-7WZ^gIu&5ojO z9aNYNBk6?^b`^2-mt8xV?~`n32a$2XKAH~UMQ-#w+Xcl4&up6045NXMI^AY}6D@Uc zMl=#cf9{L(mG0?8hiWN9woqeLHrPwCK`qT$i?C*9$kM`ts;zAa^s@VeVx)?=-rh2| zPhXr_Xas4N+qm!ICfX`Fo$=ULc>8 zGqKGBKT55Tx^2&0_?^glAuFTJ;jn>9hJo|kY?9TA&E&S<@xI9zq)ryS#(p+^wPxQp zt;$5?!6|kTcv08%$TNt+E6&lxYo=tgDbc}dEk9l}c|w5Fxr)o(dv`_$J;@fT{OHha z@(AKK(_kVC0Ft`9EJ_7a1T1Ozv97N@8x?Mo-FZz6&e; zcD($mR%d^Vh5r-T0I%-hUqQ#J?kH!}N2kS=$W!dZC9CeebH_ybbcwL;Z%>yYJv8Y2 zVX6?YT|w(B^a~$1yIe@@(*Duw>wT1dwLB_!cFm=PJ@ywC9Wovdjfo!aOoyQ-2_YFO zBKq!e5ShuI)cz0=6zmr4*?tVq zeX;>PttOoX)9G&V-snowHgKJxoemM3joVEq3xIiv8%$%~ZlaETdsnC-s|DbMr-7}B zTYBzELL2*jyU{v*(K^Q^qXlGp55D*UiNE#CRK7XtyT>}(su1EU{?f0Srv~|X;{qb% z?X3h3nVH4>+Ai?(4S5dj^TY~GGT!zn=T{}1mAZ-%##9f=binfQSW<7x0-h-c=-Jo zJSJZpI7=;zTv~UqxUV;(REeH7SiduDm};W$QBTtMlHO!!>8hb`xlDR_5jg%PM3p_> zV`{UB(P0+MkJ=9N%fOKOsb9?)1WX+rUEJ2jH9Jh*y)3bMz>a+9bLYjB0^T zCkkd;EYiuhu6Z<}e2xzf1m1Li-K96~*w;FGD<(4W{ICt-Vxz6*Glc4Tr)`w(aKr#c z*9g7m+#8g&`?op*$emDT4t}6ud}%U>#7M=F+Gi#>1r`s^9`>W>48wWLz6BOfIVq=; z%qC`j--S#OdxG}s8v4{^4hLpufMVqyI>SINH?W9pUDB;J0bWwynpJeMt)OOE{<`1z z(!GjRD5>T_v8_*GiPOGCefl$$_r9Hwhs3^Zkv67TmrCj&-(`=pS*N{2F2&|;BfT;y zlhb|XHxkE7{r!Ny=rBnu^=%tD?iSAoOQb1{B4f;?*XPYV<-TK+TQWU3oVR-5B07k# zMuE|8Z_W~0y-=5HYg_fz%Nk?kX6yFb5P`8(?qGjrvTsc3h}Y{U{z)ZCIxYS|kq_?* z>RxT8i{n#XP3E((yd+35kyq|j>r&?n8HB+|$#oVgy#r0c11?ChBE1kjIdhgw234b0 z-9|-|OAEUbJLzNA@M?{l&lw4uic}@;ga{4k4i;Iq`8RR#*4j#U8}BoRuavJs7YbrZ zF%!oiwv;qlReX?p?sc4o@sxY-m=`bU_L}dUxre2GMu(s z7RcaW=@sYh+HhfndFp2KgX8e)VSZEN9&)T8@3HtfEljs)!zMb8jjB`m4;^<)M&}M` zgCk*SxYRat_(Xe+3xC6Azfk4TJin(~XEZ9nZ`{#}xhl!FPqCk5E-8YvcSE+&@2@|d zq+*SIAB&?01a7}x=OfT+dXt2)NUkrCXNnZOUs_$h5akpVP0;=!aM#&YF&39`6(sZS8LLtc5Zbm z7(G9_K{!EX4ujOE>-|3AS2)t7Wu3Y;taK=%%Pu4&G&7y-H0z0O1Lt*5U7OBCx=#qB zboSN0xP0jDgd^jncQ^Yt5w;Q%p%Uh8Ec?ammr>Z}>sU7uq2 z{D${EO`(}45DA&PYROj(mV0~GwAC1(Nq}#}RD7^qPhn5~Wb8}4pI5Q;S8+qBL3&G7 zaEZNqafr;(4!Wh`Lf08MO-ha(!eL|1W@^7e=LWx$555JbSWt0`v7v^Sy1v4ZWC16=7@f{ou&; zoK~AmIz}L57zuF|InBSm?%UD4^L77*-sb|p=xFU6OTOm)vXwEGXFxspnz`5y_T*YK z0?e2PR~35Bcz8kVV19GnOzm6d{mI>^OQBh3?b$va?Oalu1z(nb9XI!}fl85rPjE8~ zKTJ5ABDEN#WI_&kkL)p@=av zh*dp$tj^B+++@=6`OYgqHaypF&3-+0O28)9u3Ya}Qe7Xy6YU$3%cM6H?FPu@@frAW ztVJNoWg{1zmvi1}z&(s^QTn?3Ce7})nhaHW@=k-E^;fO(=Hz3H^O0n8>}A${G5t-S z+0nT~3vEodf42d!?lt?8MtXAAO8wLN2e!((w8-<7T{b!>XJXmZtra0N7?crQCI`V( zV>X7^b?bKkix0da6ygH{k@|`&bcx7L81P4?Rinr(bW~= z9a^IzB&-zf$%j;`LA>R*`tA)Xi6nw^@pG8Lni9t85D{bJ3eV$!3o6P7Sq?Dk{rf7^ z;!3Ez(gmfG%=1M|-)Thiyf00ybLA_x=T~`+S?(M4Ir;3T#}?gf=$)!@pKz>v(v`oY z>si7bUg3M(hB(-I5kRF9#8YDEYf`{Q)OLnyJYQTV80kJ(qVb+lCfcctMptU8CmIuMf!wrru`4OATpT6L*%`O$*j(h^D{VZ&z~WEOQJBLwfxJkNY7!=fG9> z4?D2kn001r`$dPELAPCjixwel6#Ht*e0s~wi~RXzZ3)&}B_axll`^oap9jzO>j$4! z!6H+m;xokp{eA7Z?}tzx8=Kt{ua6$JcN@60c+!L)0p&^#tfGAdGKaY~+G=21;v@8e zDIOW&${644C?j%oIJ6*^U%O^m!?!K3x3CN!z0K!(jfu6$C&X1m$En8DKu9 z^`j~ZzIKd>Uw`;W{gAgw1wI=<$@ zN6JcW^j#Xg7#?flYE*jbyZx>{oJYddC7)*>j*-4=KL@jDl2kBYtji^~pVl?dD_;(g zsA`t`=E+UDnpQIRAmgjB#FAm>c#ag^Xl!jFxJy!ED~2(@b9n0-%(f2t`g*kV!TfZU zi+xmfNXLNEezVMK+Zk{H-w=8A`a-Stg>wIjfK`=!rZu%R;# z-ufK@cD4Z5%Te>`N6F{$JYgLD)C_yBw6)ptJ9EVLenR=v_k^U(8aygYqi|BonN*aF@oUAo;u`U4w}B z7)0PKdY^6~$sJ{|Ojo}{=Hd1@C}sb~=mt%E)>`oW$sIqLV?GKu`()v9^Y-EixkMp@ zGa~+}4nsMI3^VTyz?gA}U&T%#m!>4Dz-`%)J!y_5q zS9Ax^WJ>czUz43kRTGuUEn3sIPCi4`ZFW9DW`{p4t16MF_6kp-M=DQ|`9}H;6VK%k zNp;3(R}rMmoOdu;xE$m#1in5zZ0skHJ-=H^t1PX3*LS+k!75%%W};VS%g`z++;={r zxsT=yragPS^qRmd3X{TCNL=x<&n7!(Wc~S3O)A803y7wr=O^8CCQFl)a~6B%qjP#I zyx{%lcD`CA#B#9#jAX?9TH3gQYWuj9j}ao8jHV;38=Ev+3hVer*7bNu zDC8)h&_S@+HWTJzSfb`F@a?0Sn(dH9mzZU~C8h~#cU0xMXHxFzwjF17;gF4X!#n&? zHp`CYd>D(D-TrWDSZ2wPZf*s5Jjd46JI|<>^$Mb}*pWEI#A`R&dxz6c-~sF<<6@&+ zitE8zlUlX!ZU6(5&G1ZaH7qmPCvV%1*(1a%cir%d)P2a}virJgbY{m9i@e11I_X{g z@~_7S6vwJm$BVs|Goc%*%LkXzn^Rp})3;F14{5=o!=)tjEp+#f(i^RwZ{)&tCbUhs zEIwyT*q+wOL};Wx)*s(Y!#1{$Qmr7oQwv&R-!{a!F>{mcuongNe=z>vOq0Qj`5q(%MaTlt3o zI1S{jknOOsPc-dgIZ~-DTUCjDzJhp<4V#!PFWb_t#m#<|$eP_*gv-bs_6!;BD$tSd zU*~SM6g_8){|-Pe=HT87xgQt`5=5nEqBPTnQQllqk&TyU6P!yoH;ecL_jhiC+vNy$ z0x7y}W483)Vm4QV?)i3Y@YO`+C+#P4-s(pA9lFL4$B_hdOCL{ddX}0`&mM{>&>MSM zFh`C&s}}0NsbiQ(@*?wLqFt5o>*1>ydctWXh~Ib8(ZY=DvluaCv1Vr9vvkYmR8&eP ztaUD74&!Vw+LY?*ksnecpvID z0nz=Q?Qx$uo8#TWl4pyQ6WVGEe}$YYGf&2X5w zr&_mVdLZO!qS^LnAITgn!mr8EXN~eT`&p^@ziu9R00s1h&@1^(X4Za>L7}0}yWX)% z?R@ZurDsbsbSBIX7`y7s)szeu#2{EH_Xk%IG{AtF)-A*)9k0U$rsD zt~;lkx$yT?T$C1<{?B;<*=4bX!nY*S>vWy*TGkB+_@-r!P=X^2Sr?Zb{73z2B5u zDz*zZ`U;i#A|7vgOEP(mbE3<078ZEmsL>@DE1~UIk~!rt=_B*NoMDTYJu_JSUQaEv zGDWA1!x#j^wBgjMe6&V|t|7gy$dy;>tM4;d3K9 zhR?ta-MFz_?k57Y)64VXBBRfdv@+3d>*%=*&2DiSEPOb4=qM9Sr|2ipUGhAE#h|9B zur?Kv`(8paA9=Yr*AOfj)_^FSwA*-Bmc+zSqxbws%*s67O1@o9YGY}muNosG+QCl+ zZxLmJEIrj6eqH{8PGXAj9MIr{0l56nbVs%p?ZmHpHbH&0Jg-`cIED><2EE;hSG&Yk z{bP(OmVC_ZvFL|)6*@E7KCaF=>P%keCp)eNfwsqd0Kj5B7`;DhmK$y{G!g4#3`gDh z7JFPy7yqY@k+V^e>x;^zSLDnbE7=+oyA4ZJ^9-Y2MJOMPk?WAf-GH&a*1HFBtn|Jxw{>E+5jEWi}D&4}Ww~vgV5VuHcrL}4!q*f$ zqJE2{mCqc^|6+FQsX@OnQ&So~TF&6^cOQ4@yYu>+a$plJy9Hqf2YZ!*8xt3IrAv+Q zvW3o(Q1_73@rU+)Y(0vwE3sx)sGcv()?5mr1JCAF&W5M64;w&ATu^7I=Agri4i!Ah zrTxO3LnFC%>`czO;@<(d77LJB%{LV&-hy%D)^;%r+BY+KJ|E*Va2DSCVn{=e@Hi~V zZk8CEpBI-9uZ2x-jf178H@`^p#Ck7x2wB!6XuyvyU^b3@Vd>sfSvu7SUWv40^O$X}JKehZ4>vm}hPy7` zbafx|O{_ZaklxQLVXrgVVUp}qdW+ML#!TT>P-qODZ5)t3KKOl+VOuw+>EfOo}1X8^Ybt>n!2PWCPfv~oY36+S3Zm` z8532jcXzd-OCN0R_wjmLZGonkdp^=VD=z@jZU@fDC&37aRRYv11dnM0e;ROZ&T|=l*N!1Z$-R_Ih8`5!+R>rPG zAtfh?Yj4mw-!5dh9~0KH5l7-6UuC0_$Z+H)enT+&{+>v!sVy zKxr`n#nzzUd~0U*YNZ+5P;1EK!m?kjG==2_C4nx{dq*`+JQ3-h!$^$wMCsn1oVN49 zS9xZYpra>W59p_MQmNE{bAD&9H56YunW%l)k+}7TbL<`6hjT`l;;UsL7n02vOXcFx zWG?as4oIQ?XL`aL&U#JDwagGn1A_hK%^u(^E{LZ>!B?^g<~eJOj?b}O^WNx4qBAtD z@%B5oq?Zt3H>MpVWKDI=!$TZEZr2w>bCCC_q**9xe3Rj=Qi44$XrtaP)YJq zWi-2a_gfzOU>*W7&oMWDmy3Gsr;cKs+48KCL^)e>9#OmhgW>~R z1ZH+x8DdW7@w7*iva-5Y{<;*OiX`hLxepV;0)lGavYGgZikV8te7oK?29ALvn8q_P z50_o7F}m`@qbseh%sF$$i`PCiyD&z~-JzHW)gAq&{zgb_nh?QiATRh~Z%wvK1|_+x zrkvjL5Q%vK<#87|@F7-ayHfguuEoF-edB6q3BBXaqvmw7uF_%F=cUck`6{0_RXBdmF zkqS&Rk_T}Yn;vOOtOQWWygPf%Lt!~j8=l-n6i;vDb7hDE9TWovGnU+W~rn`{O?Ogy`n$emO{_1p;Gfecbv$jF<1G`n*^!KY|oS72RJV@Eu~CA&RFIE6`@ zaL|{8<#t!12uU-|!o+iss7$j^nXHDp9VNr2iKiUS1qTyF5M#!`4r$V(37;9DE3|Ls z_+iao?b5$W6>L|LNy0q4cC8bc+!VW|G2Ve4U1M~FH9E#VJW0++FRfo2ZO`8Ue}p-W z>7frOc)J9Qr@f}7VeM^{*L}v{qK6QxAFE#q!)uR^_KP=G_S0Il4>8Job7orNep`dX zo-D=3bcnR${q^>?6=9Pw>FqB7sI%HtWMZ(m2^^cIA-6|FjGT6(J*mIXCHr+%K6v|; zqX_b~F*aQaBbKuAVqtX7IGpq@m-7S8*%rA_x4tZ^Zx-=v)1_{?BRkxyJ99?XNt7a; z0>NB!Zd;2b!$!#{wH!7HNgkz}Sm4Q1ajxZAC|$Bc&T?hHJw&K7^Xt{x8L>zD;!Qrl z30rozrbX8d36sajBWnPTv)d@L6Em)=ovR`3TY*q16wEHqB_G4bZW8UTy|*txs-njh z?LV%-WluTHm9v0K6kZ9EOQ|H0+Z3~1KsX?si2W-nRD^&@i;Sz53K7vefWXYbH5bka zx@}1&UFGwSOmwJl^i_&FFmj9*+E@lgU)Z{@h1!lEA7O&J&Wk-ntrc!=7*|_9yl!q0 zB(wXi|4Ha@k=YV=r_@1H*N{ALcB<9~gn^+2>*-(tw*>2^s~ht^b}vc>yVyPp+%;iS z78-K)k>RqsCfg%d5+|`x+{{o#L*U1keLOLWm5Z3fP5_lAF(Sx5!bkd^wlHL=pt-FO zj_UF+mvL#05&(uM7^K>5!koSt30cM(#>t*CQ3Rr*o{v71*;^K&GU_fNHGHRhg@lCl zNR%}mZlobxE`*^f1nC_dFzA~{)@<)F8aZV}xE>r(u$6MS5kE~GaFXXK)L=uv=jr0B zAK8>i=yx0*O;W8Ve@&8+M(q&Ers@;JgW~dGRv#W=o-ve%)c08BrUnhd{PSjq2Ycq_KD7RV0!&OrK z^?bvQF*C8~YRp8pAF;iBd>At1)OAzCLBu`40r<|N`B0>dJH?lcq03N2Ss1s6!OF`1 z9hp-q2rQdW-b-cM6^uVlq}!VWsG+6AQ({5bIioCV+P13Y+k(@lKo8hOH*KNN*G$nX zkjXz`J`s5Qlb)c=ePtoU(Gg#Ko{dtgdATti!%WJX-en_-t*tjt` z$itPGb80;dq^T>r#5F)n+MKgy(W6BSMVPlwpoY`++m1 zC^|ilKLwkvm=*W;-ymur_ulA)qr)4*RIOk>N1sV6pNDlIc)tkJo~{B=_vIfNP&yn^ z!cORQS1afYO%qRfzMZ=TOa5S>iSk{HN`@RYewe!>efl!Mp*9;os>(SNn5T-<*7Y4_ zc2?m{vpRP$9V*ceSbqe}dm;Xn(a5|?R@Rfq_&2BI6s)pAYSeFD7#?f_F=xObI=XMY zoi}oC6OFvY+bQIdS_jUrj#w$%SaIp^glCALyehxy^c8E=y0!xV!S4<1!Z&a+3Hyy2 zI!-d1ECLK&ELqP^RQCz?KTNunWd2UDOVlhgY_Dzr2{~=AC8+t`M!rkS97cov=@ogDMt_e8 z9#%mq5aJw9gw%>9Zk>Pxpc=PDAgh!(>+yX(euy`OS=QDo8DQ1u|Kr)7P0>_vn;FT$i#KaDjgvcn| z{6FIaNNRk6;Fbj-vPnCUl*D(q`R5@ab}$I^P&=h6`j16I?WsA0TpQBx?2-UF3%KG2 zW&%fW{t*kYs|!bqVkg5fL`r*S(_Q5YpRlyFx30C!RcmYLxd1B!uC%5Mp4xo4tr9 z>Px5AJU{4wQc0pz?2F5G@lXu}Tsb#owLAbXN zLI*r95d!P;#_d=vJsK%d3HmGRczm9ifk)kD^N-onYs(+?6!Zy+lH%yMCy$qI;0_J} zSi$j^q45YV0V}wy5qaEpewKo4LiozK3+}BxQvrQ16}r5ShomVGw$275hT;})?l~Y* zW<0%)+bkKlfv{!zydRH7g#eO6T1&WP3km?j7UOw)aojPm_!dAiAvg$7- z;MpbdtIHhGuaQ<%xVK3rs0$?XUlAH$;J?5dpmfT!B22i6>R$@?{I!i5+J6tuz%5(? z=o4b4EbBNQw;yJFI%Pl$zh=0gtdgW{+B?NIieZG63cO0I0(Dm#cI3DO{%y}Nl*jOs+>(Co=9Vd&1`3bk$5aF4bW=HfH3{( zvc-Db7&VaDD6drF&P6>6Ko}oyL3iMesDwnh=b|(;!IjJSv@b^<#UK`sS8%RS4FDT( zy$Zp@9ta50jBo62!DkLb8Kb-Q5@MS!LyGUJSr`+U=o1~yR5Cfqj z8MrHCkO4r_u5|=Yg>)9E7KN!1T6h$%43Olxx{p_6K-hhn7>GOU+F`@)O*34rKOiOs z4s{!wNpn2AB!CW)D9sFE5Xv~S3n39Dw#5Dwp|#zD{{nA-($5sA;I>=$t^-hd`tEx=Hmyt@*U!hrf+dPyvX6vOO7iYz+dCTth0| z41y7Ob_q(c19IfDStvdu3c%XruL!NM^;dWUl+N<3A2-nyDFANzmBpgkX3ln+GvKyI zYOKd6j7iSoHV$GkKnuTSxKU#g^H*>?Jei;zwlQ@SroesO*kx>ET57~XiYNb(0otM| ziVMKA31B^-F?EAp!vnssVYT{4p%@-lfC5FCU*vnrf8GVaL?DLaS!KYQp>o)2kIcdu zkA}|x6_5mhQylK?givFf)VQW=xKjj64-9}FO58{AxEb}cKR{VDk@$s3&vDZt5<%}2 zg_}J}Y%xmMl7S~N$zuV}-@b|Bwgd(&YDQqLiAQj3Kra~j$2InU(%HY#2Au)oA>#{M za@?Nb@*6-hB77RRbf3Kd;^CQamD5fM|6@YXP=KVwMW^@pLa>x zPvuKUl%8?+;Zr=jq<&_SqGf+vmWq3uEIkC+s{9v(2Bh*|;jQhK2*D_x_fgC%fM$Pf zqfX_7MRESPg-Z;0e|m;nn1lk(3;|TEziPPYq2i*dcou7<(A_BYFcZLIxc7cEsS@}5 zptv{jfFi2xLAR+lZqucnSI3rdzp@-hqG9ppHQeD<{WTEiTv^b+Fs1JK;_>W|=j z@dFw4$9q5?5f694lg)bpV7PpqGZ=RlMM%Vi?NQ~8@VGnyz?{+pHT-hZ#a3}Ex{6e| z1x(8gn0bBOD?EWl3W#mPscCosAaXkDDxNDN-*J23M|q$MV!r8vJ2t3)24cgnFy;^6 z;y~l68~p*yjN+`YB<|3>Kto-XE3bGRpTt-^4ER5P#baq<0Q*u(dw9IX6sn*b?qn zmTS93p9QwXZIuI@fFCERSK#Sp6oA|pG$165+mIHpNQWv15|4+bfwByFojlBNTgVHL z6wse)sfplmcu)#}=0ybHm)j+5)wUSfhX;=&AqPx^CGSr>ewq(tge@gBo}&dKYykNp zB#1|Dmw^DHqa=e{RkR#H0QnWhChe*<_V6ea1k{N{j+CdrQ3hK$LcIX?7o+>|9Cwib zKpx#2@H5=(4{!nO=STVC_7)EHlmV^D$yc{DicWW)Wbcv zckodMsM&r&0YJlMI604ZqZPoxLROxyIBtEu06~FFOaBW>Q2zu^#iIij_4hA?9D<63 z?&2|9x*yG{JvS2`Ux@-7exRiZ_h177v;sK%+bsQs^tyHHHR7O|IfD^8sc z`=Q1Z4s2w5C&Y_;tKv6+FvzDY)ZjLA4lE|cqT7H+yaE6wmDJmZ zM^_{OE>A}c*2T@giyS~wKz|PpNfscq`I}PW)&aDOjBLV9PT2%ENm`%xo}uxO^atKmNJ43gXO~!YYUS1D!*I)=MLisF1Cn}%7(8x31GvGj2+bmr!e59R zj~lSDZ2XD_u(7SD1&^WqaQLjOl^Su}3Vi{R#m2T@Fprdh_%1xw@d9)QTeUR}e#9-_ zc_3y1qi;z>{qeZv`+yASM}uu1;=Wt#DsRiw!h1pPKOCbL>E;x$;}w z3hqsC{0?-QtXd&>=6qCvBss3gkHl@{>Hs)q$oo{+44<~Fuo+7LxrIB-5I|Xh;C3Fr z;NF8cITOdl?o{Jp?*-N!QW)?IZzWv@+@a{{9`4#Rg#cR~sZ-(+To+LIxM@H1!=q9F zxicX6bOSg4J$l#}5{Sm#?n8+H7>xoX^cx;O1!^sX-kn3-B-OFV9pT4Ucx=rIC;}z8 zGVmOlk^}Q@m-#>9*(E5&8Ay?HdyBXWPoQuEaALz>5gLFK{{nA-(h0Qg;kMkAB4FO_ zR~7?6XOdtW1)}5b37_WC$1!iu_|0~8{&pjh`FEl}-m$zP3M6rPY|9eJF`rk>oxP%l ze5^w<{ED0_F!1uCK6PdGVqhSxY(xp+2bRx$L>GTQ_h*{QUKGl+yE7@FH42h3vAXMR zzfwL|wd~yuIgXRW_*}rP?N`642fn%yt%C30y%EF9Qwds zKRhVG)1N&dQ%ICNFZdWYRrTT*#jOv5Z1D6!4b!iI`lnO>_eE2H8A5saUKM<+ z5d(S%eD$aHBYYqaAi2xP6ug3)CrSs{o42vS!=5RjbtJ{v!E3nH^@@$fZvFYd03Hyt z9w`4v0&MWii8TNK8dGS3I3AVi0_C5ndMEBq$W#;{+3-m7HSV-c0?ho;o&O|;J9M81 zAV)V*n+3cg11e5gAw0JB6{t8b$g42nCP~Y!Zo^R~i)WWF>Uv0&nC|7L;&^lI4*}3} zv)DP+rzGI+H0qucr>QXiiU!8M{mMplJteLQx&FKT{{x|`12crFsgrbg#70PTkB;L( zL-^uH+=u`c+fx9ry^piF$?{)=_C3Fyg&X)KBx)r0n6)c_>En^xXJREvn5P7{Xf$rB z>Hy}I+A>s(53gvr$nkQ1`SYX}UaYVW0Qa(ZaNE*(O&|z9`6~<0L;x#EnhLLmrU7pE zyOIF}!G=FHLvTCR1M(!R5V}Tz)u%bXT)lS~0YHSR$}tnuuU z_!YbQ!WCnw65MJ6rGT)>>dOF*2g$H{dc}oJR==PDz^UHg-)LPM;%i$Lo@h@5#Ahaw z(hNLeqrMUY;$(RBSnVcm@lpdS9s5RfM+kQWfqo^AdTsDX>Zipx#XXMoBHsaP&*!Y^N^6pms!%h!0pmbw!S2} zla-)46_G`ERqkuV62pnFuY?h4S}rjP#9q7J85BzQkts~1CC-f}{ID!V(85wMeYnG- zw`wQu&63PjeQhHKMs3)2gh<|qtB=)*MS!Py!a$=`<@<4>Cqq4yhCa@@PVo-7^)1^( z*afoSPoVAO^PF!IjTd!b^x)WJiBHJIpC-F58KsQh>CLa(Ik`ALl(^3Zu}fNe(U4O1khFBTAlrWdNe8Sv5>OeK#ObjhnyPup)4lb-47!7+PbwTFd zq+1lyRm6>mGs!7o!+HgA;$9YzsVVebaqAg2&XZFSP<@iVKm?M?$Nea{M<1b)TzCJX zLU*Hzvy2a^?N1K<84P{*5?*=M=_hdK0a=<>E9V;vHuW$f>y^ya7e9w$Hy*&s^L*Z) z?7KmoM9vpP6+eATxGcoqOQJzOvuX7CCl>`B6ZPG~I82{ES?}4cxzIkm$Km}T-EDb)Q3NZ zX|A8t3n+yesxiI!%-F@{hMl$fCNTpeV&%Y^L!eJhNz$Z8cpvcebJ$w^qive)TYQ15{33Sre6&V@~tgJZLqmcG36Uy>+bT0 z*Bh=|p2*Cwe(f924#+UbuEA z2W4Dz!}tg`1H4tCz{TtRUPbj(aQ+07U$u|3?@|pZJggOTyz)q3`Y%*&NEi k*#h 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�)9=YLp6 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 literal 0 HcmV?d00001 diff --git a/docs/site/static/img/developer/getting-started/token-transfer/minting-token.png b/docs/site/static/img/developer/getting-started/token-transfer/minting-token.png new file mode 100644 index 0000000000000000000000000000000000000000..ace884db687c174c412c6e5fa713d493bd78e99f GIT binary patch literal 66737 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 H#-8~P=^_3G literal 0 HcmV?d00001 diff --git a/docs/site/static/img/developer/getting-started/token-transfer/transaction-successful.png b/docs/site/static/img/developer/getting-started/token-transfer/transaction-successful.png new file mode 100644 index 0000000000000000000000000000000000000000..a5009e6a40181ae796267d830c6979dbe8a279ca GIT binary patch literal 89614 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 SirRf=iKj}(O>t! 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 + +
setOpen(false)} titleCentered /> + +
+ Migration +
+ + Fast and Easy Migration + + + Migrate your tokens to the new network to enjoy the latest features. + +
+
+
+
+
+ +
+ ); +} diff --git a/apps/wallet/src/ui/app/pages/home/tokens/TokensDetails.tsx b/apps/wallet/src/ui/app/pages/home/tokens/TokensDetails.tsx index a18197dd603..4f43fd61a5c 100644 --- a/apps/wallet/src/ui/app/pages/home/tokens/TokensDetails.tsx +++ b/apps/wallet/src/ui/app/pages/home/tokens/TokensDetails.tsx @@ -23,6 +23,10 @@ import { TIMELOCK_IOTA_TYPE, useGetOwnedObjects, TIMELOCK_STAKED_TYPE, + STARDUST_BASIC_OUTPUT_TYPE, + STARDUST_NFT_OUTPUT_TYPE, + useGetStardustSharedBasicObjects, + useGetStardustSharedNftObjects, } from '@iota/core'; import { Button, @@ -38,7 +42,7 @@ import { Network } from '@iota/iota-sdk/client'; import { formatAddress, IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; import { useQuery } from '@tanstack/react-query'; import { useEffect, useState } from 'react'; -import { ArrowBottomLeft, Info, Send, Vesting } from '@iota/apps-ui-icons'; +import { ArrowBottomLeft, Info, Migration, Send, Vesting } from '@iota/apps-ui-icons'; import { Interstitial, type InterstitialConfig } from '../interstitial'; import { CoinBalance } from './coin-balance'; import { TokenStakingOverview } from './TokenStakingOverview'; @@ -47,15 +51,17 @@ import { MyTokens } from './MyTokens'; import { ReceiveTokensDialog } from './ReceiveTokensDialog'; import { OverviewHint } from './OverviewHint'; import { SupplyIncreaseVestingStakingDialog } from './SupplyIncreaseVestingStakingDialog'; +import { MigrationDialog } from './MigrationDialog'; interface TokenDetailsProps { coinType?: string; } export function TokenDetails({ coinType }: TokenDetailsProps) { + const navigate = useNavigate(); const [dialogReceiveOpen, setDialogReceiveOpen] = useState(false); const [dialogVestingOpen, setDialogVestingOpen] = useState(false); - const navigate = useNavigate(); + const [dialogMigrationOpen, setDialogMigrationOpen] = useState(false); const [interstitialDismissed, setInterstitialDismissed] = useState(false); const activeCoinType = coinType || IOTA_TYPE_ARG; const activeAccount = useActiveAccount(); @@ -70,6 +76,9 @@ export function TokenDetails({ coinType }: TokenDetailsProps) { const network = useAppSelector((state) => state.app.network); const isMainnet = network === Network.Mainnet; const supplyIncreaseVestingEnabled = useFeature(Feature.SupplyIncreaseVesting).value; + const migrationEnabled = useFeature(Feature.StardustMigration).value; + + const OBJECT_PER_REQ = 1; const { request } = useAppsBackend(); const { data } = useQuery({ @@ -109,30 +118,59 @@ export function TokenDetails({ coinType }: TokenDetailsProps) { refetchInterval: DELEGATED_STAKES_QUERY_REFETCH_INTERVAL, }); + const { data: supplyIncreaseVestingObjects } = useGetOwnedObjects( + activeAccountAddress || '', + { + StructType: TIMELOCK_IOTA_TYPE, + }, + OBJECT_PER_REQ, + ); + const { data: supplyIncreaseVestingObjectsStaked } = useGetOwnedObjects( + activeAccountAddress || '', + { + StructType: TIMELOCK_STAKED_TYPE, + }, + OBJECT_PER_REQ, + ); + + const { data: basicOutputObjects } = useGetOwnedObjects( + activeAccountAddress || '', + { StructType: STARDUST_BASIC_OUTPUT_TYPE }, + OBJECT_PER_REQ, + ); + + const { data: nftOutputObjects } = useGetOwnedObjects( + activeAccountAddress || '', + { StructType: STARDUST_NFT_OUTPUT_TYPE }, + OBJECT_PER_REQ, + ); + + const { data: stardustSharedBasicObjects } = useGetStardustSharedBasicObjects( + activeAccountAddress || '', + OBJECT_PER_REQ, + ); + const { data: stardustSharedNftObjects } = useGetStardustSharedNftObjects( + activeAccountAddress || '', + OBJECT_PER_REQ, + ); + let hasSupplyIncreaseVestingObjects = false; + let needsMigration = false; if (supplyIncreaseVestingEnabled) { - const OBJECT_PER_REQ = 1; - const { data: supplyIncreaseVestingObjects } = useGetOwnedObjects( - activeAccountAddress || '', - { - StructType: TIMELOCK_IOTA_TYPE, - }, - OBJECT_PER_REQ, - ); - const { data: supplyIncreaseVestingObjectsStaked } = useGetOwnedObjects( - activeAccountAddress || '', - { - StructType: TIMELOCK_STAKED_TYPE, - }, - OBJECT_PER_REQ, - ); - hasSupplyIncreaseVestingObjects = !!supplyIncreaseVestingObjects?.pages?.[0]?.data?.length || !!supplyIncreaseVestingObjectsStaked?.pages?.[0]?.data?.length; } + if (migrationEnabled) { + needsMigration = + !!basicOutputObjects?.pages?.[0]?.data?.length || + !!nftOutputObjects?.pages?.[0]?.data?.length || + !!stardustSharedBasicObjects?.length || + !!stardustSharedNftObjects?.length; + } + const walletInterstitialConfig = useFeature( Feature.WalletInterstitialConfig, ).value; @@ -229,8 +267,34 @@ export function TokenDetails({ coinType }: TokenDetailsProps) { {activeAccount.isLocked ? ( ) : ( -
-
+
+
+ {accountHasIota || delegatedStake?.length ? ( + + ) : null} + {hasSupplyIncreaseVestingObjects || needsMigration ? ( +
+ {hasSupplyIncreaseVestingObjects ? ( + setDialogVestingOpen(true)} + title="Vested Staking" + icon={Vesting} + /> + ) : null} + {needsMigration ? ( + setDialogMigrationOpen(true)} + title="Migration" + icon={Migration} + /> + ) : null} +
+ ) : null} {!accountHasIota ? (
@@ -243,22 +307,6 @@ export function TokenDetails({ coinType }: TokenDetailsProps) { {!isMainnet && }
) : null} - {accountHasIota || delegatedStake?.length ? ( - - ) : null} - {hasSupplyIncreaseVestingObjects ? ( -
- setDialogVestingOpen(true)} - title="Vested Staking" - icon={Vesting} - /> - {/* Add the migration overview here */} -
- ) : null}
{coinBalances?.length ? ( setDialogVestingOpen(isOpen)} /> + setDialogMigrationOpen(isOpen)} + /> ); diff --git a/apps/wallet/src/ui/assets/images/migration_dialog.png b/apps/wallet/src/ui/assets/images/migration_dialog.png new file mode 100644 index 0000000000000000000000000000000000000000..909df0184a0ca21fc64de0b902dd5742861fe3ab GIT binary patch literal 129961 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 W$X7C|^u;60OI}7rx>C|O=>Gt - - - - -

- - - - + + + + + +
+ + + +
+
+
+
+
+
+
+
From 11e2283d8b9e2db1ab59488abb41e634ef7dc6a9 Mon Sep 17 00:00:00 2001 From: Thibault Martinez Date: Thu, 30 Jan 2025 13:00:39 +0100 Subject: [PATCH 37/51] fix: build release binaries with the `indexer` feature (#5083) --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 4f6d7ecb806..8606a1d4735 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -149,7 +149,7 @@ jobs: shell: bash # Currently building in release mode, but we could also have debug builds for testing run: | - [ -f ~/.cargo/env ] && source ~/.cargo/env ; cargo build --release + [ -f ~/.cargo/env ] && source ~/.cargo/env ; cargo build --release --features indexer - name: Rename binaries for ${{ matrix.os }} shell: bash From b2974a2af7c95be2c45ccacbce8282822f38f2c6 Mon Sep 17 00:00:00 2001 From: Thibault Martinez Date: Thu, 30 Jan 2025 13:30:47 +0100 Subject: [PATCH 38/51] chore(ci): add ci label to labeler.yml (#5077) * chore(ci): add ci label to labeler.yml * nit * fmt * all of the github folder --- .github/labeler.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/labeler.yml b/.github/labeler.yml index 8617b1f2474..cac57e08b0b 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -38,3 +38,6 @@ tooling: prettier.config.js turbo.json vercel.json +ci: + - changed-files: + - any-glob-to-any-file: .github/**/* From 700958cb6a4a6a772809e12786c51d4087e8092c Mon Sep 17 00:00:00 2001 From: DaughterOfMars Date: Thu, 30 Jan 2025 07:48:47 -0500 Subject: [PATCH 39/51] chore(CI): Merge turborepo workflows (#5082) --- .github/workflows/_turborepo.yml | 75 ------------------------- .github/workflows/turbo_hierarchy.yml | 80 +++++++++++++++++++++++++-- 2 files changed, 74 insertions(+), 81 deletions(-) delete mode 100644 .github/workflows/_turborepo.yml diff --git a/.github/workflows/_turborepo.yml b/.github/workflows/_turborepo.yml deleted file mode 100644 index 7d4c7d6142b..00000000000 --- a/.github/workflows/_turborepo.yml +++ /dev/null @@ -1,75 +0,0 @@ -name: Turborepo CI - -on: workflow_call - -concurrency: - group: turborepo-${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} - cancel-in-progress: ${{ github.ref != 'refs/heads/develop' }} - -jobs: - audit: - name: pnpm audit - runs-on: self-hosted - steps: - - name: Checkout - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 - - uses: pnpm/action-setup@fe02b34f77f8bc703788d5817da081398fad5dd2 # v4.0.0 - - name: Install Nodejs - uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6 # v4.0.4 - with: - node-version: "20" - - name: Run audit - run: pnpm audit --prod --audit-level high - - build: - name: Lint, Build, and Test - runs-on: self-hosted - steps: - - name: Checkout - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 - with: - fetch-depth: 2 - - uses: pnpm/action-setup@fe02b34f77f8bc703788d5817da081398fad5dd2 # v4.0.0 - - name: Install Nodejs - uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6 # v4.0.4 - with: - node-version: "20" - cache: "pnpm" - - name: Install dependencies - run: pnpm install --frozen-lockfile - - name: Manypkg Check - run: pnpm manypkg check - - name: Turbo Cache - id: turbo-cache - uses: actions/cache@3624ceb22c1c5a301c8db4169662070a689d9ea8 # v4.1.1 - with: - path: .turbo - key: turbo-${{ runner.os }}-${{ github.sha }} - restore-keys: | - turbo-${{ runner.os }}- - - name: Lint - run: pnpm turbo lint - - name: Install wasm-pack for mbf package - uses: jetli/wasm-pack-action@0d096b08b4e5a7de8c28de67e11e945404e9eefa # v0.4.0 - with: - version: "latest" - - name: Build - run: pnpm turbo build - - name: Test - # @iota/ledgerjs-hw-app-iota is tested separately - run: pnpm turbo test --filter '!@iota/ledgerjs-hw-app-iota' - # Pack wallet extension and upload it as an artifact for easy developer use: - - name: Wallet Extension Has Changes? - id: wallet-diff - continue-on-error: true - run: pnpm dlx turbo-ignore iota-wallet - - name: Wallet Extension Preview Package - if: steps.wallet-diff.outcome == 'failure' - run: pnpm --filter iota-wallet pack:zip - - uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 - if: steps.wallet-diff.outcome == 'failure' - with: - name: wallet-extension - path: apps/wallet/web-ext-artifacts/* - if-no-files-found: error - retention-days: 7 diff --git a/.github/workflows/turbo_hierarchy.yml b/.github/workflows/turbo_hierarchy.yml index eea642d664c..2f26db064c9 100644 --- a/.github/workflows/turbo_hierarchy.yml +++ b/.github/workflows/turbo_hierarchy.yml @@ -34,13 +34,82 @@ jobs: uses: "./.github/actions/diffs" id: diff - turborepo: - uses: ./.github/workflows/_turborepo.yml + audit: + name: pnpm audit + runs-on: self-hosted + concurrency: + group: turbo-audit-${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: ${{ github.ref != 'refs/heads/develop' }} + steps: + - name: Checkout + uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 + - uses: pnpm/action-setup@fe02b34f77f8bc703788d5817da081398fad5dd2 # v4.0.0 + - name: Install Nodejs + uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6 # v4.0.4 + with: + node-version: "20" + - name: Run audit + run: pnpm audit --prod --audit-level high + + build: + name: Lint, Build, and Test + runs-on: self-hosted + concurrency: + group: turbo-build-${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: ${{ github.ref != 'refs/heads/develop' }} + steps: + - name: Checkout + uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 + with: + fetch-depth: 2 + - uses: pnpm/action-setup@fe02b34f77f8bc703788d5817da081398fad5dd2 # v4.0.0 + - name: Install Nodejs + uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6 # v4.0.4 + with: + node-version: "20" + cache: "pnpm" + - name: Install dependencies + run: pnpm install --frozen-lockfile + - name: Manypkg Check + run: pnpm manypkg check + - name: Turbo Cache + id: turbo-cache + uses: actions/cache@3624ceb22c1c5a301c8db4169662070a689d9ea8 # v4.1.1 + with: + path: .turbo + key: turbo-${{ runner.os }}-${{ github.sha }} + restore-keys: | + turbo-${{ runner.os }}- + - name: Lint + run: pnpm turbo lint + - name: Install wasm-pack for mbf package + uses: jetli/wasm-pack-action@0d096b08b4e5a7de8c28de67e11e945404e9eefa # v0.4.0 + with: + version: "latest" + - name: Build + run: pnpm turbo build + - name: Test + # @iota/ledgerjs-hw-app-iota is tested separately + run: pnpm turbo test --filter '!@iota/ledgerjs-hw-app-iota' + # Pack wallet extension and upload it as an artifact for easy developer use: + - name: Wallet Extension Has Changes? + id: wallet-diff + continue-on-error: true + run: pnpm dlx turbo-ignore iota-wallet + - name: Wallet Extension Preview Package + if: steps.wallet-diff.outcome == 'failure' + run: pnpm --filter iota-wallet pack:zip + - uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 + if: steps.wallet-diff.outcome == 'failure' + with: + name: wallet-extension + path: apps/wallet/web-ext-artifacts/* + if-no-files-found: error + retention-days: 7 e2e: if: (!cancelled() && !failure() && !github.event.pull_request.draft && github.ref_name != 'develop') - needs: - - diff + needs: diff uses: ./.github/workflows/_e2e.yml with: isRpc: ${{ needs.diff.outputs.isRpc == 'true' }} @@ -52,7 +121,6 @@ jobs: ledgernano: if: (!cancelled() && !failure()) && needs.diff.outputs.isLedgerjs == 'true' && github.event.pull_request.draft == false - needs: - - diff + needs: diff uses: ./.github/workflows/_ledgernano.yml secrets: inherit From 9ae75f4c38fcf1ec65e59462f175f0a826918a07 Mon Sep 17 00:00:00 2001 From: Lucas Tortora <85233773+lucas-tortora@users.noreply.github.com> Date: Thu, 30 Jan 2025 10:40:24 -0300 Subject: [PATCH 40/51] task(devx): Add Tags - Core Protocol (#4991) * task(devx): add tags - Core Protocol * add missing tag --- docs/content/about-iota/iota-architecture/consensus.mdx | 1 + docs/content/about-iota/iota-architecture/epochs.mdx | 3 +++ .../about-iota/iota-architecture/iota-architecture.mdx | 1 + docs/content/about-iota/iota-architecture/iota-security.mdx | 3 +++ .../about-iota/iota-architecture/protocol-upgrades.mdx | 3 +++ docs/content/about-iota/iota-architecture/staking-rewards.mdx | 1 + .../about-iota/iota-architecture/transaction-lifecycle.mdx | 3 +++ docs/content/tags.yml | 4 ++++ 8 files changed, 19 insertions(+) diff --git a/docs/content/about-iota/iota-architecture/consensus.mdx b/docs/content/about-iota/iota-architecture/consensus.mdx index 253688f9952..f80f50bac8d 100644 --- a/docs/content/about-iota/iota-architecture/consensus.mdx +++ b/docs/content/about-iota/iota-architecture/consensus.mdx @@ -2,6 +2,7 @@ title: Consensus on IOTA sidebar_label: Consensus description: Overview of the IOTA consensus. +tags: [core-protocol] --- The basic purpose of consensus in blockchains is to agree on a consistent order and ensure the availability of transactions. diff --git a/docs/content/about-iota/iota-architecture/epochs.mdx b/docs/content/about-iota/iota-architecture/epochs.mdx index bfbbb3ade6d..24cfc0f33a2 100644 --- a/docs/content/about-iota/iota-architecture/epochs.mdx +++ b/docs/content/about-iota/iota-architecture/epochs.mdx @@ -1,3 +1,6 @@ +--- +tags: [core-protocol] +--- import BSTInfo from '../../_snippets/info-BST-2f1.mdx'; import Quiz from '@site/src/components/Quiz'; import {questions} from '../../../site/static/json/about-iota/iota-architecture/epochs.json'; diff --git a/docs/content/about-iota/iota-architecture/iota-architecture.mdx b/docs/content/about-iota/iota-architecture/iota-architecture.mdx index cb0593c5a35..f940dda076a 100644 --- a/docs/content/about-iota/iota-architecture/iota-architecture.mdx +++ b/docs/content/about-iota/iota-architecture/iota-architecture.mdx @@ -1,5 +1,6 @@ --- title: IOTA Architecture +tags: [core-protocol] --- import ThemedImage from '@theme/ThemedImage'; diff --git a/docs/content/about-iota/iota-architecture/iota-security.mdx b/docs/content/about-iota/iota-architecture/iota-security.mdx index fb3a3a36057..a00c8120850 100644 --- a/docs/content/about-iota/iota-architecture/iota-security.mdx +++ b/docs/content/about-iota/iota-architecture/iota-security.mdx @@ -1,3 +1,6 @@ +--- +tags: [core-protocol] +--- import Quiz from '@site/src/components/Quiz'; import {questions} from '../../../site/static/json/about-iota/iota-architecture/iota-security.json'; diff --git a/docs/content/about-iota/iota-architecture/protocol-upgrades.mdx b/docs/content/about-iota/iota-architecture/protocol-upgrades.mdx index 3e98b4030d9..0f896ea5939 100644 --- a/docs/content/about-iota/iota-architecture/protocol-upgrades.mdx +++ b/docs/content/about-iota/iota-architecture/protocol-upgrades.mdx @@ -1,3 +1,6 @@ +--- +tags: [core-protocol] +--- import Quiz from '@site/src/components/Quiz'; import {questions} from '../../../site/static/json/about-iota/iota-architecture/protocol-upgrades.json'; diff --git a/docs/content/about-iota/iota-architecture/staking-rewards.mdx b/docs/content/about-iota/iota-architecture/staking-rewards.mdx index 028b4aabb31..17509fe6ee2 100644 --- a/docs/content/about-iota/iota-architecture/staking-rewards.mdx +++ b/docs/content/about-iota/iota-architecture/staking-rewards.mdx @@ -3,6 +3,7 @@ teams: - iotaledger/research tags: - tokenomics + - core-protocol --- import StakingPoolReqs from "../../_snippets/staking-pool-reqs.mdx"; import Quiz from '@site/src/components/Quiz'; diff --git a/docs/content/about-iota/iota-architecture/transaction-lifecycle.mdx b/docs/content/about-iota/iota-architecture/transaction-lifecycle.mdx index 2ba86b3ab87..caa38a141ff 100644 --- a/docs/content/about-iota/iota-architecture/transaction-lifecycle.mdx +++ b/docs/content/about-iota/iota-architecture/transaction-lifecycle.mdx @@ -1,3 +1,6 @@ +--- +tags: [core-protocol] +--- import Quiz from '@site/src/components/Quiz'; import {questions} from '../../../site/static/json/about-iota/iota-architecture/transaction-lifecycle.json'; import ThemedImage from '@theme/ThemedImage'; diff --git a/docs/content/tags.yml b/docs/content/tags.yml index ec66644de6f..7ac096f1f48 100644 --- a/docs/content/tags.yml +++ b/docs/content/tags.yml @@ -256,6 +256,10 @@ testing: label: Testing description: Process of evaluating code. +core-protocol: + label: Core Protocol + description: Core Protocol + tokenomics: label: Tokenomics description: Token Economics From 345082ae466a8862e9daa147d338006b0d0aeda4 Mon Sep 17 00:00:00 2001 From: Lucas Tortora <85233773+lucas-tortora@users.noreply.github.com> Date: Thu, 30 Jan 2025 10:44:00 -0300 Subject: [PATCH 41/51] task(devx) - Add Tags - Node Operation (#4986) * task(dex): Added tags to docs pertaining to node operation * add more tags * dprint * fix(devx): format tags * add team tags, remove node operation tags * fix tags, merge develop and resolve conflicts * Apply suggestions from code review Co-authored-by: muXxer * Apply suggestions from code review Co-authored-by: muXxer * move validator-committee into about-iota * remove telemetry * fix links --------- Co-authored-by: muXxer --- docs/content/about-iota/about-iota.mdx | 2 +- .../validator-committee.mdx | 5 +- .../about-iota/tokenomics/gas-pricing.mdx | 2 +- .../about-iota/tokenomics/proof-of-stake.mdx | 2 +- .../getting-started/local-network.mdx | 3 +- docs/content/operator/archives.mdx | 3 ++ docs/content/operator/data-management.mdx | 3 ++ docs/content/operator/genesis.mdx | 3 ++ .../operator/iota-full-node/docker.mdx | 3 ++ .../iota-full-node/monitoring-and-pruning.mdx | 3 ++ .../operator/iota-full-node/overview.mdx | 3 ++ .../operator/iota-full-node/source.mdx | 3 ++ docs/content/operator/observability.mdx | 3 ++ docs/content/operator/operator.mdx | 5 +- docs/content/operator/snapshots.mdx | 3 ++ .../operator/telemetry/_iota-telemetry.mdx | 46 ------------------- .../operator/telemetry/iota-metrics.mdx | 3 ++ .../operator/telemetry/iota-telemetry.mdx | 46 ------------------- .../telemetry/telemetry-subscribers.mdx | 3 ++ docs/content/operator/validator-config.mdx | 3 ++ .../validator-operation/ansible/README.mdx | 3 ++ .../validator-operation/docker/README.mdx | 3 ++ .../validator-operation/systemd/README.mdx | 3 ++ .../validator-operation/validator-tasks.mdx | 5 ++ docs/content/operator/validator-tools.mdx | 5 ++ docs/content/sidebars/about-iota.js | 1 + docs/content/sidebars/operator.js | 1 - docs/content/tags.yml | 4 ++ 28 files changed, 71 insertions(+), 101 deletions(-) rename docs/content/{operator => about-iota/iota-architecture}/validator-committee.mdx (95%) delete mode 100644 docs/content/operator/telemetry/_iota-telemetry.mdx delete mode 100644 docs/content/operator/telemetry/iota-telemetry.mdx diff --git a/docs/content/about-iota/about-iota.mdx b/docs/content/about-iota/about-iota.mdx index ab9f139f9df..c5e88fc4c71 100644 --- a/docs/content/about-iota/about-iota.mdx +++ b/docs/content/about-iota/about-iota.mdx @@ -85,4 +85,4 @@ Transactions on the IOTA network require [gas](./tokenomics/gas-in-iota.mdx) fee ## Consensus on IOTA -IOTA uses a delegated proof-of-stake (DPoS) consensus mechanism to validate on-chain transaction blocks. [Validators](../operator/validator-committee.mdx) on the IOTA network must secure a certain amount of IOTA tokens on the IOTA Mainnet to demonstrate their commitment to the network's security. This approach aligns the interests of all validators with those of IOTA users, ensuring an efficient and secure blockchain without the high energy demands of earlier blockchains. +IOTA uses a delegated proof-of-stake (DPoS) consensus mechanism to validate on-chain transaction blocks. [Validators](iota-architecture/validator-committee.mdx) on the IOTA network must secure a certain amount of IOTA tokens on the IOTA Mainnet to demonstrate their commitment to the network's security. This approach aligns the interests of all validators with those of IOTA users, ensuring an efficient and secure blockchain without the high energy demands of earlier blockchains. diff --git a/docs/content/operator/validator-committee.mdx b/docs/content/about-iota/iota-architecture/validator-committee.mdx similarity index 95% rename from docs/content/operator/validator-committee.mdx rename to docs/content/about-iota/iota-architecture/validator-committee.mdx index 8a5e839f79e..df6b822a27a 100644 --- a/docs/content/operator/validator-committee.mdx +++ b/docs/content/about-iota/iota-architecture/validator-committee.mdx @@ -2,19 +2,18 @@ title: Validator Committee description: IOTA has a committee of validators to verify on-chain transactions. Epochs, quorums, transactions, _certificates_, and consensus are touch points for this committee. --- - import Quiz from '@site/src/components/Quiz'; import questions from '/json/node-operators/validator-committee.json'; A set of independent validators participate on the IOTA network, each running its own instance of the IOTA software on a separate machine (or a sharded cluster of machines the same entity operates). Each validator handles read and write requests sent by clients, verifying transactions and updating on-chain information. -To learn how to set up and run an IOTA Validator node, including how staking and rewards work, see [IOTA Validator Node Configuration](validator-config.mdx). +To learn how to set up and run an IOTA Validator node, including how staking and rewards work, see [IOTA Validator Node Configuration](../../operator/validator-config.mdx). IOTA uses Delegated Proof-of-Stake (DPoS) to determine which validators operate the network and their voting power. Validators are incentivized to participate in good faith via staking rewards, which are slashed in case of misbehavior. ## Epochs -Operation of the IOTA network is temporally partitioned into non-overlapping, approximate fixed-duration (~24-hour) epochs. During a particular epoch, the set of validators participating in the network and their voting power is fixed. At an epoch boundary, reconfiguration might occur and can change the set of validators participating in the network and their voting power. Conceptually, reconfiguration starts a new instance of the IOTA protocol with the previous epoch's final state as [genesis](genesis.mdx) and the new set of validators as the operators. Besides validator set changes, tokenomics operations such as staking/un-staking, and distribution of staking rewards are also processed at epoch boundaries. +Operation of the IOTA network is temporally partitioned into non-overlapping, approximate fixed-duration (~24-hour) epochs. During a particular epoch, the set of validators participating in the network and their voting power is fixed. At an epoch boundary, reconfiguration might occur and can change the set of validators participating in the network and their voting power. Conceptually, reconfiguration starts a new instance of the IOTA protocol with the previous epoch's final state as [genesis](../../operator/genesis.mdx) and the new set of validators as the operators. Besides validator set changes, tokenomics operations such as staking/un-staking, and distribution of staking rewards are also processed at epoch boundaries. ## Quorums diff --git a/docs/content/about-iota/tokenomics/gas-pricing.mdx b/docs/content/about-iota/tokenomics/gas-pricing.mdx index 968a8620b49..b00b97d212c 100644 --- a/docs/content/about-iota/tokenomics/gas-pricing.mdx +++ b/docs/content/about-iota/tokenomics/gas-pricing.mdx @@ -32,7 +32,7 @@ On the IOTA network, a single $ReferencePrice$ exists throughout each epoch, wit More generally, the IOTA gas price mechanism makes the $ReferencePrice$ a credible anchor for you to reference when submitting transactions to the network. Providing reasonable confidence that transactions submitted with gas prices at or close to the reference price are executed in a timely manner. This is achieved through three core steps: -- **Gas price survey:** All validators are surveyed at the start of each epoch, and every validator submits their reservation price. That is, each validator states the minimum gas price at which they are willing to process transactions. The protocol orders these quotes and chooses the 2/3 percentile by stake as the reference price. The gas price survey goal is to set a reference price under which a [quorum](../../operator/validator-committee.mdx#quorums) of validators are willing to promptly process transactions. +- **Gas price survey:** All validators are surveyed at the start of each epoch, and every validator submits their reservation price. That is, each validator states the minimum gas price at which they are willing to process transactions. The protocol orders these quotes and chooses the 2/3 percentile by stake as the reference price. The gas price survey goal is to set a reference price under which a [quorum](../iota-architecture/validator-committee.mdx#quorums) of validators are willing to promptly process transactions. - **Tallying rule:** Throughout the epoch, validators obtain signals over the operations of other validators. Each validator uses these signals to build a (subjective) evaluation over the performance of every other validator. Specifically, each validator constructs a multiplier for the stake rewards of every other validator such that validators who behave well receive boosted rewards, and validators who do not receive reduced rewards. The tallying rule goal is to create a community-enforced mechanism for encouraging validators to honor the reference gas price. - **Incentivized stake reward distribution rule:** At the end of the epoch, the distribution of stake rewards across validators is adjusted using information from the tallying rule. Specifically, a global multiplier is built for every validator using the median value (weighted by stake) out of the set of individual multipliers constructed during the tallying rule. All else equal, validators that operated performantly receive their regular stake rewards, whereas validators who did not operate performantly at the reference gas price receive slashed rewards. Since stake rewards are influenced by the amount of stake each validator owns, validators are encouraged to obtain more stake by lowering gas fees and pricing out inefficient validators. This benefits IOTA end users since the stake reward distribution rule incentivizes validators to deliver a more cost-efficient network. diff --git a/docs/content/about-iota/tokenomics/proof-of-stake.mdx b/docs/content/about-iota/tokenomics/proof-of-stake.mdx index 58211cea6c1..91ffca296e4 100644 --- a/docs/content/about-iota/tokenomics/proof-of-stake.mdx +++ b/docs/content/about-iota/tokenomics/proof-of-stake.mdx @@ -25,7 +25,7 @@ The IOTA economic model works as follows. At the beginning of each epoch, two important events happen: -- The delegated tokens for a given validator are added up and a new [committee](../../operator/validator-committee.mdx) is formed. +- The delegated tokens for a given validator are added up and a new [committee](../iota-architecture/validator-committee.mdx) is formed. - The reference gas price, set as described in [IOTA Gas Pricing](./gas-pricing.mdx), is updated. Following these actions, the protocol computes the total amount of stake as the sum of staked IOTA. diff --git a/docs/content/developer/getting-started/local-network.mdx b/docs/content/developer/getting-started/local-network.mdx index a81a69be68c..24cd148a226 100644 --- a/docs/content/developer/getting-started/local-network.mdx +++ b/docs/content/developer/getting-started/local-network.mdx @@ -1,8 +1,9 @@ --- description: Guide to setting up and using a local IOTA network for development and testing. -tags: [ how-to, install, setup, cli, typescript, sdk, testing, iota-cli ] +tags: [ how-to, install, setup, cli, typescript, sdk, testing, iota-cli, node-operation] teams: - iotaledger/dev-tools + - iotaledger/node --- import Quiz from '@site/src/components/Quiz'; import questions from '/json/developer/getting-started/local-network.json'; diff --git a/docs/content/operator/archives.mdx b/docs/content/operator/archives.mdx index 79c426fb1fe..e85b44865c3 100644 --- a/docs/content/operator/archives.mdx +++ b/docs/content/operator/archives.mdx @@ -1,6 +1,9 @@ --- title: IOTA Archives description: The archive is a historical record of all transactions on IOTA. Enable archiving on your full nodes as a best practice. +tags: [node-operation] +teams: + - iotaledger/node --- import Quiz from '@site/src/components/Quiz'; diff --git a/docs/content/operator/data-management.mdx b/docs/content/operator/data-management.mdx index 19a123687e5..22fabc94ab7 100644 --- a/docs/content/operator/data-management.mdx +++ b/docs/content/operator/data-management.mdx @@ -1,5 +1,8 @@ --- title: Data Management +tags: [node-operation] +teams: + - iotaledger/node description: A high-level description of data management on the IOTA network that you can use to optimize your IOTA full node configuration. --- diff --git a/docs/content/operator/genesis.mdx b/docs/content/operator/genesis.mdx index 3abf6a21725..ce93d49fac0 100644 --- a/docs/content/operator/genesis.mdx +++ b/docs/content/operator/genesis.mdx @@ -1,5 +1,8 @@ --- title: Genesis +tags: [node-operation] +teams: + - iotaledger/node --- Genesis is the initial state of the IOTA blockchain. To launch a network, the initial committee of validators collaborate by providing their validator information (public keys, network addresses, and so on) to a shared workspace. After all of the initial validators have contributed their information, IOTA generates the initial, unsigned genesis checkpoint (checkpoint with sequence number 0) and each validator provides their signature. IOTA aggregates these signatures to form a _certificate_ on the genesis checkpoint. IOTA bundles this checkpoint, as well as the initial objects, together into a single genesis.blob file that is used to initialize the state when running the `iota-node` binary for both validators and full nodes. diff --git a/docs/content/operator/iota-full-node/docker.mdx b/docs/content/operator/iota-full-node/docker.mdx index ea9633ba18f..070b6f994f3 100644 --- a/docs/content/operator/iota-full-node/docker.mdx +++ b/docs/content/operator/iota-full-node/docker.mdx @@ -1,5 +1,8 @@ --- description: Learn how to set up an IOTA Full Node using docker. +tags: [node-operation] +teams: + - iotaledger/node --- import Quiz from '@site/src/components/Quiz'; import questions from '/json/node-operators/iota-full-node/node-setup.json'; diff --git a/docs/content/operator/iota-full-node/monitoring-and-pruning.mdx b/docs/content/operator/iota-full-node/monitoring-and-pruning.mdx index 4414e18b3f9..f0c6ffed039 100644 --- a/docs/content/operator/iota-full-node/monitoring-and-pruning.mdx +++ b/docs/content/operator/iota-full-node/monitoring-and-pruning.mdx @@ -1,5 +1,8 @@ --- description: How to monitor and Prune your IOTA Full Node. +tags: [node-operation] +teams: + - iotaledger/node --- import Quiz from '@site/src/components/Quiz'; import questions from '/json/node-operators/iota-full-node/pruning.json'; diff --git a/docs/content/operator/iota-full-node/overview.mdx b/docs/content/operator/iota-full-node/overview.mdx index da11b6eb69d..7869d7b08eb 100644 --- a/docs/content/operator/iota-full-node/overview.mdx +++ b/docs/content/operator/iota-full-node/overview.mdx @@ -1,6 +1,9 @@ --- title: Overview description: Operate an IOTA Full Node to validate blockchain activities, like transactions, checkpoints, and epoch changes. +tags: [node-operation] +teams: + - iotaledger/node --- import Quiz from '@site/src/components/Quiz'; import BSTInfo from '../../_snippets/info-BST-2f1.mdx'; diff --git a/docs/content/operator/iota-full-node/source.mdx b/docs/content/operator/iota-full-node/source.mdx index 540fd28a15d..6d0939870bf 100644 --- a/docs/content/operator/iota-full-node/source.mdx +++ b/docs/content/operator/iota-full-node/source.mdx @@ -1,6 +1,9 @@ --- description: Learn how to set up an IOTA full node from source. title: Build From Source +tags: [node-operation] +teams: + - iotaledger/node --- import Quiz from '@site/src/components/Quiz'; import questions from '/json/node-operators/iota-full-node/node-setup.json'; diff --git a/docs/content/operator/observability.mdx b/docs/content/operator/observability.mdx index 6467539eed0..59ed667450f 100644 --- a/docs/content/operator/observability.mdx +++ b/docs/content/operator/observability.mdx @@ -1,6 +1,9 @@ --- title: Logging, Tracing, Metrics, and Observability sidebar_label: Observability +tags: [node-operation] +teams: + - iotaledger/node draft: true --- diff --git a/docs/content/operator/operator.mdx b/docs/content/operator/operator.mdx index 6342e5b7948..f75c09f7f20 100644 --- a/docs/content/operator/operator.mdx +++ b/docs/content/operator/operator.mdx @@ -1,5 +1,8 @@ --- title: Operator Guides +tags: [node-operation] +teams: + - iotaledger/node description: Guides for operators on the IOTA network. Whether you are running a full node for your dApp or operating as a validator on the IOTA network, these guides help you set up your environment and operate your network. --- @@ -15,7 +18,7 @@ Guides that inform full node operators include: Guides that inform validators how to operate on IOTA include: -- [Validator Committee](validator-committee.mdx) +- [Validator Committee](../about-iota/iota-architecture/validator-committee.mdx) - [Validator Configuration](validator-config.mdx) - [Validator Tasks](validator-operation/validator-tasks.mdx) diff --git a/docs/content/operator/snapshots.mdx b/docs/content/operator/snapshots.mdx index 663fe90e3a6..3776a2a3f3f 100644 --- a/docs/content/operator/snapshots.mdx +++ b/docs/content/operator/snapshots.mdx @@ -1,5 +1,8 @@ --- title: Database Snapshots +tags: [node-operation] +teams: + - iotaledger/node description: Database snapshots of the IOTA network enable full node operators a way to bootstrap a full node without having to execute all the transactions that occurred after genesis. --- diff --git a/docs/content/operator/telemetry/_iota-telemetry.mdx b/docs/content/operator/telemetry/_iota-telemetry.mdx deleted file mode 100644 index 55a09b7e819..00000000000 --- a/docs/content/operator/telemetry/_iota-telemetry.mdx +++ /dev/null @@ -1,46 +0,0 @@ ---- -title: Telemetry -description: Collects data from the node and sends it to Google Analytics for monitoring and analysis. ---- - -import Quiz from '@site/src/components/Quiz'; -import questions from '/json/node-operators/telemetry/iota-telemetry.json'; - -The `iota-telemetry` crate is used to collect data from a node, package it into structured events and send it to Google -Analytics (GA). It uses the GA4 Measurement Protocol, which allows backends to send custom event data to track node -performance and other metrics. -Access to the telemetry data is restricted to users with appropriate permissions in the GA account. - -## Constants - -The library defines following constants: -- `GA_API_SECRET`: The API secret for authenticating with GA. -- `GA_EVENT_NAME`: The name of the telemetry event being tracked. -- `GA_MEASUREMENT_ID`: The measurement ID for the GA property. -- `GA_URL`: The endpoint URL for sending data to GA. -- `HARDCODED_CLIENT_ID`: A hardcoded client ID required for the GA4 Measurement Protocol. -- `IPLOOKUP_URL`: The URL used to retrieve the node's public IP address. -- `UNKNOWN_STRING`: A fallback string used when data retrieval fails. - -## Data Types - -To organize the telemetry data that is to be sent: -- `TelemetryEvent`: Represents a single event with a name and a set of parameters. -- `TelemetryPayload`: Represents the payload to be sent, containing a client ID and a list of telemetry events. -- `IpResponse`: Represents the structure of the IP lookup service response. - -## Sending the Event - -The `send_telemetry_event` function collects the data from an `AuthorityState`. -It retrieves: -* The current git revision using `env!("CARGO_PKG_VERSION")`. -* The public IP address by calling the `get_ip` helper function. - * The `get_ip` function retrieves the node's public IP address by making a GET request to `https://api.ipify.org`. If the request fails, it returns the `UNKNOWN_STRING` constant. -* The chain identifier from the node state. -* The epoch time. - -After retrieving all data, `send_telemetry_event` constructs a `TelemetryEvent` and wraps it into -a `TelemetryPayload` type containing the hardcoded client ID. Then, the payload will be sent to GA as an HTTP POST request -with content type JSON, which can be visualized and analyzed in the GA dashboard. - - \ No newline at end of file diff --git a/docs/content/operator/telemetry/iota-metrics.mdx b/docs/content/operator/telemetry/iota-metrics.mdx index 89d886e28b1..8c4bbfdbc30 100644 --- a/docs/content/operator/telemetry/iota-metrics.mdx +++ b/docs/content/operator/telemetry/iota-metrics.mdx @@ -1,6 +1,9 @@ --- title: Metrics description: Prometheus-based metrics for the node. +tags: [node-operation] +teams: + - iotaledger/node --- import Quiz from '@site/src/components/Quiz'; diff --git a/docs/content/operator/telemetry/iota-telemetry.mdx b/docs/content/operator/telemetry/iota-telemetry.mdx deleted file mode 100644 index 55a09b7e819..00000000000 --- a/docs/content/operator/telemetry/iota-telemetry.mdx +++ /dev/null @@ -1,46 +0,0 @@ ---- -title: Telemetry -description: Collects data from the node and sends it to Google Analytics for monitoring and analysis. ---- - -import Quiz from '@site/src/components/Quiz'; -import questions from '/json/node-operators/telemetry/iota-telemetry.json'; - -The `iota-telemetry` crate is used to collect data from a node, package it into structured events and send it to Google -Analytics (GA). It uses the GA4 Measurement Protocol, which allows backends to send custom event data to track node -performance and other metrics. -Access to the telemetry data is restricted to users with appropriate permissions in the GA account. - -## Constants - -The library defines following constants: -- `GA_API_SECRET`: The API secret for authenticating with GA. -- `GA_EVENT_NAME`: The name of the telemetry event being tracked. -- `GA_MEASUREMENT_ID`: The measurement ID for the GA property. -- `GA_URL`: The endpoint URL for sending data to GA. -- `HARDCODED_CLIENT_ID`: A hardcoded client ID required for the GA4 Measurement Protocol. -- `IPLOOKUP_URL`: The URL used to retrieve the node's public IP address. -- `UNKNOWN_STRING`: A fallback string used when data retrieval fails. - -## Data Types - -To organize the telemetry data that is to be sent: -- `TelemetryEvent`: Represents a single event with a name and a set of parameters. -- `TelemetryPayload`: Represents the payload to be sent, containing a client ID and a list of telemetry events. -- `IpResponse`: Represents the structure of the IP lookup service response. - -## Sending the Event - -The `send_telemetry_event` function collects the data from an `AuthorityState`. -It retrieves: -* The current git revision using `env!("CARGO_PKG_VERSION")`. -* The public IP address by calling the `get_ip` helper function. - * The `get_ip` function retrieves the node's public IP address by making a GET request to `https://api.ipify.org`. If the request fails, it returns the `UNKNOWN_STRING` constant. -* The chain identifier from the node state. -* The epoch time. - -After retrieving all data, `send_telemetry_event` constructs a `TelemetryEvent` and wraps it into -a `TelemetryPayload` type containing the hardcoded client ID. Then, the payload will be sent to GA as an HTTP POST request -with content type JSON, which can be visualized and analyzed in the GA dashboard. - - \ No newline at end of file diff --git a/docs/content/operator/telemetry/telemetry-subscribers.mdx b/docs/content/operator/telemetry/telemetry-subscribers.mdx index 8eadd361fe6..d212f4cf1b7 100644 --- a/docs/content/operator/telemetry/telemetry-subscribers.mdx +++ b/docs/content/operator/telemetry/telemetry-subscribers.mdx @@ -1,6 +1,9 @@ --- title: Telemetry Subscribers description: Allows for flexible logging and tracing of the node. +tags: [node-operation] +teams: + - iotaledger/node --- import Quiz from '@site/src/components/Quiz'; diff --git a/docs/content/operator/validator-config.mdx b/docs/content/operator/validator-config.mdx index 34032f2423a..4a0de433250 100644 --- a/docs/content/operator/validator-config.mdx +++ b/docs/content/operator/validator-config.mdx @@ -1,5 +1,8 @@ --- title: IOTA Validator Node Configuration +tags: [node-operation] +teams: + - iotaledger/node description: Learn how to set up, configure, and manage an IOTA Validator node, including staking, reference gas price, and tallying rules. --- diff --git a/docs/content/operator/validator-operation/ansible/README.mdx b/docs/content/operator/validator-operation/ansible/README.mdx index 29c76e118c2..5893c70078a 100644 --- a/docs/content/operator/validator-operation/ansible/README.mdx +++ b/docs/content/operator/validator-operation/ansible/README.mdx @@ -1,5 +1,8 @@ --- sidebar_label: Ansible Configuration +tags: [node-operation] +teams: + - iotaledger/node --- import Configuration from './../../../../../nre/ansible/README.md'; diff --git a/docs/content/operator/validator-operation/docker/README.mdx b/docs/content/operator/validator-operation/docker/README.mdx index 08351c3e676..f2c0977fa96 100644 --- a/docs/content/operator/validator-operation/docker/README.mdx +++ b/docs/content/operator/validator-operation/docker/README.mdx @@ -1,5 +1,8 @@ --- sidebar_label: Docker Configuration +tags: [node-operation] +teams: + - iotaledger/node --- import Configuration from './../../../../../nre/docker/README.md'; diff --git a/docs/content/operator/validator-operation/systemd/README.mdx b/docs/content/operator/validator-operation/systemd/README.mdx index 57d80709cf9..f8e9241c5bb 100644 --- a/docs/content/operator/validator-operation/systemd/README.mdx +++ b/docs/content/operator/validator-operation/systemd/README.mdx @@ -1,5 +1,8 @@ --- sidebar_label: Systemd Configuration +tags: [node-operation] +teams: + - iotaledger/node --- import Configuration from './../../../../../nre/systemd/README.md'; diff --git a/docs/content/operator/validator-operation/validator-tasks.mdx b/docs/content/operator/validator-operation/validator-tasks.mdx index 7ea7fc905c7..c12eb511fc4 100644 --- a/docs/content/operator/validator-operation/validator-tasks.mdx +++ b/docs/content/operator/validator-operation/validator-tasks.mdx @@ -1,3 +1,8 @@ +--- +tags: [node-operation] +teams: + - iotaledger/node +--- import ValidatorTasks from './../../../../nre/validator_tasks.md'; import Quiz from '@site/src/components/Quiz'; import questions from '/json/node-operators/validator-tasks.json'; diff --git a/docs/content/operator/validator-tools.mdx b/docs/content/operator/validator-tools.mdx index 7c567f20821..6ffb14eac4d 100644 --- a/docs/content/operator/validator-tools.mdx +++ b/docs/content/operator/validator-tools.mdx @@ -1,3 +1,8 @@ +--- +tags: [node-operation] +teams: + - iotaledger/node +--- import ValidatorTools from './../../../nre/validator_tool.md'; import Quiz from '@site/src/components/Quiz'; import questions from '/json/node-operators/validator-tools.json'; diff --git a/docs/content/sidebars/about-iota.js b/docs/content/sidebars/about-iota.js index 3256160f804..35af67e07d1 100644 --- a/docs/content/sidebars/about-iota.js +++ b/docs/content/sidebars/about-iota.js @@ -15,6 +15,7 @@ const aboutIota = [ items: [ 'about-iota/iota-architecture/iota-security', 'about-iota/iota-architecture/transaction-lifecycle', + 'about-iota/iota-architecture/validator-committee', 'about-iota/iota-architecture/consensus', 'about-iota/iota-architecture/epochs', 'about-iota/iota-architecture/protocol-upgrades', diff --git a/docs/content/sidebars/operator.js b/docs/content/sidebars/operator.js index 0c74d2f4532..6d86401c4e3 100644 --- a/docs/content/sidebars/operator.js +++ b/docs/content/sidebars/operator.js @@ -20,7 +20,6 @@ const operator = [ 'operator/archives', 'operator/genesis', 'operator/indexer-functions', - 'operator/validator-committee', { type: 'category', label: 'Validator Operation', diff --git a/docs/content/tags.yml b/docs/content/tags.yml index 7ac096f1f48..2633f13b2c3 100644 --- a/docs/content/tags.yml +++ b/docs/content/tags.yml @@ -275,3 +275,7 @@ rust-sdk: iota-wallet: label: IOTA Wallet description: IOTA Wallet Browser Extension + +node-operation: + label: Node Operation + description: Node Operation From 6caf3cb25e2d9e605c9f92aa9cb6de593fe7b377 Mon Sep 17 00:00:00 2001 From: Marc Espin Date: Thu, 30 Jan 2025 15:09:47 +0100 Subject: [PATCH 42/51] feat(wallet-dashboard): Add amplitude events (#5010) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat(dashboard): Integrate Amplitude * manypkg * prettier fix dashboard * missing header * feat(wallet-dashboard): Add more amplitude events * fix: format code * chore: Add `walletDashboardRev` * chore: bring back disabled check * fix(dashboard): modify the license header in the prepend file * fix(dashboard): remove isTimelock for migration amplitude event * fix(dashboard): lint * fix(dashboard): remove duplicate file --------- Co-authored-by: cpl121 Co-authored-by: cpl121 <100352899+cpl121@users.noreply.github.com> Co-authored-by: Begoña Álvarez de la Cruz --- apps/wallet-dashboard/ampli.json | 4 +- .../app/(protected)/assets/page.tsx | 7 + .../app/(protected)/vesting/page.tsx | 2 + .../components/dialogs/assets/AssetDialog.tsx | 4 + .../dialogs/migration/MigrationDialog.tsx | 5 + .../dialogs/send-token/SendTokenDialog.tsx | 4 + .../dialogs/staking/StakeDialog.tsx | 5 + .../dialogs/staking/hooks/useStakeDialog.ts | 4 + .../dialogs/staking/views/EnterAmountView.tsx | 6 +- .../views/EnterTimelockedAmountView.tsx | 30 +- .../views/UnstakeTimelockedObjectsView.tsx | 4 + .../dialogs/unstake/views/UnstakeView.tsx | 5 + .../hooks/useNewStakeTransaction.ts | 14 +- .../hooks/usePersistedNetwork.ts | 4 + .../lib/utils/analytics/ampli/index.ts | 420 +++++++++++++++++- ...{prependlicense.mjs => prependLicense.mjs} | 6 +- 16 files changed, 495 insertions(+), 29 deletions(-) rename apps/wallet-dashboard/{prependlicense.mjs => prependLicense.mjs} (54%) diff --git a/apps/wallet-dashboard/ampli.json b/apps/wallet-dashboard/ampli.json index 4259ab540a1..e0fdcea81b6 100644 --- a/apps/wallet-dashboard/ampli.json +++ b/apps/wallet-dashboard/ampli.json @@ -4,8 +4,8 @@ "WorkspaceId": "72fb85fc-aed9-46ef-83a2-9345888a1678", "SourceId": "ca44ad20-3cfd-4618-aa11-4b8befb0b123", "Branch": "main", - "Version": "1.0.0", - "VersionId": "954386e3-441d-4aa5-b9ad-1f01e0a20e55", + "Version": "3.0.0", + "VersionId": "fd563f8a-ce76-4f47-a8f5-296a8ac394f8", "Runtime": "browser:typescript-ampli-v2", "Platform": "Browser", "Language": "TypeScript", diff --git a/apps/wallet-dashboard/app/(protected)/assets/page.tsx b/apps/wallet-dashboard/app/(protected)/assets/page.tsx index b091ab2f345..67f5058789d 100644 --- a/apps/wallet-dashboard/app/(protected)/assets/page.tsx +++ b/apps/wallet-dashboard/app/(protected)/assets/page.tsx @@ -22,6 +22,7 @@ import { Warning } from '@iota/apps-ui-icons'; import { AssetTileLink, Loading } from '@/components'; import { AssetDialog } from '@/components/dialogs/assets'; +import { ampli } from '@/lib/utils/analytics'; const ASSET_CATEGORIES: { label: string; value: AssetCategory }[] = [ { @@ -63,6 +64,12 @@ export default function AssetsDashboardPage(): React.JSX.Element { function onAssetClick(asset: IotaObjectData) { setSelectedAsset(asset); + if (selectedAssetCategory === AssetCategory.Visual) { + ampli.clickedCollectibleCard({ + objectId: asset.objectId, + collectibleType: asset.type!, + }); + } } return ( diff --git a/apps/wallet-dashboard/app/(protected)/vesting/page.tsx b/apps/wallet-dashboard/app/(protected)/vesting/page.tsx index 79e2f616641..639be12171a 100644 --- a/apps/wallet-dashboard/app/(protected)/vesting/page.tsx +++ b/apps/wallet-dashboard/app/(protected)/vesting/page.tsx @@ -58,6 +58,7 @@ import { useEffect, useState } from 'react'; import { StakedTimelockObject } from '@/components'; import { IotaSignAndExecuteTransactionOutput } from '@iota/wallet-standard'; import toast from 'react-hot-toast'; +import { ampli } from '@/lib/utils/analytics'; export default function VestingDashboardPage(): JSX.Element { const [timelockedObjectsToUnstake, setTimelockedObjectsToUnstake] = @@ -180,6 +181,7 @@ export default function VestingDashboardPage(): JSX.Element { { onSuccess: (tx) => { handleOnSuccess(tx.digest); + ampli.timelockCollect(); }, }, ) diff --git a/apps/wallet-dashboard/components/dialogs/assets/AssetDialog.tsx b/apps/wallet-dashboard/components/dialogs/assets/AssetDialog.tsx index f2190f2b713..9a9f400b015 100644 --- a/apps/wallet-dashboard/components/dialogs/assets/AssetDialog.tsx +++ b/apps/wallet-dashboard/components/dialogs/assets/AssetDialog.tsx @@ -18,6 +18,7 @@ import { AssetsDialogView } from './constants'; import { TransactionDetailsView } from '../send-token'; import { DialogLayout } from '../layout'; import toast from 'react-hot-toast'; +import { ampli } from '@/lib/utils/analytics'; interface AssetsDialogProps { onClose: () => void; @@ -80,6 +81,9 @@ export function AssetDialog({ onClose, asset, refetchAssets }: AssetsDialogProps refetchAssets(); toast.success('Transfer transaction successful'); setView(AssetsDialogView.TransactionDetails); + ampli.sentCollectible({ + objectId, + }); } catch { toast.error('Transfer transaction failed'); } diff --git a/apps/wallet-dashboard/components/dialogs/migration/MigrationDialog.tsx b/apps/wallet-dashboard/components/dialogs/migration/MigrationDialog.tsx index 63aa8e052cb..a87622e5c54 100644 --- a/apps/wallet-dashboard/components/dialogs/migration/MigrationDialog.tsx +++ b/apps/wallet-dashboard/components/dialogs/migration/MigrationDialog.tsx @@ -10,6 +10,7 @@ import toast from 'react-hot-toast'; import { TransactionDialogView } from '../TransactionDialog'; import { MigrationDialogView } from './enums'; import { ConfirmMigrationView } from './views'; +import { ampli } from '@/lib/utils/analytics'; interface MigrationDialogProps { handleClose: () => void; @@ -54,6 +55,10 @@ export function MigrationDialog({ onSuccess(tx.digest); setTxDigest(tx.digest); setView(MigrationDialogView.TransactionDetails); + ampli.migration({ + basicOutputObjects: basicOutputObjects.length, + nftOutputObjects: nftOutputObjects.length, + }); }, }, ) diff --git a/apps/wallet-dashboard/components/dialogs/send-token/SendTokenDialog.tsx b/apps/wallet-dashboard/components/dialogs/send-token/SendTokenDialog.tsx index 217540c0fa6..1cc94318aff 100644 --- a/apps/wallet-dashboard/components/dialogs/send-token/SendTokenDialog.tsx +++ b/apps/wallet-dashboard/components/dialogs/send-token/SendTokenDialog.tsx @@ -12,6 +12,7 @@ import { INITIAL_VALUES } from './constants'; import { IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; import { useTransferTransactionMutation } from '@/hooks'; import toast from 'react-hot-toast'; +import { ampli } from '@/lib/utils/analytics'; import { useQueryClient } from '@tanstack/react-query'; interface SendCoinDialogProps { @@ -69,6 +70,9 @@ function SendTokenDialogBody({ setStep(FormStep.TransactionDetails); toast.success('Transfer transaction has been sent'); + ampli.sentCoins({ + coinType: selectedCoin.coinType, + }); }, onError: () => { setOpen(false); diff --git a/apps/wallet-dashboard/components/dialogs/staking/StakeDialog.tsx b/apps/wallet-dashboard/components/dialogs/staking/StakeDialog.tsx index 69fa3e8d41a..7ddcff137e4 100644 --- a/apps/wallet-dashboard/components/dialogs/staking/StakeDialog.tsx +++ b/apps/wallet-dashboard/components/dialogs/staking/StakeDialog.tsx @@ -19,6 +19,7 @@ import { Dialog } from '@iota/apps-ui-kit'; import { DetailsView } from './views'; import { TransactionDialogView } from '../TransactionDialog'; import { StakeDialogView } from './enums/view.enums'; +import { ampli } from '@/lib/utils/analytics'; const INITIAL_VALUES = { amount: '', @@ -92,6 +93,10 @@ export function StakeDialog({ function handleValidatorSelect(validator: string): void { setSelectedValidator?.(validator); + + ampli.selectValidator({ + validatorAddress: validator, + }); } function setViewBasedOnStakingType() { diff --git a/apps/wallet-dashboard/components/dialogs/staking/hooks/useStakeDialog.ts b/apps/wallet-dashboard/components/dialogs/staking/hooks/useStakeDialog.ts index 7d1c44f6e89..59ddb8d0738 100644 --- a/apps/wallet-dashboard/components/dialogs/staking/hooks/useStakeDialog.ts +++ b/apps/wallet-dashboard/components/dialogs/staking/hooks/useStakeDialog.ts @@ -4,6 +4,7 @@ import { useState } from 'react'; import { ExtendedDelegatedStake } from '@iota/core'; import { StakeDialogView } from '../enums/view.enums'; +import { ampli } from '@/lib/utils/analytics'; export function useStakeDialog() { const [stakeDialogView, setStakeDialogView] = useState(); @@ -21,6 +22,9 @@ export function useStakeDialog() { function handleNewStake() { setSelectedStake(null); setStakeDialogView(StakeDialogView.SelectValidator); + ampli.clickedStakeIota({ + isCurrentlyStaking: true, + }); } return { diff --git a/apps/wallet-dashboard/components/dialogs/staking/views/EnterAmountView.tsx b/apps/wallet-dashboard/components/dialogs/staking/views/EnterAmountView.tsx index 297ecba4e17..ac21e567bdc 100644 --- a/apps/wallet-dashboard/components/dialogs/staking/views/EnterAmountView.tsx +++ b/apps/wallet-dashboard/components/dialogs/staking/views/EnterAmountView.tsx @@ -2,12 +2,13 @@ // SPDX-License-Identifier: Apache-2.0 import { useFormatCoin, useBalance, CoinFormat, parseAmount, useCoinMetadata } from '@iota/core'; -import { IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; +import { IOTA_TYPE_ARG, NANOS_PER_IOTA } from '@iota/iota-sdk/utils'; import { useFormikContext } from 'formik'; import { useSignAndExecuteTransaction } from '@iota/dapp-kit'; import { useNewStakeTransaction } from '@/hooks'; import { EnterAmountDialogLayout } from './EnterAmountDialogLayout'; import toast from 'react-hot-toast'; +import { ampli } from '@/lib/utils/analytics'; export interface FormValues { amount: string; @@ -75,6 +76,9 @@ export function EnterAmountView({ onSuccess(tx.digest); toast.success('Stake transaction has been sent'); resetForm(); + ampli.stakedIota({ + stakedAmount: Number(BigInt(values.amount) / NANOS_PER_IOTA), + }); }, onError: () => { toast.error('Stake transaction was not sent'); diff --git a/apps/wallet-dashboard/components/dialogs/staking/views/EnterTimelockedAmountView.tsx b/apps/wallet-dashboard/components/dialogs/staking/views/EnterTimelockedAmountView.tsx index 543bf815a2f..08b705f89d7 100644 --- a/apps/wallet-dashboard/components/dialogs/staking/views/EnterTimelockedAmountView.tsx +++ b/apps/wallet-dashboard/components/dialogs/staking/views/EnterTimelockedAmountView.tsx @@ -3,13 +3,18 @@ import { useMemo } from 'react'; import { useFormatCoin, CoinFormat, useGetAllOwnedObjects, TIMELOCK_IOTA_TYPE } from '@iota/core'; -import { IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; +import { IOTA_TYPE_ARG, NANOS_PER_IOTA } from '@iota/iota-sdk/utils'; import { useFormikContext } from 'formik'; import { useSignAndExecuteTransaction } from '@iota/dapp-kit'; -import { useGetCurrentEpochStartTimestamp, useNewStakeTimelockedTransaction } from '@/hooks'; +import { + getAmountFromGroupedTimelockObjects, + useGetCurrentEpochStartTimestamp, + useNewStakeTimelockedTransaction, +} from '@/hooks'; import { prepareObjectsForTimelockedStakingTransaction } from '@/lib/utils'; import { EnterAmountDialogLayout } from './EnterAmountDialogLayout'; import toast from 'react-hot-toast'; +import { ampli } from '@/lib/utils/analytics'; interface FormValues { amount: string; @@ -42,20 +47,19 @@ export function EnterTimelockedAmountView({ StructType: TIMELOCK_IOTA_TYPE, }); const groupedTimelockObjects = useMemo(() => { - if (timelockedObjects && currentEpochMs) { - return prepareObjectsForTimelockedStakingTransaction( - timelockedObjects, - amountWithoutDecimals, - currentEpochMs, - ); - } else { - return []; - } + if (!timelockedObjects || !currentEpochMs) return []; + return prepareObjectsForTimelockedStakingTransaction( + timelockedObjects, + amountWithoutDecimals, + currentEpochMs, + ); }, [timelockedObjects, currentEpochMs, amountWithoutDecimals]); const { data: newStakeData, isLoading: isTransactionLoading } = useNewStakeTimelockedTransaction(selectedValidator, senderAddress, groupedTimelockObjects); + const stakedAmount = getAmountFromGroupedTimelockObjects(groupedTimelockObjects); + const hasGroupedTimelockObjects = groupedTimelockObjects.length > 0; const [maxTokenFormatted, maxTokenFormattedSymbol] = useFormatCoin( @@ -85,6 +89,10 @@ export function EnterTimelockedAmountView({ onSuccess: (tx) => { onSuccess?.(tx.digest); toast.success('Stake transaction has been sent'); + ampli.timelockStake({ + stakedAmount: Number(stakedAmount / NANOS_PER_IOTA), + validatorAddress: senderAddress, + }); resetForm(); }, onError: () => { diff --git a/apps/wallet-dashboard/components/dialogs/unstake/views/UnstakeTimelockedObjectsView.tsx b/apps/wallet-dashboard/components/dialogs/unstake/views/UnstakeTimelockedObjectsView.tsx index d023d8528b2..2bfcc7a1fad 100644 --- a/apps/wallet-dashboard/components/dialogs/unstake/views/UnstakeTimelockedObjectsView.tsx +++ b/apps/wallet-dashboard/components/dialogs/unstake/views/UnstakeTimelockedObjectsView.tsx @@ -25,6 +25,7 @@ import { import { useCurrentAccount, useSignAndExecuteTransaction } from '@iota/dapp-kit'; import { IotaSignAndExecuteTransactionOutput } from '@iota/wallet-standard'; import toast from 'react-hot-toast'; +import { ampli } from '@/lib/utils/analytics'; interface UnstakeTimelockedObjectsViewProps { onClose: () => void; @@ -84,6 +85,9 @@ export function UnstakeTimelockedObjectsView({ onSuccess: (tx) => { toast.success('Unstake transaction has been sent'); onSuccess(tx); + ampli.timelockUnstake({ + validatorAddress: groupedTimelockedObjects.validatorAddress, + }); }, }, ).catch(() => { diff --git a/apps/wallet-dashboard/components/dialogs/unstake/views/UnstakeView.tsx b/apps/wallet-dashboard/components/dialogs/unstake/views/UnstakeView.tsx index c925162ff02..1855ff04f17 100644 --- a/apps/wallet-dashboard/components/dialogs/unstake/views/UnstakeView.tsx +++ b/apps/wallet-dashboard/components/dialogs/unstake/views/UnstakeView.tsx @@ -29,6 +29,7 @@ import { DialogLayout, DialogLayoutFooter, DialogLayoutBody } from '../../layout import { useNewUnstakeTransaction } from '@/hooks'; import { IotaSignAndExecuteTransactionOutput } from '@iota/wallet-standard'; import toast from 'react-hot-toast'; +import { ampli } from '@/lib/utils/analytics'; interface UnstakeDialogProps { extendedStake: ExtendedDelegatedStake; @@ -84,6 +85,10 @@ export function UnstakeView({ onSuccess: (tx) => { toast.success('Unstake transaction has been sent'); onSuccess(tx); + + ampli.unstakedIota({ + validatorAddress: extendedStake.validatorAddress, + }); }, }, ).catch(() => { diff --git a/apps/wallet-dashboard/hooks/useNewStakeTransaction.ts b/apps/wallet-dashboard/hooks/useNewStakeTransaction.ts index 3e45ccd6144..899af5a2a1b 100644 --- a/apps/wallet-dashboard/hooks/useNewStakeTransaction.ts +++ b/apps/wallet-dashboard/hooks/useNewStakeTransaction.ts @@ -31,15 +31,21 @@ export function useNewStakeTransaction(validator: string, amount: bigint, sender }); } +export function getAmountFromGroupedTimelockObjects( + groupedTimelockObjects: GroupedTimelockObject[], +): bigint { + return groupedTimelockObjects.reduce( + (acc, obj) => acc + (obj.totalLockedAmount - (obj.splitAmount ?? 0n)), + 0n, + ); +} + export function useNewStakeTimelockedTransaction( validator: string, senderAddress: string, groupedTimelockObjects: GroupedTimelockObject[], ) { - const amount = groupedTimelockObjects.reduce( - (acc, obj) => acc + (obj.totalLockedAmount - (obj.splitAmount ?? 0n)), - 0n, - ); + const amount = getAmountFromGroupedTimelockObjects(groupedTimelockObjects); const client = useIotaClient(); return useQuery({ // eslint-disable-next-line @tanstack/query/exhaustive-deps diff --git a/apps/wallet-dashboard/hooks/usePersistedNetwork.ts b/apps/wallet-dashboard/hooks/usePersistedNetwork.ts index 9b4bbbf3c03..95afa45a097 100644 --- a/apps/wallet-dashboard/hooks/usePersistedNetwork.ts +++ b/apps/wallet-dashboard/hooks/usePersistedNetwork.ts @@ -6,6 +6,7 @@ import { NetworkConfiguration } from '@iota/iota-sdk/client'; import { useLocalStorage } from '@iota/core'; import toast from 'react-hot-toast'; import { useEffect } from 'react'; +import { ampli } from '@/lib/utils/analytics'; export function usePersistedNetwork() { const clientContext = useIotaClientContext(); @@ -26,6 +27,9 @@ export function usePersistedNetwork() { clientContext.selectNetwork(network.id); setPersistedNetwork(network.id); toast.success(`Switched to ${network.name}`); + ampli.switchedNetwork({ + toNetwork: network.name, + }); } useEffect(() => { diff --git a/apps/wallet-dashboard/lib/utils/analytics/ampli/index.ts b/apps/wallet-dashboard/lib/utils/analytics/ampli/index.ts index b5e49236573..fa637ca6b53 100644 --- a/apps/wallet-dashboard/lib/utils/analytics/ampli/index.ts +++ b/apps/wallet-dashboard/lib/utils/analytics/ampli/index.ts @@ -1,3 +1,6 @@ +// Modifications Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + /* tslint:disable */ /* eslint-disable */ // @ts-nocheck @@ -8,7 +11,7 @@ * To update run 'ampli pull web' * * Required dependencies: @amplitude/analytics-browser@^1.3.0 - * Tracking Plan Version: 1 + * Tracking Plan Version: 3 * Build: 1.0.0 * Runtime: browser:typescript-ampli-v2 * @@ -30,10 +33,10 @@ export const ApiKey: Record = { */ export const DefaultConfiguration: BrowserOptions = { plan: { - version: '1', + version: '3', branch: 'main', source: 'web', - versionId: '954386e3-441d-4aa5-b9ad-1f01e0a20e55', + versionId: 'fd563f8a-ce76-4f47-a8f5-296a8ac394f8', }, ...{ ingestionMetadata: { @@ -64,22 +67,206 @@ export type LoadOptions = | LoadOptionsWithApiKey | LoadOptionsWithClientInstance; +export interface ClickedCollectibleCardProperties { + collectibleType?: string; + objectId?: string; +} + +export interface ClickedStakeIotaProperties { + isCurrentlyStaking?: boolean; + sourceFlow?: string; +} + +export interface ClickedUnstakeIotaProperties { + /** + * | Rule | Value | + * |---|---| + * | Type | number | + */ + stakedAmount?: number; + validatorAddress?: string; +} + +export interface MigrationProperties { + /** + * | Rule | Value | + * |---|---| + * | Type | number | + */ + basicOutputObjects?: number; + /** + * | Rule | Value | + * |---|---| + * | Type | number | + */ + nftOutputObjects?: number; +} + export interface OpenedWalletDashboardProperties { + activeAccountType?: string; activeNetwork?: string; activeOrigin?: string; pagePath?: string; pagePathFragment?: string; + walletDashboardMode?: string; walletDashboardRev?: string; + walletDashboardVersion?: string; +} + +export interface SelectValidatorProperties { + validatorAddress?: string; + validatorAPY?: string; + validatorName?: string; +} + +export interface SentCoinsProperties { + coinType?: string; +} + +export interface SentCollectibleProperties { + objectId?: string; +} + +export interface StakedIotaProperties { + /** + * | Rule | Value | + * |---|---| + * | Type | number | + */ + stakedAmount?: number; + validatorAddress?: string; +} + +export interface SwitchedNetworkProperties { + toNetwork?: string; +} + +export interface TimelockStakeProperties { + /** + * | Rule | Value | + * |---|---| + * | Type | number | + */ + stakedAmount?: number; + validatorAddress?: string; +} + +export interface TimelockUnstakeProperties { + validatorAddress?: string; +} + +export interface UnstakedIotaProperties { + validatorAddress?: string; +} + +export class ClickedCollectibleCard implements BaseEvent { + event_type = 'clicked collectible card'; + + constructor(public event_properties?: ClickedCollectibleCardProperties) { + this.event_properties = event_properties; + } +} + +export class ClickedStakeIota implements BaseEvent { + event_type = 'clicked stake IOTA'; + + constructor(public event_properties?: ClickedStakeIotaProperties) { + this.event_properties = event_properties; + } +} + +export class ClickedUnstakeIota implements BaseEvent { + event_type = 'clicked unstake IOTA'; + + constructor(public event_properties?: ClickedUnstakeIotaProperties) { + this.event_properties = event_properties; + } +} + +export class Migration implements BaseEvent { + event_type = 'migration'; + + constructor(public event_properties?: MigrationProperties) { + this.event_properties = event_properties; + } } export class OpenedWalletDashboard implements BaseEvent { - event_type = 'Opened wallet dashboard'; + event_type = 'opened wallet dashboard'; constructor(public event_properties?: OpenedWalletDashboardProperties) { this.event_properties = event_properties; } } +export class SelectValidator implements BaseEvent { + event_type = 'select validator'; + + constructor(public event_properties?: SelectValidatorProperties) { + this.event_properties = event_properties; + } +} + +export class SentCoins implements BaseEvent { + event_type = 'sent coins'; + + constructor(public event_properties?: SentCoinsProperties) { + this.event_properties = event_properties; + } +} + +export class SentCollectible implements BaseEvent { + event_type = 'sent collectible'; + + constructor(public event_properties?: SentCollectibleProperties) { + this.event_properties = event_properties; + } +} + +export class StakedIota implements BaseEvent { + event_type = 'staked IOTA'; + + constructor(public event_properties?: StakedIotaProperties) { + this.event_properties = event_properties; + } +} + +export class SwitchedNetwork implements BaseEvent { + event_type = 'switched network'; + + constructor(public event_properties?: SwitchedNetworkProperties) { + this.event_properties = event_properties; + } +} + +export class TimelockCollect implements BaseEvent { + event_type = 'timelock collect'; +} + +export class TimelockStake implements BaseEvent { + event_type = 'timelock stake'; + + constructor(public event_properties?: TimelockStakeProperties) { + this.event_properties = event_properties; + } +} + +export class TimelockUnstake implements BaseEvent { + event_type = 'timelock unstake'; + + constructor(public event_properties?: TimelockUnstakeProperties) { + this.event_properties = event_properties; + } +} + +export class UnstakedIota implements BaseEvent { + event_type = 'unstaked IOTA'; + + constructor(public event_properties?: UnstakedIotaProperties) { + this.event_properties = event_properties; + } +} + export type PromiseResult = { promise: Promise }; const getVoidPromiseResult = () => ({ promise: Promise.resolve() }); @@ -190,13 +377,81 @@ export class Ampli { } /** - * Opened wallet dashboard + * clicked collectible card * - * [View in Tracking Plan](https://data.eu.amplitude.com/iota-foundation/IOTA%20Wallet%20Dashboard/events/main/latest/Opened%20wallet%20dashboard) + * [View in Tracking Plan](https://data.eu.amplitude.com/iota-foundation/IOTA%20Wallet%20Dashboard/events/main/latest/clicked%20collectible%20card) * * Event has no description in tracking plan. * - * @param properties The event's properties (e.g. activeNetwork) + * @param properties The event's properties (e.g. collectibleType) + * @param options Amplitude event options. + */ + clickedCollectibleCard( + properties?: ClickedCollectibleCardProperties, + options?: EventOptions, + ) { + return this.track(new ClickedCollectibleCard(properties), options); + } + + /** + * clicked stake IOTA + * + * [View in Tracking Plan](https://data.eu.amplitude.com/iota-foundation/IOTA%20Wallet%20Dashboard/events/main/latest/clicked%20stake%20IOTA) + * + * Event has no description in tracking plan. + * + * @param properties The event's properties (e.g. isCurrentlyStaking) + * @param options Amplitude event options. + */ + clickedStakeIota( + properties?: ClickedStakeIotaProperties, + options?: EventOptions, + ) { + return this.track(new ClickedStakeIota(properties), options); + } + + /** + * clicked unstake IOTA + * + * [View in Tracking Plan](https://data.eu.amplitude.com/iota-foundation/IOTA%20Wallet%20Dashboard/events/main/latest/clicked%20unstake%20IOTA) + * + * Event has no description in tracking plan. + * + * @param properties The event's properties (e.g. stakedAmount) + * @param options Amplitude event options. + */ + clickedUnstakeIota( + properties?: ClickedUnstakeIotaProperties, + options?: EventOptions, + ) { + return this.track(new ClickedUnstakeIota(properties), options); + } + + /** + * migration + * + * [View in Tracking Plan](https://data.eu.amplitude.com/iota-foundation/IOTA%20Wallet%20Dashboard/events/main/latest/migration) + * + * Event has no description in tracking plan. + * + * @param properties The event's properties (e.g. basicOutputObjects) + * @param options Amplitude event options. + */ + migration( + properties?: MigrationProperties, + options?: EventOptions, + ) { + return this.track(new Migration(properties), options); + } + + /** + * opened wallet dashboard + * + * [View in Tracking Plan](https://data.eu.amplitude.com/iota-foundation/IOTA%20Wallet%20Dashboard/events/main/latest/opened%20wallet%20dashboard) + * + * Opened Wallet Dashboard + * + * @param properties The event's properties (e.g. activeAccountType) * @param options Amplitude event options. */ openedWalletDashboard( @@ -205,6 +460,157 @@ export class Ampli { ) { return this.track(new OpenedWalletDashboard(properties), options); } + + /** + * select validator + * + * [View in Tracking Plan](https://data.eu.amplitude.com/iota-foundation/IOTA%20Wallet%20Dashboard/events/main/latest/select%20validator) + * + * Event has no description in tracking plan. + * + * @param properties The event's properties (e.g. validatorAddress) + * @param options Amplitude event options. + */ + selectValidator( + properties?: SelectValidatorProperties, + options?: EventOptions, + ) { + return this.track(new SelectValidator(properties), options); + } + + /** + * sent coins + * + * [View in Tracking Plan](https://data.eu.amplitude.com/iota-foundation/IOTA%20Wallet%20Dashboard/events/main/latest/sent%20coins) + * + * Event has no description in tracking plan. + * + * @param properties The event's properties (e.g. coinType) + * @param options Amplitude event options. + */ + sentCoins( + properties?: SentCoinsProperties, + options?: EventOptions, + ) { + return this.track(new SentCoins(properties), options); + } + + /** + * sent collectible + * + * [View in Tracking Plan](https://data.eu.amplitude.com/iota-foundation/IOTA%20Wallet%20Dashboard/events/main/latest/sent%20collectible) + * + * Event has no description in tracking plan. + * + * @param properties The event's properties (e.g. objectId) + * @param options Amplitude event options. + */ + sentCollectible( + properties?: SentCollectibleProperties, + options?: EventOptions, + ) { + return this.track(new SentCollectible(properties), options); + } + + /** + * staked IOTA + * + * [View in Tracking Plan](https://data.eu.amplitude.com/iota-foundation/IOTA%20Wallet%20Dashboard/events/main/latest/staked%20IOTA) + * + * Event has no description in tracking plan. + * + * @param properties The event's properties (e.g. stakedAmount) + * @param options Amplitude event options. + */ + stakedIota( + properties?: StakedIotaProperties, + options?: EventOptions, + ) { + return this.track(new StakedIota(properties), options); + } + + /** + * switched network + * + * [View in Tracking Plan](https://data.eu.amplitude.com/iota-foundation/IOTA%20Wallet%20Dashboard/events/main/latest/switched%20network) + * + * Event has no description in tracking plan. + * + * @param properties The event's properties (e.g. toNetwork) + * @param options Amplitude event options. + */ + switchedNetwork( + properties?: SwitchedNetworkProperties, + options?: EventOptions, + ) { + return this.track(new SwitchedNetwork(properties), options); + } + + /** + * timelock collect + * + * [View in Tracking Plan](https://data.eu.amplitude.com/iota-foundation/IOTA%20Wallet%20Dashboard/events/main/latest/timelock%20collect) + * + * Event has no description in tracking plan. + * + * @param options Amplitude event options. + */ + timelockCollect( + options?: EventOptions, + ) { + return this.track(new TimelockCollect(), options); + } + + /** + * timelock stake + * + * [View in Tracking Plan](https://data.eu.amplitude.com/iota-foundation/IOTA%20Wallet%20Dashboard/events/main/latest/timelock%20stake) + * + * Event has no description in tracking plan. + * + * @param properties The event's properties (e.g. stakedAmount) + * @param options Amplitude event options. + */ + timelockStake( + properties?: TimelockStakeProperties, + options?: EventOptions, + ) { + return this.track(new TimelockStake(properties), options); + } + + /** + * timelock unstake + * + * [View in Tracking Plan](https://data.eu.amplitude.com/iota-foundation/IOTA%20Wallet%20Dashboard/events/main/latest/timelock%20unstake) + * + * Event has no description in tracking plan. + * + * @param properties The event's properties (e.g. validatorAddress) + * @param options Amplitude event options. + */ + timelockUnstake( + properties?: TimelockUnstakeProperties, + options?: EventOptions, + ) { + return this.track(new TimelockUnstake(properties), options); + } + + /** + * unstaked IOTA + * + * [View in Tracking Plan](https://data.eu.amplitude.com/iota-foundation/IOTA%20Wallet%20Dashboard/events/main/latest/unstaked%20IOTA) + * + * Event has no description in tracking plan. + * + * @param properties The event's properties (e.g. validatorAddress) + * @param options Amplitude event options. + */ + unstakedIota( + properties?: UnstakedIotaProperties, + options?: EventOptions, + ) { + return this.track(new UnstakedIota(properties), options); + } } export const ampli = new Ampli(); diff --git a/apps/wallet-dashboard/prependlicense.mjs b/apps/wallet-dashboard/prependLicense.mjs similarity index 54% rename from apps/wallet-dashboard/prependlicense.mjs rename to apps/wallet-dashboard/prependLicense.mjs index ae707b763f6..99f3e86d0a4 100644 --- a/apps/wallet-dashboard/prependlicense.mjs +++ b/apps/wallet-dashboard/prependLicense.mjs @@ -1,11 +1,9 @@ -// Copyright (c) Mysten Labs, Inc. -// Modifications Copyright (c) 2024 IOTA Stiftung +// Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 import { readFile, writeFile } from 'fs/promises'; -const LICENSE = - '// Copyright (c) Mysten Labs, Inc.\n// Modifications Copyright (c) 2024 IOTA Stiftung\n// SPDX-License-Identifier: Apache-2.0\n\n'; +const LICENSE = '// Copyright (c) 2024 IOTA Stiftung\n// SPDX-License-Identifier: Apache-2.0\n\n'; async function prependLicense(filename) { const content = await readFile(filename, 'utf8'); From 3e02a8a4f9fdfa25282ca5f27ae4c0a8feac26ae Mon Sep 17 00:00:00 2001 From: Sergiu Popescu <44298302+sergiupopescu199@users.noreply.github.com> Date: Thu, 30 Jan 2025 15:56:32 +0100 Subject: [PATCH 43/51] refactor: implement graceful shutdown for `IndexerExecutor` (#4648) * refactor: use CancellationToken for IndexerExecutor * refactor: implement graceful shutdown for IndexerExecutor * update: Include graceful shutdown in README.md * fixup! refactor: implement graceful shutdown for IndexerExecutor * fixup! fixup! refactor: implement graceful shutdown for IndexerExecutor * fixup! fixup! fixup! refactor: implement graceful shutdown for IndexerExecutor * fix: update README.md * fix: add lib docs about graceful shutdown --- crates/iota-data-ingestion-core/README.md | 73 ++++-- .../iota-data-ingestion-core/src/executor.rs | 107 ++++++--- crates/iota-data-ingestion-core/src/lib.rs | 22 ++ crates/iota-data-ingestion-core/src/reader.rs | 5 +- crates/iota-data-ingestion-core/src/tests.rs | 27 ++- .../src/worker_pool.rs | 223 ++++++++++++------ crates/iota-data-ingestion/src/main.rs | 6 +- .../src/iota_datasource.rs | 6 +- crates/iota-indexer/src/indexer.rs | 2 +- examples/custom-indexer/rust/local_reader.rs | 2 +- 10 files changed, 336 insertions(+), 137 deletions(-) diff --git a/crates/iota-data-ingestion-core/README.md b/crates/iota-data-ingestion-core/README.md index 814c17d7534..f5dedecd2c7 100644 --- a/crates/iota-data-ingestion-core/README.md +++ b/crates/iota-data-ingestion-core/README.md @@ -239,11 +239,13 @@ pub struct IndexerExecutor

{ // Listens on synced checkpoints from Worker Pools and performs GC operation pool_progress_receiver: mpsc::Receiver<(String, CheckpointSequenceNumber)>, metrics: DataIngestionMetrics, + // Receive graceful shutdown signal + token: CancellationToken, } ``` ```rust -pub fn new(progress_store: P, number_of_jobs: usize, metrics: DataIngestionMetrics) -> Self {..} +pub fn new(progress_store: P, number_of_jobs: usize, metrics: DataIngestionMetrics, token: CancellationToken) -> Self {..} ``` Instantiating an `IndexerExecutor` using the [new](https://github.com/iotaledger/iota/blob/develop/crates/iota-data-ingestion-core/src/executor.rs#L35) method requires careful consideration of the `number_of_jobs` parameter. This parameter determines the capacity of a buffered `mpsc` channel used for communication, calculated as `number_of_jobs * MAX_CHECKPOINTS_IN_PROGRESS` (where `MAX_CHECKPOINTS_IN_PROGRESS` is defined as 10000). The sender end of this channel is cloned and provided to each registered `WorkerPool`. Each `WorkerPool` also maintains its internal buffered channel with a capacity of `MAX_CHECKPOINTS_IN_PROGRESS` to track its internal progress. Therefore, as a best practice, the `number_of_jobs` should be set equal to the number of registered worker pools to ensure efficient and reliable communication of progress updates. @@ -265,8 +267,6 @@ pub async fn run( remote_store_options: Vec<(String, String)>, // Customize and optimize the Checkpoint fetch behavior reader_options: ReaderOptions, - // Graceful shutdown signal - mut exit_receiver: oneshot::Receiver<()>, ) -> Result {..} ``` @@ -319,25 +319,47 @@ for pool in std::mem::take(&mut self.pools) { } ``` -Finally, the actor enters a loop with a `tokio::select!` statement to handle three distinct execution branches: +Finally, the actor enters a loop with a `tokio::select!` statement to handle two distinct execution branches: ```rust tokio::select! { - // Handle graceful shutdown - _ = &mut exit_receiver => break, - // Receive processed checkpoints from Worker Pools, update the ProgressStore, - // calculate its minimum watermark and perform GC operation - Some((task_name, sequence_number)) = self.pool_progress_receiver.recv() => { - self.progress_store.save(task_name.clone(), sequence_number).await?; - let seq_number = self.progress_store.min_watermark()?; - if seq_number > reader_checkpoint_number { - gc_sender.send(seq_number).await?; - reader_checkpoint_number = seq_number; + Some(worker_pool_progress_msg) = self.pool_progress_receiver.recv() => { + match worker_pool_progress_msg { + // Receive processed checkpoints from Worker Pools, update the ProgressStore, + // calculate its minimum watermark and perform GC operation + WorkerPoolMsg::Progress((task_name, sequence_number)) => { + self.progress_store.save(task_name.clone(), sequence_number).await?; + let seq_number = self.progress_store.min_watermark()?; + if seq_number > reader_checkpoint_number { + gc_sender.send(seq_number).await?; + reader_checkpoint_number = seq_number; + } + self.metrics.data_ingestion_checkpoint.with_label_values(&[&task_name]).set(sequence_number as i64); + } + // Manages the graceful shutdown sequence of the entire indexer system. + WorkerPoolMsg::ShutDown(worker_pool_name) => { + // Track worker pools that have initiated shutdown + worker_pools_shutdown_signals.push(worker_pool_name); + // Once all workers pools have signaled completion, await their handles + // This ensures all workers have finished their final tasks + if worker_pools_shutdown_signals.len() == self.pool_senders.len() { + for worker in worker_pools { + // Await the Worker actor completion + worker.await?; + } + // Send shutdown signal to CheckpointReader Actor + _ = exit_sender.send(()); + // Await the CheckpointReader actor completion + checkpoint_reader_handle.await??; + break; + } + } } - self.metrics.data_ingestion_checkpoint.with_label_values(&[&task_name]).set(sequence_number as i64); } // Distribution of checkpoints across Worker pools - Some(checkpoint) = checkpoint_recv.recv() => { + // Only process new checkpoints while system is running (token not cancelled). + // The guard prevents accepting new work during shutdown while allowing existing work to complete for other branches. + Some(checkpoint) = checkpoint_recv.recv(), if !self.token.is_cancelled() => { for sender in &self.pool_senders { sender.send(checkpoint.clone()).await?; } @@ -345,9 +367,22 @@ tokio::select! { } ``` -- The first branch handles the graceful shutdown of the executor. -- The second branch is responsible for receiving the progress of processed checkpoints from worker pools, and it records the current processing sequence number for each task in the progress store. Calculates the lowest processed sequence number across all tasks. If the minimum watermark exceeds the checkpoint reader's current watermark, it signals the reader to initiate garbage collection. Updates the checkpoint reader's last pruned watermark to reflect the new minimum. -- The third branch is responsible for distributing the incoming checkpoints from `CheckpointReader` across all Workers Pools. +- The first branch is responsible for receiving the progress of processed checkpoints from worker pools, it accepts two kinds of messages: + - `WorkerPool::Progress`: it records the current processing sequence number for each task in the progress store. Calculates the lowest processed sequence number across all tasks. If the minimum watermark exceeds the checkpoint reader's current watermark, it signals the reader to initiate garbage collection. Updates the checkpoint reader's last pruned watermark to reflect the new minimum. + - `WorkerPoolMsg::ShutDown`: orchestrates graceful system termination. When `WorkerPools` detect token cancellation, they complete their current work and notify the executor via this message. Once all pools report completion, the executor coordinates the final shutdown by awaiting pool tasks, stopping the checkpoint reader, and ensuring orderly system termination. This sequence guarantees data integrity and proper component cleanup. +- The second branch is responsible for distributing the incoming checkpoints from `CheckpointReader` across all Workers Pools. The guard `if !self.token.is_cancelled()` prevents the acceptance of new work during shutdown while allowing existing work to be completed, ensuring a clean transition to system termination. + +> [!NOTE] +> +> The shutdown sequence in the data ingestion system follows a carefully orchestrated flow that ensures all components terminate cleanly while preserving data integrity. When a shutdown is initiated via the [CancellationToken](https://docs.rs/tokio-util/latest/tokio_util/sync/struct.CancellationToken.html), it triggers a cascade of graceful shutdowns starting from the innermost workers up through the system hierarchy. +> +> At the worker level, individual workers within each `WorkerPool` detect the cancellation signal and begin their shutdown sequence. They first complete processing their current checkpoint and ensure all progress updates are sent through their respective channels. This guarantees that no work is interrupted mid-processing and all progress is properly recorded. +> +> The `WorkerPool` coordinates shutdown through its workers' completion signals rather than the cancellation token directly. While individual workers shut down upon detecting the token cancellation, the pool itself tracks these shutdowns through received `WorkerStatus::Shutdown` messages from each worker. Only when the pool has received shutdown signals matching its total number of workers does it send `WorkerPoolStatus::Shutdown` to the IndexerExecutor. During this process, the pool continues processing any remaining progress messages, ensuring all work is completed before signaling its final shutdown to the executor. +> +> The `IndexerExecutor` acts as the orchestrator for the entire shutdown process. It continues to process progress messages from all pools while tracking which pools have completed their shutdown via the received `WorkerPoolStatus::Shutdown` signals. Only when all worker pools have reported their shutdown does the executor proceed with the final shutdown steps. It then awaits the completion of all worker pool tasks, signals the `CheckpointReader` to stop, and ensures all components have terminated properly before shutting down itself. +> +> This hierarchical shutdown approach ensures that data integrity is maintained throughout the shutdown process, with no work being interrupted and all progress being saved to storage. The shutdown sequence flows from workers to pools to executor, with each level waiting for its subordinate components to complete before finalizing its own shutdown. This creates a clean, predictable shutdown pattern that prevents data loss and maintains system consistency. ## Use cases diff --git a/crates/iota-data-ingestion-core/src/executor.rs b/crates/iota-data-ingestion-core/src/executor.rs index fd0490494a3..e8ce076b684 100644 --- a/crates/iota-data-ingestion-core/src/executor.rs +++ b/crates/iota-data-ingestion-core/src/executor.rs @@ -11,14 +11,17 @@ use iota_types::{ full_checkpoint_content::CheckpointData, messages_checkpoint::CheckpointSequenceNumber, }; use prometheus::Registry; -use tokio::sync::mpsc; +use tokio::{ + sync::{mpsc, oneshot}, + task::JoinHandle, +}; use tokio_util::sync::CancellationToken; use crate::{ DataIngestionMetrics, ReaderOptions, Worker, progress_store::{ExecutorProgress, ProgressStore, ProgressStoreWrapper, ShimProgressStore}, reader::CheckpointReader, - worker_pool::WorkerPool, + worker_pool::{WorkerPool, WorkerPoolStatus}, }; pub const MAX_CHECKPOINTS_IN_PROGRESS: usize = 10000; @@ -27,22 +30,29 @@ pub struct IndexerExecutor

{ pools: Vec + Send>>>, pool_senders: Vec>, progress_store: ProgressStoreWrapper

, - pool_progress_sender: mpsc::Sender<(String, CheckpointSequenceNumber)>, - pool_progress_receiver: mpsc::Receiver<(String, CheckpointSequenceNumber)>, + pool_status_sender: mpsc::Sender, + pool_status_receiver: mpsc::Receiver, metrics: DataIngestionMetrics, + token: CancellationToken, } impl IndexerExecutor

{ - pub fn new(progress_store: P, number_of_jobs: usize, metrics: DataIngestionMetrics) -> Self { - let (pool_progress_sender, pool_progress_receiver) = + pub fn new( + progress_store: P, + number_of_jobs: usize, + metrics: DataIngestionMetrics, + token: CancellationToken, + ) -> Self { + let (pool_status_sender, pool_status_receiver) = mpsc::channel(number_of_jobs * MAX_CHECKPOINTS_IN_PROGRESS); Self { pools: vec![], pool_senders: vec![], progress_store: ProgressStoreWrapper::new(progress_store), - pool_progress_sender, - pool_progress_receiver, + pool_status_sender, + pool_status_receiver, metrics, + token, } } @@ -53,7 +63,8 @@ impl IndexerExecutor

{ self.pools.push(Box::pin(pool.run( checkpoint_number, receiver, - self.pool_progress_sender.clone(), + self.pool_status_sender.clone(), + self.token.child_token(), ))); self.pool_senders.push(sender); Ok(()) @@ -66,10 +77,9 @@ impl IndexerExecutor

{ remote_store_url: Option, remote_store_options: Vec<(String, String)>, reader_options: ReaderOptions, - token: CancellationToken, ) -> Result { let mut reader_checkpoint_number = self.progress_store.min_watermark()?; - let (checkpoint_reader, mut checkpoint_recv, gc_sender, _exit_sender) = + let (checkpoint_reader, mut checkpoint_recv, gc_sender, exit_sender) = CheckpointReader::initialize( path, reader_checkpoint_number, @@ -77,34 +87,78 @@ impl IndexerExecutor

{ remote_store_options, reader_options, ); - spawn_monitored_task!(checkpoint_reader.run()); - for pool in std::mem::take(&mut self.pools) { - spawn_monitored_task!(pool); - } + let checkpoint_reader_handle = spawn_monitored_task!(checkpoint_reader.run()); + + let worker_pools = std::mem::take(&mut self.pools) + .into_iter() + .map(|pool| spawn_monitored_task!(pool)) + .collect::>>(); + + let mut worker_pools_shutdown_signals = vec![]; + loop { tokio::select! { - _ = token.cancelled() => break, - Some((task_name, sequence_number)) = self.pool_progress_receiver.recv() => { - self.progress_store.save(task_name.clone(), sequence_number).await?; - let seq_number = self.progress_store.min_watermark()?; - if seq_number > reader_checkpoint_number { - gc_sender.send(seq_number).await?; - reader_checkpoint_number = seq_number; + Some(worker_pool_progress_msg) = self.pool_status_receiver.recv() => { + match worker_pool_progress_msg { + WorkerPoolStatus::Running((task_name, sequence_number)) => { + self.progress_store.save(task_name.clone(), sequence_number).await?; + let seq_number = self.progress_store.min_watermark()?; + if seq_number > reader_checkpoint_number { + gc_sender.send(seq_number).await?; + reader_checkpoint_number = seq_number; + } + self.metrics.data_ingestion_checkpoint.with_label_values(&[&task_name]).set(sequence_number as i64); + } + WorkerPoolStatus::Shutdown(worker_pool_name) => { + // Track worker pools that have initiated shutdown + worker_pools_shutdown_signals.push(worker_pool_name); + } } - self.metrics.data_ingestion_checkpoint.with_label_values(&[&task_name]).set(sequence_number as i64); } - Some(checkpoint) = checkpoint_recv.recv() => { + // Only process new checkpoints while system is running (token not cancelled). + // The guard prevents accepting new work during shutdown while allowing existing work to complete for other branches. + Some(checkpoint) = checkpoint_recv.recv(), if !self.token.is_cancelled() => { for sender in &self.pool_senders { sender.send(checkpoint.clone()).await?; } } } + + // Once all workers pools have signaled completion, start the graceful shutdown + // process + if worker_pools_shutdown_signals.len() == self.pool_senders.len() { + break components_graceful_shutdown( + worker_pools, + exit_sender, + checkpoint_reader_handle, + ) + .await?; + } } + Ok(self.progress_store.stats()) } } +/// Start the graceful shutdown of remaining components +/// +/// - Awaits all worker pool handles +/// - Send shutdown signal to checkpoint reader actor +/// - Await checkpoint reader handle +async fn components_graceful_shutdown( + worker_pools: Vec>, + exit_sender: oneshot::Sender<()>, + checkpoint_reader_handle: JoinHandle>, +) -> Result<()> { + for worker_pool in worker_pools { + worker_pool.await?; + } + _ = exit_sender.send(()); + checkpoint_reader_handle.await??; + Ok(()) +} + pub async fn setup_single_workflow( worker: W, remote_store_url: String, @@ -115,10 +169,10 @@ pub async fn setup_single_workflow( impl Future>, CancellationToken, )> { - let token = CancellationToken::new(); let metrics = DataIngestionMetrics::new(&Registry::new()); let progress_store = ShimProgressStore(initial_checkpoint_number); - let mut executor = IndexerExecutor::new(progress_store, 1, metrics); + let token = CancellationToken::new(); + let mut executor = IndexerExecutor::new(progress_store, 1, metrics, token.child_token()); let worker_pool = WorkerPool::new(worker, "workflow".to_string(), concurrency); executor.register(worker_pool).await?; Ok(( @@ -127,7 +181,6 @@ pub async fn setup_single_workflow( Some(remote_store_url), vec![], reader_options.unwrap_or_default(), - token.clone(), ), token, )) diff --git a/crates/iota-data-ingestion-core/src/lib.rs b/crates/iota-data-ingestion-core/src/lib.rs index f110488f758..74b419ac8d1 100644 --- a/crates/iota-data-ingestion-core/src/lib.rs +++ b/crates/iota-data-ingestion-core/src/lib.rs @@ -2,6 +2,28 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 +//! This library provides an easy way to create custom indexers. +//!
+//! +//! ## Graceful shutdown +//! +//! The shutdown sequence in the data ingestion system ensures clean termination +//! of all components while preserving data integrity. It is initiated via a +//! [CancellationToken](tokio_util::sync::CancellationToken), which triggers a +//! hierarchical and graceful shutdown process. +//! +//! The shutdown process follows a top-down hierarchy: +//! 1. [`Worker`]: Individual workers within a [`WorkerPool`] detect the +//! cancellation signal, completes current checkpoint processing, sends final +//! progress updates and signals completion to parent [`WorkerPool`] via +//! `WorkerStatus::Shutdown` message. +//! 2. [`WorkerPool`]: Coordinates worker shutdowns, ensures all progress +//! messages are processed, waits for all workers' shutdown signals and +//! notifies [`IndexerExecutor`] with `WorkerPoolStatus::Shutdown` message +//! when fully terminated. +//! 3. [`IndexerExecutor`]: Orchestrates the shutdown of all worker pools and +//! and finalizes system termination. + mod executor; mod metrics; mod progress_store; diff --git a/crates/iota-data-ingestion-core/src/reader.rs b/crates/iota-data-ingestion-core/src/reader.rs index 52d48539cb1..b7018fbc8ce 100644 --- a/crates/iota-data-ingestion-core/src/reader.rs +++ b/crates/iota-data-ingestion-core/src/reader.rs @@ -17,7 +17,10 @@ use notify::{RecursiveMode, Watcher}; use object_store::{ObjectStore, path::Path}; use tap::pipe::Pipe; use tokio::{ - sync::{mpsc, mpsc::error::TryRecvError, oneshot}, + sync::{ + mpsc::{self, error::TryRecvError}, + oneshot, + }, time::timeout, }; use tracing::{debug, error, info}; diff --git a/crates/iota-data-ingestion-core/src/tests.rs b/crates/iota-data-ingestion-core/src/tests.rs index e271f69be93..6d63c045393 100644 --- a/crates/iota-data-ingestion-core/src/tests.rs +++ b/crates/iota-data-ingestion-core/src/tests.rs @@ -42,6 +42,7 @@ async fn run( indexer: IndexerExecutor, path: Option, duration: Option, + token: CancellationToken, ) -> Result { let options = ReaderOptions { tick_interval_ms: 10, @@ -52,24 +53,15 @@ async fn run( match duration { None => { indexer - .run( - path.unwrap_or_else(temp_dir), - None, - vec![], - options, - CancellationToken::new(), - ) + .run(path.unwrap_or_else(temp_dir), None, vec![], options) .await } Some(duration) => { - let token = CancellationToken::new(); - let token_child = token.child_token(); let handle = tokio::task::spawn(indexer.run( path.unwrap_or_else(temp_dir), None, vec![], options, - token_child, )); tokio::time::sleep(duration).await; token.cancel(); @@ -81,6 +73,7 @@ async fn run( struct ExecutorBundle { executor: IndexerExecutor, _progress_file: NamedTempFile, + token: CancellationToken, } #[derive(Clone)] @@ -96,7 +89,7 @@ impl Worker for TestWorker { #[tokio::test] async fn empty_pools() { let bundle = create_executor_bundle(); - let result = run(bundle.executor, None, None).await; + let result = run(bundle.executor, None, None, bundle.token).await; assert!(result.is_err()); if let Err(err) = result { assert!(err.to_string().contains("pools can't be empty")); @@ -114,7 +107,13 @@ async fn basic_flow() { let bytes = mock_checkpoint_data_bytes(checkpoint_number); std::fs::write(path.join(format!("{}.chk", checkpoint_number)), bytes).unwrap(); } - let result = run(bundle.executor, Some(path), Some(Duration::from_secs(1))).await; + let result = run( + bundle.executor, + Some(path), + Some(Duration::from_secs(1)), + bundle.token, + ) + .await; assert!(result.is_ok()); assert_eq!(result.unwrap().get("test"), Some(&20)); } @@ -130,14 +129,18 @@ fn create_executor_bundle() -> ExecutorBundle { let path = progress_file.path().to_path_buf(); std::fs::write(path.clone(), "{}").unwrap(); let progress_store = FileProgressStore::new(path); + let token = CancellationToken::new(); + let child_token = token.child_token(); let executor = IndexerExecutor::new( progress_store, 1, DataIngestionMetrics::new(&Registry::new()), + child_token, ); ExecutorBundle { executor, _progress_file: progress_file, + token, } } diff --git a/crates/iota-data-ingestion-core/src/worker_pool.rs b/crates/iota-data-ingestion-core/src/worker_pool.rs index 4934f2c4010..08b61afe0f6 100644 --- a/crates/iota-data-ingestion-core/src/worker_pool.rs +++ b/crates/iota-data-ingestion-core/src/worker_pool.rs @@ -12,17 +12,51 @@ use iota_metrics::spawn_monitored_task; use iota_types::{ full_checkpoint_content::CheckpointData, messages_checkpoint::CheckpointSequenceNumber, }; -use tokio::sync::{mpsc, oneshot}; +use tokio::{sync::mpsc, task::JoinHandle}; +use tokio_util::sync::CancellationToken; use tracing::info; use crate::{Worker, executor::MAX_CHECKPOINTS_IN_PROGRESS}; +type TaskName = String; +type WorkerID = usize; + pub struct WorkerPool { pub task_name: String, concurrency: usize, worker: Arc, } +/// Represents the possible message types a WorkerPool can communicate with +/// external components +#[derive(Debug, Clone)] +pub enum WorkerPoolStatus { + /// Message with information (e.g. `(, + /// checkpoint_sequence_number)`) about the ingestion progress. + Running((TaskName, CheckpointSequenceNumber)), + /// Message with information (e.g. ``) about shutdown status + Shutdown(String), +} + +/// Represents the possible message types a Worker can communicate with external +/// components +#[derive(Debug, Clone, Copy)] +enum WorkerStatus { + /// Message with information (e.g. `(, + /// checkpoint_sequence_number, + /// )`) about the ingestion + /// progress. + Running( + ( + WorkerID, + CheckpointSequenceNumber, + Option, + ), + ), + /// Message with information (e.g. ``) about shutdown status + Shutdown(WorkerID), +} + impl WorkerPool { pub fn new(worker: W, task_name: String, concurrency: usize) -> Self { Self { @@ -35,7 +69,8 @@ impl WorkerPool { self, mut current_checkpoint_number: CheckpointSequenceNumber, mut checkpoint_receiver: mpsc::Receiver, - executor_progress_sender: mpsc::Sender<(String, CheckpointSequenceNumber)>, + pool_status_sender: mpsc::Sender, + token: CancellationToken, ) { info!( "Starting indexing pipeline {} with concurrency {}. Current watermark is {}.", @@ -44,26 +79,114 @@ impl WorkerPool { let mut updates = HashMap::new(); let (progress_sender, mut progress_receiver) = mpsc::channel(MAX_CHECKPOINTS_IN_PROGRESS); - let mut workers = vec![]; let mut idle: BTreeSet<_> = (0..self.concurrency).collect(); let mut checkpoints = VecDeque::new(); + let mut workers_shutdown_signals = vec![]; + + let (workers, workers_join_handles) = self.spawn_workers(progress_sender, token.clone()); + + // main worker pool loop + loop { + tokio::select! { + Some(worker_progress_msg) = progress_receiver.recv() => { + match worker_progress_msg { + WorkerStatus::Running((worker_id, status_update, progress_watermark)) => { + idle.insert(worker_id); + updates.insert(status_update, progress_watermark); + if status_update == current_checkpoint_number { + let mut executor_status_update = None; + while let Some(progress_watermark) = updates.remove(¤t_checkpoint_number) { + if let Some(watermark) = progress_watermark { + executor_status_update = Some(watermark + 1); + } + current_checkpoint_number += 1; + } + if let Some(update) = executor_status_update { + if pool_status_sender + .send(WorkerPoolStatus::Running((self.task_name.clone(), update))) + .await.is_err() { + // The executor progress channel closing is a sign we need to + // exit this loop. + break; + } + } + } + // By checking if token was not cancelled we ensure that no + // further checkpoints will be sent to the workers + while !token.is_cancelled() && !checkpoints.is_empty() && !idle.is_empty() { + let checkpoint = checkpoints.pop_front().unwrap(); + let worker_id = idle.pop_first().unwrap(); + if workers[worker_id].send(checkpoint).await.is_err() { + // The worker channel closing is a sign we need to exit this loop. + break; + } + } + } + WorkerStatus::Shutdown(worker_id) => { + // Track workers that have initiated shutdown + workers_shutdown_signals.push(worker_id); + } + } + } + + // Adding an if guard to this branch ensure that no checkpoints + // will be sent to workers once the token has been cancelled + Some(checkpoint) = checkpoint_receiver.recv(), if !token.is_cancelled() => { + let sequence_number = checkpoint.checkpoint_summary.sequence_number; + if sequence_number < current_checkpoint_number { + continue; + } + self.worker.preprocess_hook(checkpoint.clone()).expect("failed to preprocess task"); + if idle.is_empty() { + checkpoints.push_back(checkpoint); + } else { + let worker_id = idle.pop_first().unwrap(); + if workers[worker_id].send(checkpoint).await.is_err() { + // The worker channel closing is a sign we need to exit this loop. + break; + }; + } + } + } + + // Once all workers have signaled completion, start the graceful shutdown + // process + if workers_shutdown_signals.len() == self.concurrency { + break self + .workers_graceful_shutdown(workers_join_handles, pool_status_sender) + .await; + } + } + } - let mut join_handles = vec![]; + /// Spawn workers based on `self.concurrency` to process checkpoints + /// in parallel + fn spawn_workers( + &self, + progress_sender: mpsc::Sender, + token: CancellationToken, + ) -> (Vec>, Vec>) { + let mut worker_senders = vec![]; + let mut workers_join_handles = vec![]; - // spawn child workers for worker_id in 0..self.concurrency { let (worker_sender, mut worker_recv) = mpsc::channel::(MAX_CHECKPOINTS_IN_PROGRESS); - let (term_sender, mut term_receiver) = oneshot::channel::<()>(); let cloned_progress_sender = progress_sender.clone(); let task_name = self.task_name.clone(); - workers.push((worker_sender, term_sender)); + worker_senders.push(worker_sender); + + let token = token.clone(); let worker = self.worker.clone(); let join_handle = spawn_monitored_task!(async move { loop { tokio::select! { - _ = &mut term_receiver => break, + // Once token is cancelled, notify worker's shutdown to the main loop + _ = token.cancelled() => { + _ = cloned_progress_sender.send(WorkerStatus::Shutdown(worker_id)).await; + break + }, Some(checkpoint) = worker_recv.recv() => { let sequence_number = checkpoint.checkpoint_summary.sequence_number; info!("received checkpoint for processing {} for workflow {}", sequence_number, task_name); @@ -82,7 +205,7 @@ impl WorkerPool { .await .expect("checkpoint processing failed for checkpoint"); info!("finished checkpoint processing {} for workflow {} in {:?}", sequence_number, task_name, start_time.elapsed()); - if cloned_progress_sender.send((worker_id, sequence_number, worker.save_progress(sequence_number).await)).await.is_err() { + if cloned_progress_sender.send(WorkerStatus::Running((worker_id, sequence_number, worker.save_progress(sequence_number).await))).await.is_err() { // The progress channel closing is a sign we need to exit this loop. break; } @@ -90,70 +213,30 @@ impl WorkerPool { } } }); - // Keep all join handles to ensure all workers are terminated before exiting - join_handles.push(join_handle); + workers_join_handles.push(join_handle); } - // main worker pool loop - loop { - tokio::select! { - Some((worker_id, status_update, progress_watermark)) = progress_receiver.recv() => { - idle.insert(worker_id); - updates.insert(status_update, progress_watermark); - if status_update == current_checkpoint_number { - let mut executor_status_update = None; - while let Some(progress_watermark) = updates.remove(¤t_checkpoint_number) { - if let Some(watermark) = progress_watermark { - executor_status_update = Some(watermark + 1); - } - current_checkpoint_number += 1; - } - if let Some(update) = executor_status_update { - if executor_progress_sender - .send((self.task_name.clone(), update)) - .await.is_err() { - // The executor progress channel closing is a sign we need to - // exit this loop. - break; - } - } - } - while !checkpoints.is_empty() && !idle.is_empty() { - let checkpoint = checkpoints.pop_front().unwrap(); - let worker_id = idle.pop_first().unwrap(); - if workers[worker_id].0.send(checkpoint).await.is_err() { - // The worker channel closing is a sign we need to exit this loop. - break; - } - } - } - Some(checkpoint) = checkpoint_receiver.recv() => { - let sequence_number = checkpoint.checkpoint_summary.sequence_number; - if sequence_number < current_checkpoint_number { - continue; - } - self.worker.preprocess_hook(checkpoint.clone()).expect("failed to preprocess task"); - if idle.is_empty() { - checkpoints.push_back(checkpoint); - } else { - let worker_id = idle.pop_first().unwrap(); - if workers[worker_id].0.send(checkpoint).await.is_err() { - // The worker channel closing is a sign we need to exit this loop. - break; - }; - } - } - } - } - - // Clean up code for graceful termination - - // Notify the exit handles of all workers to terminate - drop(workers); + (worker_senders, workers_join_handles) + } - // Wait for all workers to finish - for join_handle in join_handles { - join_handle.await.expect("worker thread panicked"); + /// Start the workers graceful shutdown + /// + /// - Awaits all worker handles + /// - Send `WorkerPoolStatus::Shutdown()` message notifying + /// external components that Worker Pool has been shutdown + async fn workers_graceful_shutdown( + &self, + workers_join_handles: Vec>, + executor_progress_sender: mpsc::Sender, + ) { + for worker in workers_join_handles { + if let Err(err) = worker.await { + tracing::error!("worker thread panicked: {err}"); + } } + _ = executor_progress_sender + .send(WorkerPoolStatus::Shutdown(self.task_name.clone())) + .await; + tracing::info!("Worker pool `{}` terminated gracefully", self.task_name); } } diff --git a/crates/iota-data-ingestion/src/main.rs b/crates/iota-data-ingestion/src/main.rs index 14f947509f4..877da506a99 100644 --- a/crates/iota-data-ingestion/src/main.rs +++ b/crates/iota-data-ingestion/src/main.rs @@ -88,7 +88,7 @@ fn setup_env(token: CancellationToken) { #[tokio::main] async fn main() -> Result<()> { let token = CancellationToken::new(); - let token_child = token.child_token(); + let child_token = token.child_token(); setup_env(token); let args: Vec = env::args().collect(); @@ -113,7 +113,8 @@ async fn main() -> Result<()> { config.progress_store.table_name, ) .await; - let mut executor = IndexerExecutor::new(progress_store, config.tasks.len(), metrics); + let mut executor = + IndexerExecutor::new(progress_store, config.tasks.len(), metrics, child_token); for task_config in config.tasks { match task_config.task { Task::Archival(archival_config) => { @@ -152,7 +153,6 @@ async fn main() -> Result<()> { config.remote_store_url, config.remote_store_options, reader_options, - token_child, ) .await?; Ok(()) diff --git a/crates/iota-indexer-builder/src/iota_datasource.rs b/crates/iota-indexer-builder/src/iota_datasource.rs index 85e71eaf7b1..7f57bae211e 100644 --- a/crates/iota-indexer-builder/src/iota_datasource.rs +++ b/crates/iota-indexer-builder/src/iota_datasource.rs @@ -52,13 +52,14 @@ impl Datasource for IotaCheckpointDatasource { data_sender: DataSender, ) -> Result>, Error> { let token = CancellationToken::new(); - let token_child = token.child_token(); + let child_token = token.child_token(); let progress_store = PerTaskInMemProgressStore { current_checkpoint: starting_checkpoint, exit_checkpoint: target_checkpoint, token: Some(token), }; - let mut executor = IndexerExecutor::new(progress_store, 1, self.metrics.clone()); + let mut executor = + IndexerExecutor::new(progress_store, 1, self.metrics.clone(), child_token); let worker = IndexerWorker::new(data_sender); let worker_pool = WorkerPool::new( worker, @@ -75,7 +76,6 @@ impl Datasource for IotaCheckpointDatasource { Some(remote_store_url), vec![], // optional remote store access options ReaderOptions::default(), - token_child, ) .await?; Ok(()) diff --git a/crates/iota-indexer/src/indexer.rs b/crates/iota-indexer/src/indexer.rs index c7061d617d8..c3aec30a966 100644 --- a/crates/iota-indexer/src/indexer.rs +++ b/crates/iota-indexer/src/indexer.rs @@ -130,6 +130,7 @@ impl Indexer { ]), 1, DataIngestionMetrics::new(&Registry::new()), + cancel.child_token(), ); let worker = new_handlers(store, metrics, primary_watermark, cancel.clone()).await?; let worker_pool = WorkerPool::new(worker, "primary".to_string(), download_queue_size); @@ -152,7 +153,6 @@ impl Indexer { config.remote_store_url.clone(), vec![], extra_reader_options, - cancel.child_token(), ) .await?; Ok(()) diff --git a/examples/custom-indexer/rust/local_reader.rs b/examples/custom-indexer/rust/local_reader.rs index 9b23b6499fa..284aff86385 100644 --- a/examples/custom-indexer/rust/local_reader.rs +++ b/examples/custom-indexer/rust/local_reader.rs @@ -39,6 +39,7 @@ async fn main() -> Result<()> { progress_store, 1, // number of workflow types metrics, + CancellationToken::new(), ); let worker_pool = WorkerPool::new(CustomWorker, "local_reader".to_string(), concurrency); @@ -49,7 +50,6 @@ async fn main() -> Result<()> { None, vec![], // optional remote store access options ReaderOptions::default(), // remote_read_batch_size - CancellationToken::new(), ) .await?; Ok(()) From 619919c1722b201b2fc4cf728fa011c9e8d8513f Mon Sep 17 00:00:00 2001 From: Sergiu Popescu <44298302+sergiupopescu199@users.noreply.github.com> Date: Thu, 30 Jan 2025 15:57:15 +0100 Subject: [PATCH 44/51] refactor: store large checkpoints as multipart upload (#5026) * refactor: add the ability to store large checkpoints as multipart uploads * fixup! refactor: add the ability to store large checkpoints as multipart uploads * fixup! fixup! refactor: add the ability to store large checkpoints as multipart uploads * fixup! fixup! fixup! refactor: add the ability to store large checkpoints as multipart uploads * fixup! fixup! fixup! fixup! refactor: add the ability to store large checkpoints as multipart uploads * refactor: upload parts concurrently * fixup! refactor: upload parts concurrently * doc: add fn documentation * fixup! fixup! refactor: upload parts concurrently * fix: remove redundant file * fixup! doc: add fn documentation * fixup! fixup! doc: add fn documentation * fixup! fixup! fixup! doc: add fn documentation --- crates/iota-data-ingestion-core/src/lib.rs | 2 +- crates/iota-data-ingestion-core/src/util.rs | 160 +++++++++++++++++- .../iota-data-ingestion/src/workers/blob.rs | 131 +++++++++++++- .../iota-data-ingestion/config/config.yaml | 29 +++- 4 files changed, 308 insertions(+), 14 deletions(-) diff --git a/crates/iota-data-ingestion-core/src/lib.rs b/crates/iota-data-ingestion-core/src/lib.rs index 74b419ac8d1..2f66e4605b9 100644 --- a/crates/iota-data-ingestion-core/src/lib.rs +++ b/crates/iota-data-ingestion-core/src/lib.rs @@ -42,7 +42,7 @@ use iota_types::{ pub use metrics::DataIngestionMetrics; pub use progress_store::{FileProgressStore, ProgressStore, ShimProgressStore}; pub use reader::ReaderOptions; -pub use util::create_remote_store_client; +pub use util::{create_remote_store_client, create_remote_store_client_with_ops}; pub use worker_pool::WorkerPool; #[async_trait] diff --git a/crates/iota-data-ingestion-core/src/util.rs b/crates/iota-data-ingestion-core/src/util.rs index 62434dfd6e6..19109cff9a7 100644 --- a/crates/iota-data-ingestion-core/src/util.rs +++ b/crates/iota-data-ingestion-core/src/util.rs @@ -10,18 +10,172 @@ use object_store::{ }; use url::Url; +/// Creates a remote store client *without* any retry mechanism. +/// +/// This function constructs a remote store client configured to *not* retry +/// failed requests. All requests will fail immediately if the underlying +/// operation encounters an error. This is a convenience wrapper around +/// `create_remote_store_client_with_ops` that sets the retry configuration +/// to disable retries. +/// +/// # Arguments +/// +/// * `url`: The URL of the remote store. The scheme of the URL determines the +/// storage provider: +/// * `http://` or `https://`: HTTP-based store. +/// * `gs://`: Google Cloud Storage. +/// * `s3://` or other AWS S3-compatible URL: Amazon S3. +/// * `remote_store_options`: A vector of key-value pairs representing +/// provider-specific options. +/// * For GCS: See [`object_store::gcp::GoogleConfigKey`] for valid keys. +/// * For S3: See [`object_store::aws::AmazonS3ConfigKey`] for valid keys. +/// * For HTTP: No options are currently supported. This parameter should be +/// empty. +/// * `request_timeout_secs`: The timeout duration (in seconds) for individual +/// requests. This timeout is used to set a slightly longer retry timeout +/// (request_timeout_secs + 1) internally, even though retries are disabled. +/// This is done to ensure that the overall operation doesn't hang +/// indefinitely. +/// +/// # Examples +/// +/// Creating an S3 client without retries: +/// +/// ```rust +/// # use iota_data_ingestion_core::create_remote_store_client; +/// use object_store::aws::AmazonS3ConfigKey; +/// +/// let url = "s3://my-bucket"; +/// let options = vec![( +/// AmazonS3ConfigKey::Region.as_ref().to_owned(), +/// "us-east-1".to_string(), +/// )]; +/// let client = create_remote_store_client(url.to_string(), options, 30).unwrap(); +/// ``` +/// +/// Creating a GCS client without retries: +/// +/// ```text +/// # use iota_data_ingestion_core::create_remote_store_client; +/// use object_store::gcp::GoogleConfigKey; +/// +/// let url = "gs://my-bucket"; +/// let options = vec![( +/// GoogleConfigKey::ServiceAccount.as_ref().to_owned(), +/// "my-service-account".to_string(), +/// )]; +/// let client = create_remote_store_client(url.to_string(), options, 30).unwrap(); +/// ``` +/// +/// Creating an HTTP client without retries (no options supported): +/// +/// ```text +/// # use iota_data_ingestion_core::create_remote_store_client; +/// +/// let url = "http://example.bucket.com"; +/// let options = vec![]; // No options for HTTP +/// let client = create_remote_store_client(url.to_string(), options, 30).unwrap(); +/// ``` pub fn create_remote_store_client( url: String, remote_store_options: Vec<(String, String)>, - timeout_secs: u64, + request_timeout_secs: u64, ) -> Result> { let retry_config = RetryConfig { max_retries: 0, - retry_timeout: Duration::from_secs(timeout_secs + 1), + retry_timeout: Duration::from_secs(request_timeout_secs + 1), ..Default::default() }; + + create_remote_store_client_with_ops( + url, + remote_store_options, + request_timeout_secs, + retry_config, + ) +} + +/// Creates a remote store client with configurable retry behavior and options. +/// +/// This function constructs a remote store client for various cloud storage +/// providers (HTTP, Google Cloud Storage, Amazon S3) based on the provided URL +/// and options. It allows configuring retry behavior through the `retry_config` +/// argument. +/// +/// # Arguments +/// +/// * `url`: The URL of the remote store. The scheme of the URL determines the +/// storage provider: +/// * `http://` or `https://`: HTTP-based store. +/// * `gs://`: Google Cloud Storage. +/// * `s3://` or other AWS S3-compatible URL: Amazon S3. +/// * `remote_store_options`: A vector of key-value pairs representing +/// provider-specific options. +/// * For GCS: See [`object_store::gcp::GoogleConfigKey`] for valid keys. +/// * For S3: See [`object_store::aws::AmazonS3ConfigKey`] for valid keys. +/// * For HTTP: No options are currently supported. This parameter should be +/// empty. +/// * `request_timeout_secs`: The timeout duration (in seconds) for individual +/// requests. +/// * `retry_config`: A [`RetryConfig`] struct defining the retry strategy. This +/// allows fine-grained control over the number of retries, backoff behavior, +/// and retry timeouts. See the documentation for +/// [`object_store::RetryConfig`] for details. +/// +/// # Examples +/// +/// Creating an S3 client with specific options and a retry configuration: +/// +/// ```text +/// # use iota_data_ingestion_core::create_remote_store_client_with_ops; +/// use object_store::{RetryConfig, aws::AmazonS3ConfigKey}; +/// +/// let url = "s3://my-bucket"; +/// let options = vec![( +/// AmazonS3ConfigKey::Region.as_ref().to_owned(), +/// "us-east-1".to_string(), +/// )]; +/// let retry_config = RetryConfig::default(); // Use default retry settings +/// let client = +/// create_remote_store_client_with_ops(url.to_string(), options, 30, retry_config).unwrap(); +/// ``` +/// +/// Creating a GCS client: +/// +/// ```text +/// # use iota_data_ingestion_core::create_remote_store_client_with_ops; +/// use object_store::{RetryConfig, gcp::GoogleConfigKey}; +/// +/// let url = "gs://my-bucket"; +/// let options = vec![( +/// GoogleConfigKey::ServiceAccount.as_ref().to_owned(), +/// "my-service-account".to_string(), +/// )]; +/// let retry_config = RetryConfig::default(); +/// let client = +/// create_remote_store_client_with_ops(url.to_string(), options, 30, retry_config).unwrap(); +/// ``` +/// +/// Creating an HTTP client (no options supported): +/// +/// ```text +/// # use iota_data_ingestion_core::create_remote_store_client_with_ops; +/// use object_store::RetryConfig; +/// +/// let url = "http://example.bucket.com"; +/// let options = vec![]; // No options for HTTP +/// let retry_config = RetryConfig::default(); +/// let client = +/// create_remote_store_client_with_ops(url.to_string(), options, 30, retry_config).unwrap(); +/// ``` +pub fn create_remote_store_client_with_ops( + url: String, + remote_store_options: Vec<(String, String)>, + request_timeout_secs: u64, + retry_config: RetryConfig, +) -> Result> { let client_options = ClientOptions::new() - .with_timeout(Duration::from_secs(timeout_secs)) + .with_timeout(Duration::from_secs(request_timeout_secs)) .with_allow_http(true); if remote_store_options.is_empty() { let http_store = object_store::http::HttpBuilder::new() diff --git a/crates/iota-data-ingestion/src/workers/blob.rs b/crates/iota-data-ingestion/src/workers/blob.rs index 9afa7ece94d..19a3a9e6af9 100644 --- a/crates/iota-data-ingestion/src/workers/blob.rs +++ b/crates/iota-data-ingestion/src/workers/blob.rs @@ -2,31 +2,139 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -use anyhow::Result; +use std::time::Duration; + +use anyhow::{Result, bail}; use async_trait::async_trait; use bytes::Bytes; -use iota_data_ingestion_core::{Worker, create_remote_store_client}; +use futures::{StreamExt, stream}; +use iota_data_ingestion_core::{Worker, create_remote_store_client_with_ops}; use iota_storage::blob::{Blob, BlobEncoding}; use iota_types::full_checkpoint_content::CheckpointData; -use object_store::{ObjectStore, path::Path}; -use serde::{Deserialize, Serialize}; +use object_store::{BackoffConfig, MultipartUpload, ObjectStore, RetryConfig, path::Path}; +use serde::{Deserialize, Deserializer, Serialize}; + +/// Minimum allowed chunk size to be uploaded to remote store +const MIN_CHUNK_SIZE_MB: u64 = 5 * 1024 * 1024; // 5 MB +/// The maximum number of concurrent requests allowed when uploading checkpoint +/// chunk parts to remote store +const MAX_CONCURRENT_PARTS_UPLOAD: usize = 50; #[derive(Serialize, Deserialize, Clone, Debug)] pub struct BlobTaskConfig { pub url: String, pub remote_store_options: Vec<(String, String)>, + pub request_timeout_secs: u64, + #[serde(deserialize_with = "deserialize_chunk")] + pub checkpoint_chunk_size_mb: u64, +} + +fn deserialize_chunk<'de, D>(deserializer: D) -> Result +where + D: Deserializer<'de>, +{ + let checkpoint_chunk_size = u64::deserialize(deserializer)? * 1024 * 1024; + if checkpoint_chunk_size < MIN_CHUNK_SIZE_MB { + return Err(serde::de::Error::custom("Chunk size must be at least 5 MB")); + } + Ok(checkpoint_chunk_size) } pub struct BlobWorker { remote_store: Box, + checkpoint_chunk_size_mb: u64, } impl BlobWorker { pub fn new(config: BlobTaskConfig) -> Self { Self { - remote_store: create_remote_store_client(config.url, config.remote_store_options, 10) - .expect("failed to create remote store client"), + checkpoint_chunk_size_mb: config.checkpoint_chunk_size_mb, + remote_store: create_remote_store_client_with_ops( + config.url, + config.remote_store_options, + config.request_timeout_secs, + RetryConfig { + max_retries: 10, + retry_timeout: Duration::from_secs(config.request_timeout_secs + 1), + backoff: BackoffConfig { + init_backoff: Duration::from_secs(1), + ..Default::default() + }, + }, + ) + .expect("failed to create remote store client"), + } + } + + /// Uploads a Checkpoint blob to the Remote Store. + /// + /// If the blob size exceeds the configured `CHUNK_SIZE`, + /// it uploads the blob in parts using multipart upload. + /// Otherwise, it uploads the blob directly. + async fn upload_blob(&self, bytes: Vec, chk_seq_num: u64, location: Path) -> Result<()> { + if bytes.len() > self.checkpoint_chunk_size_mb as usize { + return self + .upload_blob_multipart(bytes, chk_seq_num, location) + .await; + } + + self.remote_store + .put(&location, Bytes::from(bytes).into()) + .await?; + + Ok(()) + } + + /// Uploads a large Checkpoint blob to the Remote Store using multipart + /// upload. + /// + /// This function divides the input `bytes` into chunks of size `CHUNK_SIZE` + /// and uploads each chunk individually. + /// Finally, it completes the multipart upload by assembling all the + /// uploaded parts. + async fn upload_blob_multipart( + &self, + bytes: Vec, + chk_seq_num: u64, + location: Path, + ) -> Result<()> { + let mut multipart = self.remote_store.put_multipart(&location).await?; + let chunks = bytes.chunks(self.checkpoint_chunk_size_mb as usize); + let total_chunks = chunks.len(); + + let parts_futures = chunks + .into_iter() + .map(|chunk| multipart.put_part(Bytes::copy_from_slice(chunk).into())) + .collect::>(); + + let mut buffered_uploaded_parts = stream::iter(parts_futures) + .buffer_unordered(MAX_CONCURRENT_PARTS_UPLOAD) + .enumerate(); + + while let Some((uploaded_chunk_id, part_result)) = buffered_uploaded_parts.next().await { + match part_result { + Ok(()) => { + tracing::info!( + "uploaded checkpoint {chk_seq_num} chunk {}/{total_chunks}", + uploaded_chunk_id + 1 + ); + } + Err(err) => { + tracing::error!("error uploading part: {err}"); + multipart.abort().await?; + bail!("checkpoint {chk_seq_num} multipart upload aborted"); + } + } } + + let start_time = std::time::Instant::now(); + multipart.complete().await?; + tracing::info!( + "checkpoint {chk_seq_num} multipart completion request finished in {:?}", + start_time.elapsed() + ); + + Ok(()) } } @@ -38,9 +146,14 @@ impl Worker for BlobWorker { "{}.chk", checkpoint.checkpoint_summary.sequence_number )); - self.remote_store - .put(&location, Bytes::from(bytes).into()) - .await?; + + self.upload_blob( + bytes, + checkpoint.checkpoint_summary.sequence_number, + location, + ) + .await?; + Ok(()) } } diff --git a/dev-tools/iota-data-ingestion/config/config.yaml b/dev-tools/iota-data-ingestion/config/config.yaml index bb913f53ebd..b87398e0b14 100644 --- a/dev-tools/iota-data-ingestion/config/config.yaml +++ b/dev-tools/iota-data-ingestion/config/config.yaml @@ -13,7 +13,7 @@ progress_store: # DynamoDB table name table_name: "checkpoint-progress" -# Wrokers Configs +# Workers Configs # tasks: # Task unique name @@ -24,6 +24,33 @@ tasks: blob: # S3 bucket where checkpoints will be stored url: "s3://checkpoints" + # S3 client timeout, a large timeout is needed to accommodate the checkpoints which could have the size of several GBs + # + request_timeout_secs: 180 + # Checkpoint upload chunk size (in MB) that determines the upload strategy: + # + # If checkpoint size < checkpoint_chunk_size_mb: + # - Uploads checkpoint using single PUT operation + # - Optimal for smaller checkpoints + # + # If checkpoint size >= checkpoint_chunk_size_mb: + # - Divides checkpoint into chunks of this size + # - Uploads chunks as multipart + # - Storage service concatenates parts on completion + # + # Example with 50MB chunk size: + # 200MB checkpoint: + # - Splits into 4 parts (50MB each) + # - Multipart upload of each part + # - Parts merged on remote storage + # + # 40MB checkpoint: + # - Single PUT upload + # - No chunking needed + # + # Minimum allowed chunk size is 5MB + # + checkpoint_chunk_size_mb: 100 # AWS S3 client config options remote_store_options: - ["access_key_id", "test"] From a54fd6b2f6819862a0d39c03eba4b28632ded69e Mon Sep 17 00:00:00 2001 From: cpl121 <100352899+cpl121@users.noreply.github.com> Date: Thu, 30 Jan 2025 16:36:23 +0100 Subject: [PATCH 45/51] feat(wallet): update balance finder fetch to include all relevant assets (#4972) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat(core): add StardustIndexerClient * feat(dashboard): add stardust objects from indexer. * feat: update balance finder fetch to include all relevant assets WIP * feat(core): enhance StardustIndexerClient with basic output mapping and new types * feat(dashboard): add NFT resolved outputs retrieval and mapping functions * refactor(core, dashboard): unify output types and enhance mapping functions * feat(wallet-dashboard, core): enhance Stardust output handling and add pagination support * fix(wallet): include stardustIndexerClient to fetch shared objects in balance finder * fix(core, dashboard): pr fixes * fix(wallet, core): move stardust indexer provider to core * fix(wallet): improve balance finder logic * feat(sdk): add metadata configuration for stardustIndexer in .env.defaults * refactor(core): rename limit parameter to page_size in StardustIndexerClient * refactor(core): update PageParams interface and adjust pagination parameters in StardustIndexerClient * refactor(core): update return_amount * refactor(core): update StardustIndexerClient methods and rename hook for clarity * refactor(dashboard): remove unused variables in useGetAllStardustSharedObjects hook * fix: add missing 0x to stardust package id * refactor(core, dashboard): update Stardust package ID format, improve metadata handling in hooks, rename variables. * fix(wallet): flagged as address to import * fix(wallet): add constant to set a limiit of the objects to fetch in the balance finder * fix build * remove debris * fix(wallet): rename boolean objects --------- Co-authored-by: Panteleymonchuk Co-authored-by: Begoña Alvarez Co-authored-by: evavirseda --- apps/wallet/src/shared/accounts.ts | 4 +- .../accounts-finder/accounts-finder.test.ts | 6 ++ .../ui/app/accounts-finder/accountsFinder.ts | 74 ++++++++++++++++++- .../src/ui/app/accounts-finder/types.ts | 3 + .../src/ui/app/accounts-finder/utils.ts | 14 +++- .../src/ui/app/hooks/useAccountsFinder.ts | 3 + 6 files changed, 99 insertions(+), 5 deletions(-) diff --git a/apps/wallet/src/shared/accounts.ts b/apps/wallet/src/shared/accounts.ts index 582b019ee93..89794a3d01b 100644 --- a/apps/wallet/src/shared/accounts.ts +++ b/apps/wallet/src/shared/accounts.ts @@ -6,7 +6,9 @@ import { type CoinBalance } from '@iota/iota-sdk/client'; export interface AddressFromFinder { publicKey: string; bipPath: Bip44Path; - // TODO: extend this balance in the future to include eg staking, vesting schedules, assets, ... + hasTimelockedObjects: boolean; + hasStardustObjects: boolean; + hasAssets: boolean; balance: CoinBalance; } diff --git a/apps/wallet/src/ui/app/accounts-finder/accounts-finder.test.ts b/apps/wallet/src/ui/app/accounts-finder/accounts-finder.test.ts index b7ffa940f6e..20dcb82ee61 100644 --- a/apps/wallet/src/ui/app/accounts-finder/accounts-finder.test.ts +++ b/apps/wallet/src/ui/app/accounts-finder/accounts-finder.test.ts @@ -23,6 +23,9 @@ const findBalanceFactory = ( coinObjectCount: 2, coinType: '0x2::iota::IOTA', }, + hasAssets: false, + hasStardustObjects: false, + hasTimelockedObjects: false, }); } @@ -33,6 +36,9 @@ const findBalanceFactory = ( coinObjectCount: 0, coinType: '0x2::iota::IOTA', }, + hasAssets: false, + hasStardustObjects: false, + hasTimelockedObjects: false, }); }; }; diff --git a/apps/wallet/src/ui/app/accounts-finder/accountsFinder.ts b/apps/wallet/src/ui/app/accounts-finder/accountsFinder.ts index 1205d75ae63..ef3b7423c49 100644 --- a/apps/wallet/src/ui/app/accounts-finder/accountsFinder.ts +++ b/apps/wallet/src/ui/app/accounts-finder/accountsFinder.ts @@ -7,6 +7,14 @@ import type { IotaClient } from '@iota/iota-sdk/client'; import { getEmptyBalance } from './helpers'; import type { FindBalance } from './types'; import { Ed25519PublicKey } from '@iota/iota-sdk/keypairs/ed25519'; +import { + COIN_TYPE, + STARDUST_BASIC_OUTPUT_TYPE, + STARDUST_NFT_OUTPUT_TYPE, + type StardustIndexerClient, + TIMELOCK_IOTA_TYPE, + TIMELOCK_STAKED_TYPE, +} from '@iota/core'; export enum AllowedAccountSourceTypes { MnemonicDerived = 'mnemonic-derived', @@ -31,6 +39,7 @@ export interface AccountFinderConfigParams { changeIndex: number; }) => Promise; client: IotaClient; + stardustIndexerClient: StardustIndexerClient | null; bip44CoinType: AllowedBip44CoinTypes; accountSourceType: AllowedAccountSourceTypes; algorithm?: SearchAlgorithm; @@ -71,6 +80,8 @@ const CHANGE_INDEXES: { [key in AllowedBip44CoinTypes]: number[] } = { [AllowedBip44CoinTypes.IOTA]: [0, 1], }; +const NUMBER_OF_OBJECTS_TO_FETCH = 1; + export class AccountsFinder { private accountGapLimit: number = 0; private addressGapLimit: number = 0; @@ -81,11 +92,13 @@ export class AccountsFinder { private coinType: string; private getPublicKey; private client: IotaClient; + private stardustIndexerClient: StardustIndexerClient | null; private accounts: AccountFromFinder[] = []; // Found accounts with balances. constructor(config: AccountFinderConfigParams) { this.getPublicKey = config.getPublicKey; this.client = config.client; + this.stardustIndexerClient = config.stardustIndexerClient; this.bip44CoinType = config.bip44CoinType; this.coinType = config.coinType; this.changeIndexes = config.changeIndexes || CHANGE_INDEXES[config.bip44CoinType]; @@ -186,15 +199,74 @@ export class AccountsFinder { const publicKeyB64 = await this.getPublicKey(params); const publicKey = new Ed25519PublicKey(publicKeyB64); + const address = publicKey.toIotaAddress(); const foundBalance = await this.client.getBalance({ - owner: publicKey.toIotaAddress(), + owner: address, coinType: this.coinType, }); + const ownedAsset = await this.client.getOwnedObjects({ + owner: address, + filter: { + MatchNone: [ + { StructType: COIN_TYPE }, + { StructType: TIMELOCK_IOTA_TYPE }, + { StructType: TIMELOCK_STAKED_TYPE }, + { StructType: STARDUST_BASIC_OUTPUT_TYPE }, + { StructType: STARDUST_NFT_OUTPUT_TYPE }, + ], + }, + limit: NUMBER_OF_OBJECTS_TO_FETCH, + }); + + const ownedTimelockedObject = await this.client.getOwnedObjects({ + owner: address, + filter: { + MatchAny: [ + { StructType: TIMELOCK_IOTA_TYPE }, + { StructType: TIMELOCK_STAKED_TYPE }, + ], + }, + limit: NUMBER_OF_OBJECTS_TO_FETCH, + }); + + const hasTimelockedObjects = ownedTimelockedObject.data.length > 0; + + const ownedStardustObjects = await this.client.getOwnedObjects({ + owner: address, + filter: { + MatchAny: [ + { StructType: STARDUST_BASIC_OUTPUT_TYPE }, + { StructType: STARDUST_NFT_OUTPUT_TYPE }, + ], + }, + limit: NUMBER_OF_OBJECTS_TO_FETCH, + }); + + let hasStardustObjects = ownedStardustObjects.data.length > 0; + if (!hasStardustObjects && this.stardustIndexerClient) { + // Fetch Basic Outputs from Stardust Indexer + let sharedStardustObjects = + (await this.stardustIndexerClient?.getBasicResolvedOutputs(address, { + pageSize: NUMBER_OF_OBJECTS_TO_FETCH, + })) ?? []; + if (sharedStardustObjects.length === 0) { + // Fetch Nft Outputs from Stardust Indexer + sharedStardustObjects = + (await this.stardustIndexerClient?.getNftResolvedOutputs(address, { + pageSize: NUMBER_OF_OBJECTS_TO_FETCH, + })) ?? []; + } + hasStardustObjects = sharedStardustObjects.length > 0; + } + return { publicKey: publicKeyB64, balance: foundBalance || emptyBalance, + hasAssets: ownedAsset.data.length > 0, + hasTimelockedObjects, + hasStardustObjects, }; }; } diff --git a/apps/wallet/src/ui/app/accounts-finder/types.ts b/apps/wallet/src/ui/app/accounts-finder/types.ts index f34b8b51425..fc9efa43d3b 100644 --- a/apps/wallet/src/ui/app/accounts-finder/types.ts +++ b/apps/wallet/src/ui/app/accounts-finder/types.ts @@ -10,4 +10,7 @@ export type FindBalance = (params: { }) => Promise<{ publicKey: string; balance: CoinBalance; + hasAssets: boolean; + hasTimelockedObjects: boolean; + hasStardustObjects: boolean; }>; diff --git a/apps/wallet/src/ui/app/accounts-finder/utils.ts b/apps/wallet/src/ui/app/accounts-finder/utils.ts index 44f001d3484..7c3c0c28cbf 100644 --- a/apps/wallet/src/ui/app/accounts-finder/utils.ts +++ b/apps/wallet/src/ui/app/accounts-finder/utils.ts @@ -158,6 +158,9 @@ async function searchBalances({ accountIndex, changeIndex, }, + hasTimelockedObjects: foundBalance.hasAssets, + hasStardustObjects: foundBalance.hasTimelockedObjects, + hasAssets: foundBalance.hasStardustObjects, }); } return { @@ -222,8 +225,8 @@ export function mergeAccounts(accounts1: AccountFromFinder[], accounts2: Account return transformFromBipMap(bipMap); } -// Diff the found and persisted accounts so we know -// what addresses have not persisted yet and have balance. +// Diff the found and persisted accounts so we know +// what addresses have not persisted yet and have relevant assets or balance. export function diffAddressesBipPaths( foundAccounts: AccountFromFinder[], persistedAccounts: AccountFromFinder[], @@ -234,7 +237,12 @@ export function diffAddressesBipPaths( const foundBipMapKeys = Object.entries(foundBipMap); const persistedBipMapKeys = Object.keys(persistedBipMap); const diffBipPaths = foundBipMapKeys.filter( - ([key, address]) => !persistedBipMapKeys.includes(key) && hasBalance(address.balance), + ([key, address]) => + !persistedBipMapKeys.includes(key) && + (hasBalance(address.balance) || + address.hasAssets || + address.hasTimelockedObjects || + address.hasStardustObjects), ); return diffBipPaths.map(([_, account]) => account); diff --git a/apps/wallet/src/ui/app/hooks/useAccountsFinder.ts b/apps/wallet/src/ui/app/hooks/useAccountsFinder.ts index 7ba9534970f..01097b8e297 100644 --- a/apps/wallet/src/ui/app/hooks/useAccountsFinder.ts +++ b/apps/wallet/src/ui/app/hooks/useAccountsFinder.ts @@ -14,6 +14,7 @@ import { makeDerivationPath } from '_src/background/account-sources/bip44Path'; import { Ed25519PublicKey } from '@iota/iota-sdk/keypairs/ed25519'; import { IOTA_BIP44_COIN_TYPE } from '../redux/slices/iota-objects/coin'; import { IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; +import { useStardustIndexerClientContext } from '@iota/core'; export interface UseAccountFinderOptions { accountSourceType: AllowedAccountSourceTypes; @@ -35,10 +36,12 @@ export function useAccountsFinder({ const backgroundClient = useBackgroundClient(); const ledgerIotaClient = useIotaLedgerClient(); const client = useIotaClient(); + const { stardustIndexerClient } = useStardustIndexerClientContext(); const accountFinder = useMemo(() => { return new AccountsFinder({ client, + stardustIndexerClient, accountSourceType, bip44CoinType, coinType, From 7454265797e6f1b06e5a8202565147b873b55f4d Mon Sep 17 00:00:00 2001 From: Bran <52735957+brancoder@users.noreply.github.com> Date: Thu, 30 Jan 2025 17:51:19 +0100 Subject: [PATCH 46/51] fix: shared objects validation and refetching migration objects (#5101) --- .../src/utils/migration/mapStardustIndexerOutputs.ts | 6 +++--- .../app/(protected)/migrations/page.tsx | 10 +++++++--- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/apps/core/src/utils/migration/mapStardustIndexerOutputs.ts b/apps/core/src/utils/migration/mapStardustIndexerOutputs.ts index 3a7338a3189..b65659c8592 100644 --- a/apps/core/src/utils/migration/mapStardustIndexerOutputs.ts +++ b/apps/core/src/utils/migration/mapStardustIndexerOutputs.ts @@ -34,7 +34,7 @@ const mapStardustOutput: MapStardustOutput = function ( dataType: 'moveObject' as const, type: type, fields: { - balance: output.balance.value, + balance: output.balance.value.toString(), expiration_uc: output.expiration ? { type: STARDUST_EXPIRATION_UNLOCK_CONDITION_TYPE, @@ -55,7 +55,7 @@ const mapStardustOutput: MapStardustOutput = function ( id: { id: output.native_tokens.id, }, - size: output.native_tokens.size, + size: output.native_tokens.size.toString(), }, }, sender: output.sender, @@ -64,7 +64,7 @@ const mapStardustOutput: MapStardustOutput = function ( type: STARDUST_STORAGE_DEPOSIT_RETURN_UC_TYPE, fields: { return_address: output.storage_deposit_return.return_address, - return_amount: output.storage_deposit_return.return_amount, + return_amount: output.storage_deposit_return.return_amount.toString(), }, } : null, diff --git a/apps/wallet-dashboard/app/(protected)/migrations/page.tsx b/apps/wallet-dashboard/app/(protected)/migrations/page.tsx index 885aca68270..0ce36447d2c 100644 --- a/apps/wallet-dashboard/app/(protected)/migrations/page.tsx +++ b/apps/wallet-dashboard/app/(protected)/migrations/page.tsx @@ -43,8 +43,11 @@ function MigrationDashboardPage(): JSX.Element { StardustOutputMigrationStatus | undefined >(undefined); const { stardustIndexerClient } = useStardustIndexerClientContext(); - const { data: stardustMigrationObjects, isPlaceholderData } = - useGetStardustMigratableObjects(address); + const { + data: stardustMigrationObjects, + isPlaceholderData, + refetch: refetchStardustMigratableObjects, + } = useGetStardustMigratableObjects(address); const { migratableBasicOutputs, migratableNftOutputs, @@ -119,9 +122,10 @@ function MigrationDashboardPage(): JSX.Element { queryClient.invalidateQueries({ queryKey: ['stardust-shared-objects', address, stardustIndexerClient], }); + refetchStardustMigratableObjects(); }); }, - [iotaClient, queryClient, address, stardustIndexerClient], + [iotaClient, queryClient, address, stardustIndexerClient, refetchStardustMigratableObjects], ); const MIGRATION_CARDS: MigrationDisplayCardProps[] = [ From d2cd5860daa315608270dfdff882a858035969ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daria=20Dziuba=C5=82towska?= <44535712+daria305@users.noreply.github.com> Date: Thu, 30 Jan 2025 18:46:54 +0100 Subject: [PATCH 47/51] feat(admin): Return error status code from admin console if tracing is disabled on startup. (#5092) * feat(admin): Return error status code if tracing is disabled in config. * feat(admin): Address review comments * feat(admin): Fix clippy, unused import --- Cargo.lock | 1 + crates/iota-node/src/admin.rs | 22 ++++++++++++++----- crates/telemetry-subscribers/Cargo.toml | 1 + crates/telemetry-subscribers/src/lib.rs | 29 ++++++++++++++++--------- 4 files changed, 37 insertions(+), 16 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0d8f1cda148..33386dbde51 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -14526,6 +14526,7 @@ dependencies = [ "opentelemetry_sdk", "prometheus", "prost", + "thiserror", "tokio", "tonic", "tracing", diff --git a/crates/iota-node/src/admin.rs b/crates/iota-node/src/admin.rs index 08c3397dcf5..e9b1771e8c2 100644 --- a/crates/iota-node/src/admin.rs +++ b/crates/iota-node/src/admin.rs @@ -18,7 +18,7 @@ use iota_types::{ error::IotaError, }; use serde::Deserialize; -use telemetry_subscribers::TracingHandle; +use telemetry_subscribers::{TelemetryError, TracingHandle}; use tokio::sync::oneshot; use tracing::info; @@ -204,6 +204,10 @@ async fn enable_tracing( response.push(format!("filter will be reset after {:?}", duration)); (StatusCode::OK, response.join("\n")) } + Err(TelemetryError::TracingDisabled) => { + response.push("can't update filter: tracing is not enabled. to enable it, run the node with 'TRACE_FILTER' set.".into()); + (StatusCode::NOT_IMPLEMENTED, response.join("\n")) + } Err(err) => { response.push(format!("can't update filter: {:?}", err)); (StatusCode::BAD_REQUEST, response.join("\n")) @@ -212,11 +216,17 @@ async fn enable_tracing( } async fn reset_tracing(State(state): State>) -> (StatusCode, String) { - state.tracing_handle.reset_trace(); - ( - StatusCode::OK, - "tracing filter reset to TRACE_FILTER env var".into(), - ) + match state.tracing_handle.reset_trace() { + Ok(()) => ( + StatusCode::OK, + "tracing filter reset to TRACE_FILTER env var".into(), + ), + Err(TelemetryError::TracingDisabled) => ( + StatusCode::NOT_IMPLEMENTED, + "tracing is not enabled. to enable it, run the node with 'TRACE_FILTER' set.".into(), + ), + Err(err) => (StatusCode::INTERNAL_SERVER_ERROR, err.to_string()), + } } async fn get_filter(State(state): State>) -> (StatusCode, String) { diff --git a/crates/telemetry-subscribers/Cargo.toml b/crates/telemetry-subscribers/Cargo.toml index 0c72ef2a852..6bcdfc0e6ee 100644 --- a/crates/telemetry-subscribers/Cargo.toml +++ b/crates/telemetry-subscribers/Cargo.toml @@ -22,6 +22,7 @@ opentelemetry-proto = "0.7" opentelemetry_sdk = { version = "0.24", features = ["rt-tokio"] } prometheus.workspace = true prost.workspace = true +thiserror.workspace = true tokio = { workspace = true, features = ["full"] } tonic.workspace = true tracing.workspace = true diff --git a/crates/telemetry-subscribers/src/lib.rs b/crates/telemetry-subscribers/src/lib.rs index 03ce9b0ba6c..36c2bb8d929 100644 --- a/crates/telemetry-subscribers/src/lib.rs +++ b/crates/telemetry-subscribers/src/lib.rs @@ -24,7 +24,8 @@ use opentelemetry_sdk::{ trace::{BatchSpanProcessor, Sampler, ShouldSample, TracerProvider}, }; use span_latency_prom::PrometheusSpanLatencyLayer; -use tracing::{Level, error, info, metadata::LevelFilter}; +use thiserror::Error; +use tracing::{Level, error, metadata::LevelFilter}; use tracing_appender::non_blocking::{NonBlocking, WorkerGuard}; use tracing_subscriber::{EnvFilter, Layer, Registry, filter, fmt, layer::SubscriberExt, reload}; @@ -36,6 +37,15 @@ pub mod span_latency_prom; /// Alias for a type-erased error type. pub type BoxError = Box; +#[derive(Debug, Error)] +pub enum TelemetryError { + #[error("OTLP protocol not enabled in the node's configuration")] + TracingDisabled, + + #[error("{0}")] + Other(#[from] BoxError), +} + /// Configuration for different logging/tracing options /// === /// - json_log_output: Output JSON logs to stdout only. @@ -143,9 +153,9 @@ impl TracingHandle { &self, directives: S, duration: Duration, - ) -> Result<(), BoxError> { + ) -> Result<(), TelemetryError> { if let Some(trace) = &self.trace { - let res = trace.update(directives); + trace.update(directives)?; // after duration is elapsed, reset to the env setting let trace = trace.clone(); let trace_filter_env = env::var("TRACE_FILTER").unwrap_or_else(|_| "off".to_string()); @@ -155,10 +165,9 @@ impl TracingHandle { error!("failed to reset trace filter: {}", e); } }); - res - } else { - info!("tracing not enabled, ignoring update"); Ok(()) + } else { + Err(TelemetryError::TracingDisabled) } } @@ -166,12 +175,12 @@ impl TracingHandle { self.file_output.clear_path(); } - pub fn reset_trace(&self) { + pub fn reset_trace(&self) -> Result<(), TelemetryError> { if let Some(trace) = &self.trace { let trace_filter_env = env::var("TRACE_FILTER").unwrap_or_else(|_| "off".to_string()); - if let Err(e) = trace.update(trace_filter_env) { - error!("failed to reset trace filter: {}", e); - } + trace.update(trace_filter_env).map_err(|e| e.into()) + } else { + Err(TelemetryError::TracingDisabled) } } } From 9bed80ce20e581ec021794f5f9dee6baca165bfa Mon Sep 17 00:00:00 2001 From: Lucas Tortora <85233773+lucas-tortora@users.noreply.github.com> Date: Thu, 30 Jan 2025 15:25:01 -0300 Subject: [PATCH 48/51] task(devx): Add tags - Move SC (#5002) * task(devx): Add Tags - Move-sc * task(devx): Add Tags - Move-sc * remove tags * add team tags * fix merge * fix tags * fix merge * fix tags * fix build * add more tags --- docs/content/developer/advanced/asset-tokenization.mdx | 4 +++- .../advanced/create-review-rating-dao-with-multisig.mdx | 4 +++- .../content/developer/advanced/introducing-move-2024.mdx | 4 +++- docs/content/developer/advanced/onchain-randomness.mdx | 4 +++- docs/content/developer/cryptography/on-chain/ecvrf.mdx | 3 +++ docs/content/developer/cryptography/on-chain/groth16.mdx | 5 ++++- docs/content/developer/cryptography/on-chain/hashing.mdx | 3 +++ docs/content/developer/cryptography/on-chain/signing.mdx | 3 +++ .../cryptography/transaction-auth/intent-signing.mdx | 3 +++ docs/content/developer/getting-started/build-test.mdx | 3 ++- .../content/developer/getting-started/coffee-example.mdx | 3 ++- .../developer/getting-started/create-a-module.mdx | 4 +++- .../developer/getting-started/create-a-package.mdx | 3 ++- docs/content/developer/getting-started/debug.mdx | 3 ++- .../developer/getting-started/iota-environment.mdx | 3 ++- docs/content/developer/getting-started/publish.mdx | 3 ++- docs/content/developer/iota-101/access-time.mdx | 3 +++ .../developer/iota-101/create-coin/create-coin.mdx | 4 +++- .../developer/iota-101/create-coin/in-game-token.mdx | 4 +++- docs/content/developer/iota-101/create-coin/loyalty.mdx | 4 +++- .../iota-101/create-coin/migrate-to-coin-manager.mdx | 4 +++- .../content/developer/iota-101/create-coin/regulated.mdx | 4 +++- .../developer/iota-101/move-overview/collections.mdx | 3 +++ .../developer/iota-101/move-overview/conventions.mdx | 3 +++ .../developer/iota-101/move-overview/entry-functions.mdx | 3 +++ .../developer/iota-101/move-overview/generics.mdx | 5 +++++ docs/content/developer/iota-101/move-overview/init.mdx | 3 +++ .../developer/iota-101/move-overview/move-overview.mdx | 3 +++ .../iota-101/move-overview/one-time-witness.mdx | 3 +++ .../developer/iota-101/move-overview/ownership-scope.mdx | 3 +++ .../package-upgrades/automated-address-management.mdx | 3 ++- .../move-overview/package-upgrades/custom-policies.mdx | 3 ++- .../move-overview/package-upgrades/introduction.mdx | 3 +++ .../iota-101/move-overview/package-upgrades/upgrade.mdx | 3 +++ .../iota-101/move-overview/patterns/capabilities.mdx | 3 +++ .../iota-101/move-overview/patterns/hot-potato.mdx | 3 +++ .../iota-101/move-overview/patterns/id-pointer.mdx | 3 +++ .../iota-101/move-overview/patterns/patterns.mdx | 3 +++ .../move-overview/patterns/transferable-witness.mdx | 3 +++ .../iota-101/move-overview/patterns/witness.mdx | 3 +++ .../developer/iota-101/move-overview/references.mdx | 3 +++ .../content/developer/iota-101/move-overview/strings.mdx | 5 +++++ .../structs-and-abilities/abilities-intro.mdx | 3 +++ .../move-overview/structs-and-abilities/copy.mdx | 3 +++ .../move-overview/structs-and-abilities/drop.mdx | 3 +++ .../iota-101/move-overview/structs-and-abilities/key.mdx | 3 +++ .../move-overview/structs-and-abilities/store.mdx | 3 +++ .../move-overview/structs-and-abilities/struct.mdx | 3 +++ .../developer/iota-101/move-overview/visibility.mdx | 5 +++++ docs/content/developer/iota-101/nft/create-nft.mdx | 4 +++- docs/content/developer/iota-101/nft/marketplace.mdx | 4 +++- docs/content/developer/iota-101/nft/rent-nft.mdx | 4 +++- .../iota-101/objects/dynamic-fields/dynamic-fields.mdx | 3 +++ .../iota-101/objects/dynamic-fields/tables-bags.mdx | 3 +++ docs/content/developer/iota-101/objects/events.mdx | 3 +++ docs/content/developer/iota-101/objects/object-model.mdx | 3 +++ .../iota-101/objects/object-ownership/address-owned.mdx | 3 +++ .../iota-101/objects/object-ownership/immutable.mdx | 5 +++-- .../objects/object-ownership/object-ownership.mdx | 3 +++ .../iota-101/objects/object-ownership/shared.mdx | 3 +++ .../iota-101/objects/object-ownership/wrapped.mdx | 3 +++ docs/content/developer/iota-101/objects/shared-owned.mdx | 3 +++ .../iota-101/objects/transfers/custom-rules.mdx | 3 +++ .../iota-101/objects/transfers/transfer-to-object.mdx | 3 ++- docs/content/developer/iota-101/objects/uid-id.mdx | 5 +++++ docs/content/developer/iota-101/objects/versioning.mdx | 3 +++ .../ptb/optimizing-gas-with-coin-merging.mdx | 4 +++- .../ptb/programmable-transaction-blocks-overview.mdx | 2 +- .../transactions/ptb/programmable-transaction-blocks.mdx | 3 ++- .../iota-101/transactions/ptb/simulating-references.mdx | 4 +++- .../iota-101/transactions/sign-and-send-transactions.mdx | 3 ++- .../about-sponsored-transactions.mdx | 4 +++- .../use-sponsored-transactions.mdx | 3 ++- .../developer/iota-101/transactions/transactions.mdx | 4 +++- docs/content/developer/iota-move-ctf/challenge_0.mdx | 5 +++++ docs/content/developer/iota-move-ctf/challenge_1.mdx | 6 +++++- docs/content/developer/iota-move-ctf/challenge_2.mdx | 9 +++++---- docs/content/developer/iota-move-ctf/challenge_3.mdx | 9 +++++---- docs/content/developer/iota-move-ctf/challenge_4.mdx | 9 +++++---- docs/content/developer/iota-move-ctf/challenge_5.mdx | 9 +++++---- docs/content/developer/iota-move-ctf/challenge_6.mdx | 9 +++++---- docs/content/developer/iota-move-ctf/challenge_7.mdx | 9 +++++---- docs/content/developer/iota-move-ctf/challenge_8.mdx | 9 +++++---- docs/content/developer/standards/closed-loop-token.mdx | 3 +++ .../standards/closed-loop-token/action-request.mdx | 3 +++ .../closed-loop-token/coin-token-comparison.mdx | 3 +++ .../developer/standards/closed-loop-token/rules.mdx | 3 +++ .../developer/standards/closed-loop-token/spending.mdx | 3 +++ .../standards/closed-loop-token/token-policy.mdx | 3 +++ docs/content/developer/standards/coin-manager.mdx | 3 +++ docs/content/developer/standards/coin.mdx | 3 +++ docs/content/developer/standards/display.mdx | 3 +++ docs/content/developer/standards/kiosk-apps.mdx | 3 +++ docs/content/developer/standards/kiosk.mdx | 3 +++ docs/content/developer/standards/wallet-standard.mdx | 3 +++ docs/content/developer/stardust/migration-process.mdx | 3 +++ docs/content/developer/stardust/move-models.mdx | 3 +++ docs/content/developer/stardust/units.mdx | 3 +++ .../iota-identity/explanations/authenticated-assets.mdx | 2 +- docs/content/references/cli/ceremony.mdx | 4 +++- docs/content/references/cli/cheatsheet.mdx | 2 +- docs/content/references/cli/client.mdx | 2 +- docs/content/references/cli/console.mdx | 2 +- docs/content/references/cli/keytool.mdx | 2 +- docs/content/references/cli/move.mdx | 2 +- docs/content/references/cli/ptb.mdx | 2 +- docs/content/references/cli/validator.mdx | 2 +- .../references/execution-architecture/adapter.mdx | 2 ++ .../execution-architecture/execution-layer.mdx | 2 ++ .../references/execution-architecture/iota-execution.mdx | 2 ++ .../references/execution-architecture/natives.mdx | 2 ++ docs/content/references/move/abilities.mdx | 5 +++++ docs/content/references/move/generics.mdx | 5 +++++ docs/content/references/move/move-lock.mdx | 3 +++ docs/content/references/move/move-toml.mdx | 5 ++++- docs/content/references/rust-sdk.mdx | 3 ++- docs/content/tags.yml | 6 +++--- 117 files changed, 348 insertions(+), 76 deletions(-) diff --git a/docs/content/developer/advanced/asset-tokenization.mdx b/docs/content/developer/advanced/asset-tokenization.mdx index f9719bb8fa1..42cc9665c4d 100644 --- a/docs/content/developer/advanced/asset-tokenization.mdx +++ b/docs/content/developer/advanced/asset-tokenization.mdx @@ -1,7 +1,9 @@ --- title: Asset Tokenization description: Learn how to tokenize assets on the IOTA blockchain. Asset tokenization refers to the process of representing real-world assets, such as real estate, art, commodities, stocks, or other valuable assets, as digital tokens on the blockchain network. -tags: [ move, tutorial, how-to] +tags: [ move-sc, tutorial, how-to] +teams: + - iotaledger/vm-language --- import InitClient from '../../_snippets/initialize-iota-client-cli.mdx'; diff --git a/docs/content/developer/advanced/create-review-rating-dao-with-multisig.mdx b/docs/content/developer/advanced/create-review-rating-dao-with-multisig.mdx index 71e976dc208..db412c258c6 100644 --- a/docs/content/developer/advanced/create-review-rating-dao-with-multisig.mdx +++ b/docs/content/developer/advanced/create-review-rating-dao-with-multisig.mdx @@ -3,8 +3,10 @@ title: Create Review Rating DAO with Multisig Tutorial tags: - how-to - tutorial - - move + - move-sc - cli +teams: + - iotaledger/vm-language --- ## Introduction diff --git a/docs/content/developer/advanced/introducing-move-2024.mdx b/docs/content/developer/advanced/introducing-move-2024.mdx index 12bcdffdcee..08bc1ca582c 100644 --- a/docs/content/developer/advanced/introducing-move-2024.mdx +++ b/docs/content/developer/advanced/introducing-move-2024.mdx @@ -1,7 +1,9 @@ --- title: Introducing Move 2024 description: New features are becoming available to Move in 2024. These features are opt-in, so existing code will continue to function as expected. If you want to use these features in code you've already written, however, there are some steps you must take and breaking changes to be aware of to migrate to Move 2024. -tags: [ move, tutorial] +tags: [ move-sc, tutorial] +teams: + - iotaledger/vm-language --- IOTA launches with the "Move 2024.beta" edition, bringing enhanced features to improve both the writing and readability of Move code. These updates refine the source language without impacting the on-chain binary representation, allowing users to enjoy a smoother experience with the latest language improvements. diff --git a/docs/content/developer/advanced/onchain-randomness.mdx b/docs/content/developer/advanced/onchain-randomness.mdx index c2d32bf386a..47469e47b2c 100644 --- a/docs/content/developer/advanced/onchain-randomness.mdx +++ b/docs/content/developer/advanced/onchain-randomness.mdx @@ -1,7 +1,9 @@ --- title: On-Chain Randomness description: Randomness is a valuable tool to simulate chance on chain, but can also expose flaws in your logic. Understanding the vulnerabilities and accounting for them can mitigate the threat exposure for your smart contracts. -tags: [ move, randomness, tutorial] +tags: [ move-sc, randomness, tutorial] +teams: + - iotaledger/vm-language --- import Quiz from '@site/src/components/Quiz'; diff --git a/docs/content/developer/cryptography/on-chain/ecvrf.mdx b/docs/content/developer/cryptography/on-chain/ecvrf.mdx index 1bcb0fc01e3..1cb38f5a55a 100644 --- a/docs/content/developer/cryptography/on-chain/ecvrf.mdx +++ b/docs/content/developer/cryptography/on-chain/ecvrf.mdx @@ -2,6 +2,9 @@ title: Elliptic Curve Verifiable Random Function sidebar_label: ECVRF description: Elliptic curve verifiable random function is a cryptographic algorithm that enables you to generate a random number and provide proof that the number used a secret key for generation. +tags: [move-sc] +teams: + - iotaledger/vm-language --- import Quiz from '@site/src/components/Quiz'; diff --git a/docs/content/developer/cryptography/on-chain/groth16.mdx b/docs/content/developer/cryptography/on-chain/groth16.mdx index c972baab1c5..b66b009d057 100644 --- a/docs/content/developer/cryptography/on-chain/groth16.mdx +++ b/docs/content/developer/cryptography/on-chain/groth16.mdx @@ -1,5 +1,8 @@ --- -title: Groth16 +title: Groth1 +tags: [move-sc] +teams: + - iotaledger/vm-language --- import Quiz from '@site/src/components/Quiz'; diff --git a/docs/content/developer/cryptography/on-chain/hashing.mdx b/docs/content/developer/cryptography/on-chain/hashing.mdx index 2080e9b4e90..58c267a4564 100644 --- a/docs/content/developer/cryptography/on-chain/hashing.mdx +++ b/docs/content/developer/cryptography/on-chain/hashing.mdx @@ -1,6 +1,9 @@ --- title: Hashing description: IOTA supports SHA2-256, SHA3-256, Keccak256, Blake2b-256 cryptographic hash functions. +tags: [move-sc] +teams: + - iotaledger/vm-language --- import Quiz from '@site/src/components/Quiz'; diff --git a/docs/content/developer/cryptography/on-chain/signing.mdx b/docs/content/developer/cryptography/on-chain/signing.mdx index 8a1d64a151c..6fa5e1f5452 100644 --- a/docs/content/developer/cryptography/on-chain/signing.mdx +++ b/docs/content/developer/cryptography/on-chain/signing.mdx @@ -1,5 +1,8 @@ --- title: IOTA On-Chain Signatures Verification in Move +tags: [move-sc] +teams: + - iotaledger/vm-language --- import Quiz from '@site/src/components/Quiz'; diff --git a/docs/content/developer/cryptography/transaction-auth/intent-signing.mdx b/docs/content/developer/cryptography/transaction-auth/intent-signing.mdx index a2318989b24..14758f38cac 100644 --- a/docs/content/developer/cryptography/transaction-auth/intent-signing.mdx +++ b/docs/content/developer/cryptography/transaction-auth/intent-signing.mdx @@ -1,5 +1,8 @@ --- title: Intent Signing +tags: [move-sc] +teams: + - iotaledger/vm-language --- import Quiz from '@site/src/components/Quiz'; diff --git a/docs/content/developer/getting-started/build-test.mdx b/docs/content/developer/getting-started/build-test.mdx index 824d82a9a50..8c6fde4c7f4 100644 --- a/docs/content/developer/getting-started/build-test.mdx +++ b/docs/content/developer/getting-started/build-test.mdx @@ -1,8 +1,9 @@ --- description: Learn how to build and test Move packages in IOTA with detailed instructions and examples. -tags: [move, testing, how-to, cli, iota-cli] +tags: [move-sc, testing, how-to, iota-cli] teams: - iotaledger/dev-tools + - iotaledger/vm-language --- import TestingCheatSheet from "../../_snippets/testing-cheat-sheet.mdx"; diff --git a/docs/content/developer/getting-started/coffee-example.mdx b/docs/content/developer/getting-started/coffee-example.mdx index d86f57e9243..f538a81aa99 100644 --- a/docs/content/developer/getting-started/coffee-example.mdx +++ b/docs/content/developer/getting-started/coffee-example.mdx @@ -2,10 +2,11 @@ title: Getting Started with Move Coffee Token Tutorial tags: - tutorial - - move + - move-sc - getting-started - iota-cli teams: + - iotaledger/vm-language - iotaledger/dev-tools --- diff --git a/docs/content/developer/getting-started/create-a-module.mdx b/docs/content/developer/getting-started/create-a-module.mdx index eeaff6be9ad..6eea9660b79 100644 --- a/docs/content/developer/getting-started/create-a-module.mdx +++ b/docs/content/developer/getting-started/create-a-module.mdx @@ -1,6 +1,8 @@ --- description: Guide to creating and understanding a Move module in an IOTA package. -tags: [move, getting-started] +tags: [move-sc, getting-started] +teams: + - iotaledger/vm-language --- import Quiz from '@site/src/components/Quiz'; diff --git a/docs/content/developer/getting-started/create-a-package.mdx b/docs/content/developer/getting-started/create-a-package.mdx index 620601c6ecf..53dcf82c004 100644 --- a/docs/content/developer/getting-started/create-a-package.mdx +++ b/docs/content/developer/getting-started/create-a-package.mdx @@ -1,7 +1,8 @@ --- description: How to create a Move package in IOTA -tags: [ move, getting-started , iota-cli] +tags: [ move-sc,getting-started, iota-cli] teams: + - iotaledger/vm-language - iotaledger/dev-tools --- diff --git a/docs/content/developer/getting-started/debug.mdx b/docs/content/developer/getting-started/debug.mdx index b17d4e800a0..8566abfd174 100644 --- a/docs/content/developer/getting-started/debug.mdx +++ b/docs/content/developer/getting-started/debug.mdx @@ -1,8 +1,9 @@ --- description: Learn how to use the std::debug module in Move for debugging and printing values. -tags: [move, getting-started, testing, iota-cli] +tags: [move-sc, getting-started, testing, iota-cli] teams: - iotaledger/dev-tools + - iotaledger/vm-language --- import Quiz from '@site/src/components/Quiz'; import questions from '/json/developer/getting-started/debug.json'; diff --git a/docs/content/developer/getting-started/iota-environment.mdx b/docs/content/developer/getting-started/iota-environment.mdx index 74e04bb4af7..541bb68f6ba 100644 --- a/docs/content/developer/getting-started/iota-environment.mdx +++ b/docs/content/developer/getting-started/iota-environment.mdx @@ -7,9 +7,10 @@ tags: - sdk - typescript - rust - - move + - move-sc teams: - iotaledger/dev-tools + - iotaledger/vm-language --- # Before You Start diff --git a/docs/content/developer/getting-started/publish.mdx b/docs/content/developer/getting-started/publish.mdx index ea830009cc9..d6b2f744dc8 100644 --- a/docs/content/developer/getting-started/publish.mdx +++ b/docs/content/developer/getting-started/publish.mdx @@ -1,8 +1,9 @@ --- description: Learn how to publish your Move package on the IOTA network and interact with it using programmable transaction blocks. -tags: [move, how-to, cli, iota-cli] +tags: [move-sc, how-to, cli, iota-cli] teams: - iotaledger/dev-tools + - iotaledger/vm-language --- import AddressPrefix from "../../_snippets/address-prefix.mdx"; diff --git a/docs/content/developer/iota-101/access-time.mdx b/docs/content/developer/iota-101/access-time.mdx index ac6358d4373..55f7288afcc 100644 --- a/docs/content/developer/iota-101/access-time.mdx +++ b/docs/content/developer/iota-101/access-time.mdx @@ -1,6 +1,9 @@ --- title: Access On-Chain Time description: Access network-based time for your transactions. IOTA provides a Clock module to capture near-real time or epoch time in your IOTA packages. +tags: [move-sc] +teams: + - iotaledger/vm-language --- import Quiz from '@site/src/components/Quiz'; diff --git a/docs/content/developer/iota-101/create-coin/create-coin.mdx b/docs/content/developer/iota-101/create-coin/create-coin.mdx index b0df4037d7c..640a28efe20 100644 --- a/docs/content/developer/iota-101/create-coin/create-coin.mdx +++ b/docs/content/developer/iota-101/create-coin/create-coin.mdx @@ -1,6 +1,8 @@ --- description: Learn how to create coins and tokens on the IOTA blockchain using Move. -tags: [ move, cli, tutorial] +tags: [ move-sc, cli, tutorial] +teams: + - iotaledger/vm-language --- import Quiz from '@site/src/components/Quiz'; import questions from '/json/developer/iota-101/create-coin/create-coin.json'; diff --git a/docs/content/developer/iota-101/create-coin/in-game-token.mdx b/docs/content/developer/iota-101/create-coin/in-game-token.mdx index 2551dd3a9d2..5b7af95b687 100644 --- a/docs/content/developer/iota-101/create-coin/in-game-token.mdx +++ b/docs/content/developer/iota-101/create-coin/in-game-token.mdx @@ -1,6 +1,8 @@ --- description: Learn how to create in-game currency on IOTA using the Closed-Loop Token standard. -tags: [ move, tutorial] +tags: [ move-sc, tutorial] +teams: + - iotaledger/vm-language --- import Quiz from '@site/src/components/Quiz'; import questions from '/json/developer/iota-101/create-coin/in-game-token.json'; diff --git a/docs/content/developer/iota-101/create-coin/loyalty.mdx b/docs/content/developer/iota-101/create-coin/loyalty.mdx index 434949784f3..ca5f0d78ea5 100644 --- a/docs/content/developer/iota-101/create-coin/loyalty.mdx +++ b/docs/content/developer/iota-101/create-coin/loyalty.mdx @@ -1,6 +1,8 @@ --- description: Learn how to create loyalty tokens on IOTA for use in digital services. -tags: [ move, tutorial] +tags: [ move-sc, tutorial] +teams: + - iotaledger/vm-language --- import Quiz from '@site/src/components/Quiz'; import questions from '/json/developer/iota-101/create-coin/loyalty.json'; diff --git a/docs/content/developer/iota-101/create-coin/migrate-to-coin-manager.mdx b/docs/content/developer/iota-101/create-coin/migrate-to-coin-manager.mdx index db3b0e3869c..5caa6b27409 100644 --- a/docs/content/developer/iota-101/create-coin/migrate-to-coin-manager.mdx +++ b/docs/content/developer/iota-101/create-coin/migrate-to-coin-manager.mdx @@ -1,6 +1,8 @@ --- title: Migrating a Coin to Coin Manager -tags: [ move, cli, tutorial] +tags: [ move-sc, cli, tutorial] +teams: + - iotaledger/vm-language --- The previous articles in this section showcase how to create a [`Coin`](../../../references/framework/iota-framework/coin.mdx) object with different constructors. Namely, [`create_currency`](create-coin.mdx) and [`create_regulated_currency`](regulated.mdx). diff --git a/docs/content/developer/iota-101/create-coin/regulated.mdx b/docs/content/developer/iota-101/create-coin/regulated.mdx index 66e55654393..a35c377bba5 100644 --- a/docs/content/developer/iota-101/create-coin/regulated.mdx +++ b/docs/content/developer/iota-101/create-coin/regulated.mdx @@ -1,6 +1,8 @@ --- description: Learn how to create regulated coins on IOTA using deny lists for access control. -tags: [ move, tutorial] +tags: [ move-sc, tutorial] +teams: + - iotaledger/vm-language --- import Quiz from '@site/src/components/Quiz'; import questions from '/json/developer/iota-101/create-coin/regulated.json'; diff --git a/docs/content/developer/iota-101/move-overview/collections.mdx b/docs/content/developer/iota-101/move-overview/collections.mdx index 01f4f20e5af..a0de0c2f341 100644 --- a/docs/content/developer/iota-101/move-overview/collections.mdx +++ b/docs/content/developer/iota-101/move-overview/collections.mdx @@ -1,5 +1,8 @@ --- description: An overview of various collection types in the IOTA framework. +tags: [move-sc] +teams: + - iotaledger/vm-language --- import Quiz from '@site/src/components/Quiz'; import questions from '/json/developer/iota-101/move-overview/collections.json'; diff --git a/docs/content/developer/iota-101/move-overview/conventions.mdx b/docs/content/developer/iota-101/move-overview/conventions.mdx index 34ec5569749..86b82959c53 100644 --- a/docs/content/developer/iota-101/move-overview/conventions.mdx +++ b/docs/content/developer/iota-101/move-overview/conventions.mdx @@ -1,5 +1,8 @@ --- description: Recommended Move 2024 best practices for the IOTA blockchain. +tags: [move-sc] +teams: + - iotaledger/vm-language --- import Quiz from '@site/src/components/Quiz'; import questions from '/json/developer/iota-101/move-overview/conventions.json'; diff --git a/docs/content/developer/iota-101/move-overview/entry-functions.mdx b/docs/content/developer/iota-101/move-overview/entry-functions.mdx index 27a6222f2ef..4419c25dcc8 100644 --- a/docs/content/developer/iota-101/move-overview/entry-functions.mdx +++ b/docs/content/developer/iota-101/move-overview/entry-functions.mdx @@ -1,5 +1,8 @@ --- description: A guide to the `entry` and `public` modifiers in Move, its uses and comparison. +tags: [move-sc] +teams: + - iotaledger/vm-language --- import Quiz from '@site/src/components/Quiz'; import questions from '/json/developer/iota-101/move-overview/entry-functions.json'; diff --git a/docs/content/developer/iota-101/move-overview/generics.mdx b/docs/content/developer/iota-101/move-overview/generics.mdx index 54c0c26c46f..1fd6db25de7 100644 --- a/docs/content/developer/iota-101/move-overview/generics.mdx +++ b/docs/content/developer/iota-101/move-overview/generics.mdx @@ -1,3 +1,8 @@ +--- +tags: [move-sc] +teams: + - iotaledger/vm-language +--- # Generics Generics are a way to define a type or function that can work with any type. This is useful when you diff --git a/docs/content/developer/iota-101/move-overview/init.mdx b/docs/content/developer/iota-101/move-overview/init.mdx index e9cbce9a189..23073ab45c4 100644 --- a/docs/content/developer/iota-101/move-overview/init.mdx +++ b/docs/content/developer/iota-101/move-overview/init.mdx @@ -1,4 +1,7 @@ --- +tags: [move-sc] +teams: + - iotaledger/vm-language description: Learn about the `init` function in Move modules, including its unique characteristics and proper usage. --- import Quiz from '@site/src/components/Quiz'; diff --git a/docs/content/developer/iota-101/move-overview/move-overview.mdx b/docs/content/developer/iota-101/move-overview/move-overview.mdx index 685c64ffc50..a5f27707458 100644 --- a/docs/content/developer/iota-101/move-overview/move-overview.mdx +++ b/docs/content/developer/iota-101/move-overview/move-overview.mdx @@ -1,6 +1,9 @@ --- title: Move Concepts description: Move is an open source language for writing safe packages to manipulate on-chain objects +tags: [move-sc] +teams: + - iotaledger/vm-language --- import MoveSummary from "../../../_snippets/move-summary.mdx"; diff --git a/docs/content/developer/iota-101/move-overview/one-time-witness.mdx b/docs/content/developer/iota-101/move-overview/one-time-witness.mdx index 5ce6c899d23..b2ac8fb73c6 100644 --- a/docs/content/developer/iota-101/move-overview/one-time-witness.mdx +++ b/docs/content/developer/iota-101/move-overview/one-time-witness.mdx @@ -1,5 +1,8 @@ --- title: One-Time Witness +tags: [move-sc] +teams: + - iotaledger/vm-language description: An overview of the One-Time Witness (OTW) type in Move, which ensures actions occur only once within a module. --- import Quiz from '@site/src/components/Quiz'; diff --git a/docs/content/developer/iota-101/move-overview/ownership-scope.mdx b/docs/content/developer/iota-101/move-overview/ownership-scope.mdx index c2ee2658722..45884d8c481 100644 --- a/docs/content/developer/iota-101/move-overview/ownership-scope.mdx +++ b/docs/content/developer/iota-101/move-overview/ownership-scope.mdx @@ -1,5 +1,8 @@ --- title: Ownership and Scope +tags: [move-sc] +teams: + - iotaledger/vm-language description: Learn about variable ownership and scope in Move, how it works, and how to use it in Move. --- diff --git a/docs/content/developer/iota-101/move-overview/package-upgrades/automated-address-management.mdx b/docs/content/developer/iota-101/move-overview/package-upgrades/automated-address-management.mdx index de8d8bbc0a0..ec08139c1fb 100644 --- a/docs/content/developer/iota-101/move-overview/package-upgrades/automated-address-management.mdx +++ b/docs/content/developer/iota-101/move-overview/package-upgrades/automated-address-management.mdx @@ -1,7 +1,8 @@ --- title: Automated Address Management -tags: [ iota-cli ] +tags: [move-sc, iota-cli] teams: + - iotaledger/vm-language - iotaledger/dev-tools --- diff --git a/docs/content/developer/iota-101/move-overview/package-upgrades/custom-policies.mdx b/docs/content/developer/iota-101/move-overview/package-upgrades/custom-policies.mdx index 754f3df010b..4a7ad785c71 100644 --- a/docs/content/developer/iota-101/move-overview/package-upgrades/custom-policies.mdx +++ b/docs/content/developer/iota-101/move-overview/package-upgrades/custom-policies.mdx @@ -1,7 +1,8 @@ --- description: A guide to understanding and implementing secure package upgrade policies in IOTA using Move. -tags: [ iota-cli ] +tags: [move-sc, iota-cli ] teams: + - iotaledger/vm-language - iotaledger/dev-tools --- import UpgradeSingleKeyRisk from "../../../../_snippets/upgrade-single-key-risk.mdx"; diff --git a/docs/content/developer/iota-101/move-overview/package-upgrades/introduction.mdx b/docs/content/developer/iota-101/move-overview/package-upgrades/introduction.mdx index e4057f32722..0e245bad9b2 100644 --- a/docs/content/developer/iota-101/move-overview/package-upgrades/introduction.mdx +++ b/docs/content/developer/iota-101/move-overview/package-upgrades/introduction.mdx @@ -1,6 +1,9 @@ --- title: Package Upgrades sidebar_label: Introduction +tags: [move-sc] +teams: + - iotaledger/vm-language description: Learn how to upgrade Move packages on IOTA without affecting existing dependencies. --- import UpgradeSingleKeyRisk from "../../../../_snippets/upgrade-single-key-risk.mdx"; diff --git a/docs/content/developer/iota-101/move-overview/package-upgrades/upgrade.mdx b/docs/content/developer/iota-101/move-overview/package-upgrades/upgrade.mdx index c02ea64487b..53b5aff6143 100644 --- a/docs/content/developer/iota-101/move-overview/package-upgrades/upgrade.mdx +++ b/docs/content/developer/iota-101/move-overview/package-upgrades/upgrade.mdx @@ -1,4 +1,7 @@ --- +tags: [move-sc] +teams: + - iotaledger/vm-language description: Learn how to upgrade your packages on the IOTA network while maintaining their immutable properties. --- import AutomatedAddressManagement from '../../../../_snippets/automated-address-management.mdx' diff --git a/docs/content/developer/iota-101/move-overview/patterns/capabilities.mdx b/docs/content/developer/iota-101/move-overview/patterns/capabilities.mdx index ddcd251c2f1..71f4d4ef80e 100644 --- a/docs/content/developer/iota-101/move-overview/patterns/capabilities.mdx +++ b/docs/content/developer/iota-101/move-overview/patterns/capabilities.mdx @@ -1,5 +1,8 @@ --- description: Introduction to capabilities and their use in authorizing actions within the Move language. +tags: [move-sc] +teams: + - iotaledger/vm-language --- import Quiz from '@site/src/components/Quiz'; import questions from '/json/developer/iota-101/move-overview/patterns/capabilities.json'; diff --git a/docs/content/developer/iota-101/move-overview/patterns/hot-potato.mdx b/docs/content/developer/iota-101/move-overview/patterns/hot-potato.mdx index dace6aa798b..e0d2422a7a1 100644 --- a/docs/content/developer/iota-101/move-overview/patterns/hot-potato.mdx +++ b/docs/content/developer/iota-101/move-overview/patterns/hot-potato.mdx @@ -1,5 +1,8 @@ --- description: Introduction to the hot potato pattern in Move and its practical application. +tags: [move-sc] +teams: + - iotaledger/vm-language --- import Quiz from '@site/src/components/Quiz'; import questions from '/json/developer/iota-101/move-overview/patterns/hot-potato.json'; diff --git a/docs/content/developer/iota-101/move-overview/patterns/id-pointer.mdx b/docs/content/developer/iota-101/move-overview/patterns/id-pointer.mdx index db5a929719e..0436427c1f5 100644 --- a/docs/content/developer/iota-101/move-overview/patterns/id-pointer.mdx +++ b/docs/content/developer/iota-101/move-overview/patterns/id-pointer.mdx @@ -1,5 +1,8 @@ --- description: Overview of the ID pointer technique in Move and its practical applications. +tags: [move-sc] +teams: + - iotaledger/vm-language --- import Quiz from '@site/src/components/Quiz'; import questions from '/json/developer/iota-101/move-overview/patterns/id-pointer.json'; diff --git a/docs/content/developer/iota-101/move-overview/patterns/patterns.mdx b/docs/content/developer/iota-101/move-overview/patterns/patterns.mdx index c59f01e99ff..e98369093e8 100644 --- a/docs/content/developer/iota-101/move-overview/patterns/patterns.mdx +++ b/docs/content/developer/iota-101/move-overview/patterns/patterns.mdx @@ -1,5 +1,8 @@ --- title: Patterns +tags: [move-sc] +teams: + - iotaledger/vm-language description: Move coding patterns and techniques to solve logic challenges when developing Move packages for the IOTA blockchain, including capabilities, witness and transferable witness, hot potato, and ID pointer. --- diff --git a/docs/content/developer/iota-101/move-overview/patterns/transferable-witness.mdx b/docs/content/developer/iota-101/move-overview/patterns/transferable-witness.mdx index b673fff15c9..53cddf45d51 100644 --- a/docs/content/developer/iota-101/move-overview/patterns/transferable-witness.mdx +++ b/docs/content/developer/iota-101/move-overview/patterns/transferable-witness.mdx @@ -1,5 +1,8 @@ --- description: Learn about the transferable witness pattern in Move for advanced authorization scenarios. +tags: [move-sc] +teams: + - iotaledger/vm-language --- import Quiz from '@site/src/components/Quiz'; import questions from '/json/developer/iota-101/move-overview/patterns/transferable-witness.json'; diff --git a/docs/content/developer/iota-101/move-overview/patterns/witness.mdx b/docs/content/developer/iota-101/move-overview/patterns/witness.mdx index 94843c158f6..9d4a78ef5fd 100644 --- a/docs/content/developer/iota-101/move-overview/patterns/witness.mdx +++ b/docs/content/developer/iota-101/move-overview/patterns/witness.mdx @@ -1,5 +1,8 @@ --- description: Overview of the witness pattern in Move and its implementation. +tags: [move-sc] +teams: + - iotaledger/vm-language --- import Quiz from '@site/src/components/Quiz'; import questions from '/json/developer/iota-101/move-overview/patterns/witness.json'; diff --git a/docs/content/developer/iota-101/move-overview/references.mdx b/docs/content/developer/iota-101/move-overview/references.mdx index ce59e61612a..841f4e35355 100644 --- a/docs/content/developer/iota-101/move-overview/references.mdx +++ b/docs/content/developer/iota-101/move-overview/references.mdx @@ -1,5 +1,8 @@ --- title: References +tags: [move-sc] +teams: + - iotaledger/vm-language description: References in Move allow passing a value to a function without giving up the ownership. This section covers references, how they work, and how to use them in Move. --- diff --git a/docs/content/developer/iota-101/move-overview/strings.mdx b/docs/content/developer/iota-101/move-overview/strings.mdx index 3eda1de2817..32350239e5b 100644 --- a/docs/content/developer/iota-101/move-overview/strings.mdx +++ b/docs/content/developer/iota-101/move-overview/strings.mdx @@ -1,3 +1,8 @@ +--- +tags: [move-sc] +teams: + - iotaledger/vm-language +--- import Quiz from '@site/src/components/Quiz'; import questions from '/json/developer/iota-101/move-overview/strings.json'; diff --git a/docs/content/developer/iota-101/move-overview/structs-and-abilities/abilities-intro.mdx b/docs/content/developer/iota-101/move-overview/structs-and-abilities/abilities-intro.mdx index 1be9c510045..2063fb67527 100644 --- a/docs/content/developer/iota-101/move-overview/structs-and-abilities/abilities-intro.mdx +++ b/docs/content/developer/iota-101/move-overview/structs-and-abilities/abilities-intro.mdx @@ -1,5 +1,8 @@ --- title: Abilities +tags: [move-sc] +teams: + - iotaledger/vm-language description: Abilities in Move allow customizing type behaviors. This section covers the introduction to abilities, how they work, and how to use them in Move. --- diff --git a/docs/content/developer/iota-101/move-overview/structs-and-abilities/copy.mdx b/docs/content/developer/iota-101/move-overview/structs-and-abilities/copy.mdx index 0dec2ad259a..3d28ecddd79 100644 --- a/docs/content/developer/iota-101/move-overview/structs-and-abilities/copy.mdx +++ b/docs/content/developer/iota-101/move-overview/structs-and-abilities/copy.mdx @@ -1,5 +1,8 @@ --- title : Copy Ability +tags: [move-sc] +teams: + - iotaledger/vm-language description: In Move, the copy ability on a type indicates that the instance or the value of the type can be copied. This section covers the copy ability, how it works, and how to use it in Move. --- diff --git a/docs/content/developer/iota-101/move-overview/structs-and-abilities/drop.mdx b/docs/content/developer/iota-101/move-overview/structs-and-abilities/drop.mdx index 072b2b0c4f8..cb9a980a12a 100644 --- a/docs/content/developer/iota-101/move-overview/structs-and-abilities/drop.mdx +++ b/docs/content/developer/iota-101/move-overview/structs-and-abilities/drop.mdx @@ -1,5 +1,8 @@ --- title: Drop Ability +tags: [move-sc] +teams: + - iotaledger/vm-language description: In Move, the drop ability on a type indicates that the instance of the type can be ignored or discarded. This section covers the drop ability, how it works, and how to use it in Move. --- diff --git a/docs/content/developer/iota-101/move-overview/structs-and-abilities/key.mdx b/docs/content/developer/iota-101/move-overview/structs-and-abilities/key.mdx index cc6060a0491..8a67c3aa845 100644 --- a/docs/content/developer/iota-101/move-overview/structs-and-abilities/key.mdx +++ b/docs/content/developer/iota-101/move-overview/structs-and-abilities/key.mdx @@ -1,5 +1,8 @@ --- title: Key Ability +tags: [move-sc] +teams: + - iotaledger/vm-language description: In Move, the key ability on a type indicates that the instance of the type can be stored in the storage. This section covers the key ability, how it works, and how to use it in Move. --- diff --git a/docs/content/developer/iota-101/move-overview/structs-and-abilities/store.mdx b/docs/content/developer/iota-101/move-overview/structs-and-abilities/store.mdx index aedd202e8a5..e31ce1021db 100644 --- a/docs/content/developer/iota-101/move-overview/structs-and-abilities/store.mdx +++ b/docs/content/developer/iota-101/move-overview/structs-and-abilities/store.mdx @@ -1,5 +1,8 @@ --- title: Store Ability +tags: [move-sc] +teams: + - iotaledger/vm-language description: In Move, the store ability on a type indicates that the instance of the type can be stored in objects. This section covers the store ability, how it works, and how to use it in Move. --- diff --git a/docs/content/developer/iota-101/move-overview/structs-and-abilities/struct.mdx b/docs/content/developer/iota-101/move-overview/structs-and-abilities/struct.mdx index 1797bceafe7..6830fda6e7a 100644 --- a/docs/content/developer/iota-101/move-overview/structs-and-abilities/struct.mdx +++ b/docs/content/developer/iota-101/move-overview/structs-and-abilities/struct.mdx @@ -1,5 +1,8 @@ --- title: Struct +tags: [move-sc] +teams: + - iotaledger/vm-language description: Custom types in Move can be defined using the struct keyword. This section covers the struct definition, how to create and use an instance, and how to unpack a struct. --- diff --git a/docs/content/developer/iota-101/move-overview/visibility.mdx b/docs/content/developer/iota-101/move-overview/visibility.mdx index 626edd0ff22..72b16511040 100644 --- a/docs/content/developer/iota-101/move-overview/visibility.mdx +++ b/docs/content/developer/iota-101/move-overview/visibility.mdx @@ -1,3 +1,8 @@ +--- +tags: [move-sc] +teams: + - iotaledger/vm-language +--- # Visibility Modifiers Every module member has a visibility. By default, all module members are _private_ - meaning they diff --git a/docs/content/developer/iota-101/nft/create-nft.mdx b/docs/content/developer/iota-101/nft/create-nft.mdx index 89a68b7d5be..8d15a2b19c9 100644 --- a/docs/content/developer/iota-101/nft/create-nft.mdx +++ b/docs/content/developer/iota-101/nft/create-nft.mdx @@ -1,7 +1,9 @@ --- title: Create a Non-Fungible Token description: Learn how to create a non-fungible token (NFT) on IOTA using Move. -tags: [ move, nft, erc721] +tags: [ move-sc, nft, erc721] +teams: + - iotaledger/vm-language --- import Quiz from '@site/src/components/Quiz'; import questions from '/json/developer/iota-101/create-nft.json'; diff --git a/docs/content/developer/iota-101/nft/marketplace.mdx b/docs/content/developer/iota-101/nft/marketplace.mdx index 531314f5c92..e2f4d85511c 100644 --- a/docs/content/developer/iota-101/nft/marketplace.mdx +++ b/docs/content/developer/iota-101/nft/marketplace.mdx @@ -1,6 +1,8 @@ --- description: A brief introduction to implementing NFT marketplace extension using the Kiosk Apps standard in IOTA's Move language. -tags: [ move, nft, tutorial, erc721] +tags: [ move-sc, nft, tutorial, erc721] +teams: + - iotaledger/vm-language --- diff --git a/docs/content/developer/iota-101/nft/rent-nft.mdx b/docs/content/developer/iota-101/nft/rent-nft.mdx index af5453a4a89..a4659fc82a4 100644 --- a/docs/content/developer/iota-101/nft/rent-nft.mdx +++ b/docs/content/developer/iota-101/nft/rent-nft.mdx @@ -1,6 +1,8 @@ --- description: A brief introduction to implementing NFT rental functionality using the Kiosk Apps standard in IOTA's Move language. -tags: [ move, nft, tutorial] +tags: [ move-sc, nft, tutorial] +teams: + - iotaledger/vm-language --- # Rent NFTs with Kiosk Apps in IOTA diff --git a/docs/content/developer/iota-101/objects/dynamic-fields/dynamic-fields.mdx b/docs/content/developer/iota-101/objects/dynamic-fields/dynamic-fields.mdx index bfa112c8a39..bc9fd31cd5e 100644 --- a/docs/content/developer/iota-101/objects/dynamic-fields/dynamic-fields.mdx +++ b/docs/content/developer/iota-101/objects/dynamic-fields/dynamic-fields.mdx @@ -1,5 +1,8 @@ --- title: Dynamic Object Fields +tags: [move-sc] +teams: + - iotaledger/vm-language description: Dynamic fields and dynamic object fields on IOTA allow flexible storage and manipulation, with the ability to add, remove, and store heterogeneous values dynamically while only affecting gas costs when accessed. --- import Quiz from '@site/src/components/Quiz'; diff --git a/docs/content/developer/iota-101/objects/dynamic-fields/tables-bags.mdx b/docs/content/developer/iota-101/objects/dynamic-fields/tables-bags.mdx index 1d3ac884bde..5130351cd7e 100644 --- a/docs/content/developer/iota-101/objects/dynamic-fields/tables-bags.mdx +++ b/docs/content/developer/iota-101/objects/dynamic-fields/tables-bags.mdx @@ -1,5 +1,8 @@ --- title: Table and Bag +tags: [move-sc] +teams: + - iotaledger/vm-language description: IOTA provides `Table` and `Bag` collections built using dynamic fields, offering additional support to count entries and prevent accidental deletion when non-empty. --- import Quiz from '@site/src/components/Quiz'; diff --git a/docs/content/developer/iota-101/objects/events.mdx b/docs/content/developer/iota-101/objects/events.mdx index 82c59bae484..26aa413a485 100644 --- a/docs/content/developer/iota-101/objects/events.mdx +++ b/docs/content/developer/iota-101/objects/events.mdx @@ -1,5 +1,8 @@ --- title: Events +tags: [move-sc] +teams: + - iotaledger/vm-language description: Events are the main way to track actions on chain. --- import Quiz from '@site/src/components/Quiz'; diff --git a/docs/content/developer/iota-101/objects/object-model.mdx b/docs/content/developer/iota-101/objects/object-model.mdx index 8572bafa36d..6630ab4c096 100644 --- a/docs/content/developer/iota-101/objects/object-model.mdx +++ b/docs/content/developer/iota-101/objects/object-model.mdx @@ -1,5 +1,8 @@ --- title: Object Model +tags: [move-sc] +teams: + - iotaledger/vm-language description: Everything on the IOTA blockchain is an object, with metadata, type of ownership, and a referencing scheme. --- import Quiz from '@site/src/components/Quiz'; diff --git a/docs/content/developer/iota-101/objects/object-ownership/address-owned.mdx b/docs/content/developer/iota-101/objects/object-ownership/address-owned.mdx index 48dce455dd7..da735abedc3 100644 --- a/docs/content/developer/iota-101/objects/object-ownership/address-owned.mdx +++ b/docs/content/developer/iota-101/objects/object-ownership/address-owned.mdx @@ -1,5 +1,8 @@ --- title: Address-Owned Objects +tags: [move-sc] +teams: + - iotaledger/vm-language description: Address-owned objects are owned by a specific IOTA 32-byte address, either an account address or an object ID, and are accessible only to their owner. --- import Quiz from '@site/src/components/Quiz'; diff --git a/docs/content/developer/iota-101/objects/object-ownership/immutable.mdx b/docs/content/developer/iota-101/objects/object-ownership/immutable.mdx index 0f56adadf7e..aa6953191e7 100644 --- a/docs/content/developer/iota-101/objects/object-ownership/immutable.mdx +++ b/docs/content/developer/iota-101/objects/object-ownership/immutable.mdx @@ -1,9 +1,10 @@ --- title: Immutable Objects -description: Immutable objects on IOTA cannot be mutated, transferred, or deleted once frozen. These objects are ownerless and can be used by anyone on the network. -tags: [ iota-cli ] +tags: [move-sc, iota-cli] teams: + - iotaledger/vm-language - iotaledger/dev-tools +description: Immutable objects on IOTA cannot be mutated, transferred, or deleted once frozen. These objects are ownerless and can be used by anyone on the network. --- import Quiz from '@site/src/components/Quiz'; import questions from '/json/developer/iota-101/objects/object-ownership/immutable.json'; diff --git a/docs/content/developer/iota-101/objects/object-ownership/object-ownership.mdx b/docs/content/developer/iota-101/objects/object-ownership/object-ownership.mdx index 707a81c25de..fb318718fa3 100644 --- a/docs/content/developer/iota-101/objects/object-ownership/object-ownership.mdx +++ b/docs/content/developer/iota-101/objects/object-ownership/object-ownership.mdx @@ -1,5 +1,8 @@ --- title: Object Ownership +tags: [move-sc] +teams: + - iotaledger/vm-language description: Overview of the different types of object ownership in IOTA and their implications for transactions and access. --- import Quiz from '@site/src/components/Quiz'; diff --git a/docs/content/developer/iota-101/objects/object-ownership/shared.mdx b/docs/content/developer/iota-101/objects/object-ownership/shared.mdx index 941193e958d..b340750670c 100644 --- a/docs/content/developer/iota-101/objects/object-ownership/shared.mdx +++ b/docs/content/developer/iota-101/objects/object-ownership/shared.mdx @@ -1,5 +1,8 @@ --- title: Shared Objects +tags: [move-sc] +teams: + - iotaledger/vm-language description: Anyone can access shared objects on the IOTA network, so care must be taken to secure access, if needed. --- import Quiz from '@site/src/components/Quiz'; diff --git a/docs/content/developer/iota-101/objects/object-ownership/wrapped.mdx b/docs/content/developer/iota-101/objects/object-ownership/wrapped.mdx index 7344f77d383..3809983c846 100644 --- a/docs/content/developer/iota-101/objects/object-ownership/wrapped.mdx +++ b/docs/content/developer/iota-101/objects/object-ownership/wrapped.mdx @@ -1,5 +1,8 @@ --- title: Wrapped Objects +tags: [move-sc] +teams: + - iotaledger/vm-language --- import Quiz from '@site/src/components/Quiz'; import questions from '/json/developer/iota-101/objects/object-ownership/wrapped.json'; diff --git a/docs/content/developer/iota-101/objects/shared-owned.mdx b/docs/content/developer/iota-101/objects/shared-owned.mdx index 91982a76c85..7a1e395db60 100644 --- a/docs/content/developer/iota-101/objects/shared-owned.mdx +++ b/docs/content/developer/iota-101/objects/shared-owned.mdx @@ -1,5 +1,8 @@ --- title: Shared versus Owned Objects +tags: [move-sc] +teams: + - iotaledger/vm-language description: On IOTA, you can use shared objects, owned objects, or both in your transactions. Weigh the benefits of each to decide the best approach for your project. --- import Quiz from '@site/src/components/Quiz'; diff --git a/docs/content/developer/iota-101/objects/transfers/custom-rules.mdx b/docs/content/developer/iota-101/objects/transfers/custom-rules.mdx index b3113d634d0..3164bd2a9ed 100644 --- a/docs/content/developer/iota-101/objects/transfers/custom-rules.mdx +++ b/docs/content/developer/iota-101/objects/transfers/custom-rules.mdx @@ -1,5 +1,8 @@ --- title: Custom Transfer Rules +tags: [move-sc] +teams: + - iotaledger/vm-language description: Custom transfer rules enable you to define a set of rules that must be met before IOTA considers a transfer operation valid. --- import Quiz from '@site/src/components/Quiz'; diff --git a/docs/content/developer/iota-101/objects/transfers/transfer-to-object.mdx b/docs/content/developer/iota-101/objects/transfers/transfer-to-object.mdx index 00900eb1c3b..6eaf7981395 100644 --- a/docs/content/developer/iota-101/objects/transfers/transfer-to-object.mdx +++ b/docs/content/developer/iota-101/objects/transfers/transfer-to-object.mdx @@ -1,9 +1,10 @@ --- title: Transfer to Object description: On IOTA, you can transfer objects to objects in the same way you can transfer objects to addresses. -tags: [ rust, sdk, rust-sdk] +tags: [ move-sc, rust, sdk, rust-sdk] teams: - iotaledger/dev-tools + - iotaledger/vm-language --- import Quiz from '@site/src/components/Quiz'; import questions from '/json/developer/iota-101/objects/transfers/transfer-to-object.json'; diff --git a/docs/content/developer/iota-101/objects/uid-id.mdx b/docs/content/developer/iota-101/objects/uid-id.mdx index 7340b19a43d..4b48552bce6 100644 --- a/docs/content/developer/iota-101/objects/uid-id.mdx +++ b/docs/content/developer/iota-101/objects/uid-id.mdx @@ -1,3 +1,8 @@ +--- +tags: [move-sc] +teams: + - iotaledger/vm-language +--- # UID and ID The `UID` type is defined in the `iota::object` module and is a wrapper around an `ID` which, in diff --git a/docs/content/developer/iota-101/objects/versioning.mdx b/docs/content/developer/iota-101/objects/versioning.mdx index 4d67615ebed..8c16a93395e 100644 --- a/docs/content/developer/iota-101/objects/versioning.mdx +++ b/docs/content/developer/iota-101/objects/versioning.mdx @@ -1,4 +1,7 @@ --- +tags: [move-sc] +teams: + - iotaledger/vm-language title: Object and Package Versioning description: Versioning provides the ability to upgrade packages and objects on the IOTA network. --- diff --git a/docs/content/developer/iota-101/transactions/ptb/optimizing-gas-with-coin-merging.mdx b/docs/content/developer/iota-101/transactions/ptb/optimizing-gas-with-coin-merging.mdx index c5ed6d1a1da..a5903ca86c2 100644 --- a/docs/content/developer/iota-101/transactions/ptb/optimizing-gas-with-coin-merging.mdx +++ b/docs/content/developer/iota-101/transactions/ptb/optimizing-gas-with-coin-merging.mdx @@ -1,6 +1,8 @@ --- description: Learn how to manage multiple IOTA coins by combining them to pay gas fees efficiently. -tags: [ move, transaction] +tags: [ move-sc,transaction] +teams: + - iotaledger/vm-language --- import Quiz from '@site/src/components/Quiz'; import questions from '/json/developer/iota-101/transactions/ptb/optimizing-gas-with-coin-merging.json'; diff --git a/docs/content/developer/iota-101/transactions/ptb/programmable-transaction-blocks-overview.mdx b/docs/content/developer/iota-101/transactions/ptb/programmable-transaction-blocks-overview.mdx index 25e0a0da21e..fff276da0ce 100644 --- a/docs/content/developer/iota-101/transactions/ptb/programmable-transaction-blocks-overview.mdx +++ b/docs/content/developer/iota-101/transactions/ptb/programmable-transaction-blocks-overview.mdx @@ -1,6 +1,6 @@ --- description: Learn about Programmable Transaction Blocks (PTBs) in IOTA and how they enhance smart contract efficiency. -tags: [ move, transaction, typescript, sdk] +tags: [ move-vm, transaction, typescript, sdk] --- # Programmable Transaction Blocks Overview diff --git a/docs/content/developer/iota-101/transactions/ptb/programmable-transaction-blocks.mdx b/docs/content/developer/iota-101/transactions/ptb/programmable-transaction-blocks.mdx index 28894de7fdb..a0b06cb014d 100644 --- a/docs/content/developer/iota-101/transactions/ptb/programmable-transaction-blocks.mdx +++ b/docs/content/developer/iota-101/transactions/ptb/programmable-transaction-blocks.mdx @@ -1,8 +1,9 @@ --- description: Learn how to execute multiple commands in a single IOTA transaction using programmable transaction blocks. -tags: [ move, transaction, rust-sdk] +tags: [ move-sc, transaction, rust-sdk] teams: - iotaledger/dev-tools + - iotaledger/vm-language --- import Quiz from '@site/src/components/Quiz'; import questions from '/json/developer/iota-101/transactions/ptb/programmable-transaction-blocks.json'; diff --git a/docs/content/developer/iota-101/transactions/ptb/simulating-references.mdx b/docs/content/developer/iota-101/transactions/ptb/simulating-references.mdx index 037ec44dcc5..f43bf005bc2 100644 --- a/docs/content/developer/iota-101/transactions/ptb/simulating-references.mdx +++ b/docs/content/developer/iota-101/transactions/ptb/simulating-references.mdx @@ -1,6 +1,8 @@ --- description: Discover how to simulate references in IOTA's programmable transaction blocks using the borrow module. -tags: [ move, rust, transaction] +tags: [ move-sc, rust, transaction] +teams: + - iotaledger/vm-language --- import Quiz from '@site/src/components/Quiz'; import questions from '/json/developer/iota-101/transactions/ptb/simulating-references.json'; diff --git a/docs/content/developer/iota-101/transactions/sign-and-send-transactions.mdx b/docs/content/developer/iota-101/transactions/sign-and-send-transactions.mdx index cf7fe825b2c..c0e3311a1aa 100644 --- a/docs/content/developer/iota-101/transactions/sign-and-send-transactions.mdx +++ b/docs/content/developer/iota-101/transactions/sign-and-send-transactions.mdx @@ -1,8 +1,9 @@ --- description: A guide on how to construct, sign, and submit transactions in a Move-based blockchain. -tags: [ tutorial, move, rust, typescript, transaction, iota-cli, rust-sdk] +tags: [ tutorial, move-sc, rust, typescript, transaction, iota-cli, rust-sdk] teams: - iotaledger/dev-tools + - iotaledger/vm-language --- import Quiz from '@site/src/components/Quiz'; import questions from '/json/developer/iota-101/transactions/sign-and-send-transactions.json'; diff --git a/docs/content/developer/iota-101/transactions/sponsored-transactions/about-sponsored-transactions.mdx b/docs/content/developer/iota-101/transactions/sponsored-transactions/about-sponsored-transactions.mdx index e070e4a86ff..e6af4dd3576 100644 --- a/docs/content/developer/iota-101/transactions/sponsored-transactions/about-sponsored-transactions.mdx +++ b/docs/content/developer/iota-101/transactions/sponsored-transactions/about-sponsored-transactions.mdx @@ -1,6 +1,8 @@ --- description: A guide to understanding and implementing sponsored transactions on the IOTA blockchain, including roles, use cases, workflows, and risk considerations. -tags: [ move, transaction, address] +tags: [ move-sc, transaction, address] +teams: + - iotaledger/vm-language --- import Quiz from '@site/src/components/Quiz'; import questions from '/json/developer/iota-101/transactions/sponsored-transactions/about-sponsored-transactions.json'; diff --git a/docs/content/developer/iota-101/transactions/sponsored-transactions/use-sponsored-transactions.mdx b/docs/content/developer/iota-101/transactions/sponsored-transactions/use-sponsored-transactions.mdx index ec716778af6..31856c6a4ca 100644 --- a/docs/content/developer/iota-101/transactions/sponsored-transactions/use-sponsored-transactions.mdx +++ b/docs/content/developer/iota-101/transactions/sponsored-transactions/use-sponsored-transactions.mdx @@ -1,8 +1,9 @@ --- description: A guide to using sponsored transactions on the IOTA blockchain, including . -tags: [ move, transaction, address, rust-sdk] +tags: [ move-sc, transaction, address, rust-sdk] teams: - iotaledger/dev-tools + - iotaledger/vm-language --- import Quiz from '@site/src/components/Quiz'; diff --git a/docs/content/developer/iota-101/transactions/transactions.mdx b/docs/content/developer/iota-101/transactions/transactions.mdx index f02b166155d..38108b1dbd3 100644 --- a/docs/content/developer/iota-101/transactions/transactions.mdx +++ b/docs/content/developer/iota-101/transactions/transactions.mdx @@ -1,6 +1,8 @@ --- description: An introduction to transactions, their types, metadata, and execution flow in Move-based blockchain networks. -tags: [ move, transaction, address] +tags: [ move-sc,transaction, address] +teams: + - iotaledger/vm-language --- import Quiz from '@site/src/components/Quiz'; import questions from '/json/developer/iota-101/transactions/transactions.json'; diff --git a/docs/content/developer/iota-move-ctf/challenge_0.mdx b/docs/content/developer/iota-move-ctf/challenge_0.mdx index fc358cb968a..d4f723fa165 100644 --- a/docs/content/developer/iota-move-ctf/challenge_0.mdx +++ b/docs/content/developer/iota-move-ctf/challenge_0.mdx @@ -1,3 +1,8 @@ +--- +tags: [move-sc] +teams: + - iotaledger/vm-language +--- import MintLeapFrogNFT from '@site/src/components/CTF/mint-leap-frog-nft'; # Challenge 0: Mint Leap Frog NFT diff --git a/docs/content/developer/iota-move-ctf/challenge_1.mdx b/docs/content/developer/iota-move-ctf/challenge_1.mdx index 141a2791a6e..c2d443b837c 100644 --- a/docs/content/developer/iota-move-ctf/challenge_1.mdx +++ b/docs/content/developer/iota-move-ctf/challenge_1.mdx @@ -1,4 +1,8 @@ - +--- +tags: [move-sc] +teams: + - iotaledger/vm-language +--- import ChallengeVerifier from '@site/src/components/CTF/ctf-verifier'; # Challenge 1: Checkin diff --git a/docs/content/developer/iota-move-ctf/challenge_2.mdx b/docs/content/developer/iota-move-ctf/challenge_2.mdx index 046822df864..33896f09b5c 100644 --- a/docs/content/developer/iota-move-ctf/challenge_2.mdx +++ b/docs/content/developer/iota-move-ctf/challenge_2.mdx @@ -1,9 +1,10 @@ - +--- +tags: [move-sc] +teams: + - iotaledger/vm-language +--- import ChallengeVerifier from '@site/src/components/CTF/ctf-verifier'; - - - # Challenge 2: Lucky Number In this challenge you are supposed to get the flag Event by passing in the right parameters to the `get_flag` function in the `luckynumber` module. If you do this correctly you should get a Flag event in return. diff --git a/docs/content/developer/iota-move-ctf/challenge_3.mdx b/docs/content/developer/iota-move-ctf/challenge_3.mdx index 5627115e415..cae846ee44d 100644 --- a/docs/content/developer/iota-move-ctf/challenge_3.mdx +++ b/docs/content/developer/iota-move-ctf/challenge_3.mdx @@ -1,9 +1,10 @@ - +--- +tags: [move-sc] +teams: + - iotaledger/vm-language +--- import ChallengeVerifier from '@site/src/components/CTF/ctf-verifier'; - - - # Challenge 3: MintCoin Mechanics In this challenge, you'll dive into the mechanics of "MintCoin," a [coin](../standards/coin.mdx) that allows anyone to mint new tokens using a "Proof of Move" process. However, minting alone will not be enough to get the flag—you'll need to go a step further. diff --git a/docs/content/developer/iota-move-ctf/challenge_4.mdx b/docs/content/developer/iota-move-ctf/challenge_4.mdx index 66fe23e263c..7c946950ba6 100644 --- a/docs/content/developer/iota-move-ctf/challenge_4.mdx +++ b/docs/content/developer/iota-move-ctf/challenge_4.mdx @@ -1,9 +1,10 @@ - +--- +tags: [move-sc] +teams: + - iotaledger/vm-language +--- import ChallengeVerifier from '@site/src/components/CTF/ctf-verifier'; - - - # Challenge 4: Airdrop Your mission is to participate in the "Horse Token" airdrop and capture the elusive flag. You'll need to mint some Horse Tokens and claim your share through the airdrop mechanism. But simply collecting tokens won’t be enough—securing the flag requires a bit more effort. diff --git a/docs/content/developer/iota-move-ctf/challenge_5.mdx b/docs/content/developer/iota-move-ctf/challenge_5.mdx index bfe79236979..7b2d28d3f51 100644 --- a/docs/content/developer/iota-move-ctf/challenge_5.mdx +++ b/docs/content/developer/iota-move-ctf/challenge_5.mdx @@ -1,9 +1,10 @@ - +--- +tags: [move-sc] +teams: + - iotaledger/vm-language +--- import ChallengeVerifier from '@site/src/components/CTF/ctf-verifier'; - - - # Challenge 5: Perfect Pizza When in Italy, pizza is a way of life. Crafted from simple ingredients with an artful touch, only the perfect combination will gain the approval of the pizzaiolo (master pizza maker). Choose your ingredients wisely—anything less than perfection and your creation won’t pass the test. diff --git a/docs/content/developer/iota-move-ctf/challenge_6.mdx b/docs/content/developer/iota-move-ctf/challenge_6.mdx index 2c8d253a92c..fe2994db752 100644 --- a/docs/content/developer/iota-move-ctf/challenge_6.mdx +++ b/docs/content/developer/iota-move-ctf/challenge_6.mdx @@ -1,9 +1,10 @@ - +--- +tags: [move-sc] +teams: + - iotaledger/vm-language +--- import ChallengeVerifier from '@site/src/components/CTF/ctf-verifier'; - - - # Challenge 6: Go Recycle! The City of Venice is tired of all the trash ending up in the canals, especially pizza boxes still filled with a certain type of pizza which are just dumped everywhere are ruining the experience. They decided to start a recycling program rewarding people who do their part with a Venetian Flag; Go grab one! diff --git a/docs/content/developer/iota-move-ctf/challenge_7.mdx b/docs/content/developer/iota-move-ctf/challenge_7.mdx index 62b2900bbd4..42c4a312243 100644 --- a/docs/content/developer/iota-move-ctf/challenge_7.mdx +++ b/docs/content/developer/iota-move-ctf/challenge_7.mdx @@ -1,9 +1,10 @@ - +--- +tags: [move-sc] +teams: + - iotaledger/vm-language +--- import ChallengeVerifier from '@site/src/components/CTF/ctf-verifier'; - - - # Challenge 7: PTBs In response to the recent pizza challenge, the city of Venice has implemented a smart contract to efficiently manage ingredients and prevent hoarding. Participants are invited to utilize these perishable ingredients, which must be used immediately to create dough. diff --git a/docs/content/developer/iota-move-ctf/challenge_8.mdx b/docs/content/developer/iota-move-ctf/challenge_8.mdx index 0417f08574a..121ffed7de6 100644 --- a/docs/content/developer/iota-move-ctf/challenge_8.mdx +++ b/docs/content/developer/iota-move-ctf/challenge_8.mdx @@ -1,9 +1,10 @@ - +--- +tags: [move-sc] +teams: + - iotaledger/vm-language +--- import ChallengeVerifier from '@site/src/components/CTF/ctf-verifier'; - - - # Challenge 8: Flash! In this challenge, you will explore a decentralized exchange (DEX) with a critical flaw you can exploit to capture the flag. This exchange operates with two tokens—CTFA and CTFB—and features a vault that allows users to take flash loans. Your objective is to manipulate the token balances effectively to obtain the flag by using the vulnerabilities in the DEX's flash loan mechanism. diff --git a/docs/content/developer/standards/closed-loop-token.mdx b/docs/content/developer/standards/closed-loop-token.mdx index 661526a6ef7..4a927dd3563 100644 --- a/docs/content/developer/standards/closed-loop-token.mdx +++ b/docs/content/developer/standards/closed-loop-token.mdx @@ -1,5 +1,8 @@ --- title: Closed-Loop Token +tags: [move-sc] +teams: + - iotaledger/vm-language --- import Quiz from '@site/src/components/Quiz'; diff --git a/docs/content/developer/standards/closed-loop-token/action-request.mdx b/docs/content/developer/standards/closed-loop-token/action-request.mdx index ee591733387..ad09c945d9d 100644 --- a/docs/content/developer/standards/closed-loop-token/action-request.mdx +++ b/docs/content/developer/standards/closed-loop-token/action-request.mdx @@ -1,5 +1,8 @@ --- title: Action Request +tags: [move-sc] +teams: + - iotaledger/vm-language --- import Quiz from '@site/src/components/Quiz'; diff --git a/docs/content/developer/standards/closed-loop-token/coin-token-comparison.mdx b/docs/content/developer/standards/closed-loop-token/coin-token-comparison.mdx index 7568044ea3a..835fe119111 100644 --- a/docs/content/developer/standards/closed-loop-token/coin-token-comparison.mdx +++ b/docs/content/developer/standards/closed-loop-token/coin-token-comparison.mdx @@ -1,5 +1,8 @@ --- title: Coin/Token API comparison +tags: [move-sc] +teams: + - iotaledger/vm-language --- Use this appendix as a quick reference to compare the API of the `coin` and `token` modules. diff --git a/docs/content/developer/standards/closed-loop-token/rules.mdx b/docs/content/developer/standards/closed-loop-token/rules.mdx index 9dd641322c9..1b2060e86ad 100644 --- a/docs/content/developer/standards/closed-loop-token/rules.mdx +++ b/docs/content/developer/standards/closed-loop-token/rules.mdx @@ -1,5 +1,8 @@ --- title: Rules +tags: [move-sc] +teams: + - iotaledger/vm-language --- import Quiz from '@site/src/components/Quiz'; diff --git a/docs/content/developer/standards/closed-loop-token/spending.mdx b/docs/content/developer/standards/closed-loop-token/spending.mdx index 5f09f149eb4..9cea3b0e254 100644 --- a/docs/content/developer/standards/closed-loop-token/spending.mdx +++ b/docs/content/developer/standards/closed-loop-token/spending.mdx @@ -1,5 +1,8 @@ --- title: Spending +tags: [move-sc] +teams: + - iotaledger/vm-language --- Because `Token` types do not have the `store` ability, it is impossible to store them in another object. Hence, `Coin`-like approaches to spending are not possible - an application that takes `Token` as a payment won't be able to add it to its balance. To address this issue, `Token` has a `spend` method, which allows spending it in one application and then delivering it as a `spent_balance` to the [`TokenPolicy`](token-policy.mdx) or burning right away with a `TreasuryCap`. diff --git a/docs/content/developer/standards/closed-loop-token/token-policy.mdx b/docs/content/developer/standards/closed-loop-token/token-policy.mdx index 7576aee48da..7c04b952a85 100644 --- a/docs/content/developer/standards/closed-loop-token/token-policy.mdx +++ b/docs/content/developer/standards/closed-loop-token/token-policy.mdx @@ -1,5 +1,8 @@ --- title: Token Policy +tags: [move-sc] +teams: + - iotaledger/vm-language --- import Quiz from '@site/src/components/Quiz'; diff --git a/docs/content/developer/standards/coin-manager.mdx b/docs/content/developer/standards/coin-manager.mdx index a6a31a63de9..693b0f239fe 100644 --- a/docs/content/developer/standards/coin-manager.mdx +++ b/docs/content/developer/standards/coin-manager.mdx @@ -2,6 +2,9 @@ title: Coin Manager description: The Coin Manager Standard provides additional assurances and functionality when it comes to managing Coin supply and metadata. sidebar_label: Coin Manager +tags: [move-sc] +teams: + - iotaledger/vm-language --- import Quiz from '@site/src/components/Quiz'; diff --git a/docs/content/developer/standards/coin.mdx b/docs/content/developer/standards/coin.mdx index d0261f9c66c..47299daff89 100644 --- a/docs/content/developer/standards/coin.mdx +++ b/docs/content/developer/standards/coin.mdx @@ -2,6 +2,9 @@ title: Coin Standard description: The IOTA Coin standard enables you to create a broad range of fungible tokens on the IOTA network to satisfy a number of use cases. The Coin standed on IOTA is equivalent to the ERC-20 technical standard on Ethereum. sidebar_label: Coin +tags: [move-sc] +teams: + - iotaledger/vm-language --- import Quiz from '@site/src/components/Quiz'; diff --git a/docs/content/developer/standards/display.mdx b/docs/content/developer/standards/display.mdx index c06dea9050b..7d6ff5e9772 100644 --- a/docs/content/developer/standards/display.mdx +++ b/docs/content/developer/standards/display.mdx @@ -1,6 +1,9 @@ --- title: IOTA Object Display description: The IOTA Object Display standard is a template engine that enables on-chain management of off-chain representation (display) for a type. +tags: [move-sc] +teams: + - iotaledger/vm-language --- import Quiz from '@site/src/components/Quiz'; diff --git a/docs/content/developer/standards/kiosk-apps.mdx b/docs/content/developer/standards/kiosk-apps.mdx index de64737eaa9..06856da75ce 100644 --- a/docs/content/developer/standards/kiosk-apps.mdx +++ b/docs/content/developer/standards/kiosk-apps.mdx @@ -1,6 +1,9 @@ --- title: Kiosk Apps description: Kiosk apps are a way to extend the functionality of IOTA Kiosk while keeping the core functionality intact. You can develop apps to add new features to a kiosk without having to modify the core code or move the assets elsewhere. +tags: [move-sc] +teams: + - iotaledger/vm-language --- import Quiz from '@site/src/components/Quiz'; diff --git a/docs/content/developer/standards/kiosk.mdx b/docs/content/developer/standards/kiosk.mdx index 7e7856f6bc6..f7a99e1f90e 100644 --- a/docs/content/developer/standards/kiosk.mdx +++ b/docs/content/developer/standards/kiosk.mdx @@ -1,6 +1,9 @@ --- title: IOTA Kiosk description: Kiosk is a decentralized system for commerce applications on IOTA. Kiosk is a part of the IOTA framework, native to the system, and available to everyone. +tags: [move-sc] +teams: + - iotaledger/vm-language --- import Quiz from '@site/src/components/Quiz'; diff --git a/docs/content/developer/standards/wallet-standard.mdx b/docs/content/developer/standards/wallet-standard.mdx index 9342de0bb73..87686e9d016 100644 --- a/docs/content/developer/standards/wallet-standard.mdx +++ b/docs/content/developer/standards/wallet-standard.mdx @@ -1,6 +1,9 @@ --- title: Wallet Standard description: The Wallet standard defines how wallets can automatically be discovered and interacted with from dApps. +tags: [move-sc] +teams: + - iotaledger/vm-language --- import Quiz from '@site/src/components/Quiz'; diff --git a/docs/content/developer/stardust/migration-process.mdx b/docs/content/developer/stardust/migration-process.mdx index eaba3cea200..043ca4f531a 100644 --- a/docs/content/developer/stardust/migration-process.mdx +++ b/docs/content/developer/stardust/migration-process.mdx @@ -1,5 +1,8 @@ --- title: Migration Process +tags: [move-sc] +teams: + - iotaledger/vm-language description: Explains how IOTA assets are handled during migration --- import MigrationWarning from '../../_snippets/migration-warning.mdx'; diff --git a/docs/content/developer/stardust/move-models.mdx b/docs/content/developer/stardust/move-models.mdx index 9225f4cbed5..7afb17c232b 100644 --- a/docs/content/developer/stardust/move-models.mdx +++ b/docs/content/developer/stardust/move-models.mdx @@ -1,6 +1,9 @@ --- title: Stardust Move Models description: Describes how stardust assets are represented in the object-based Move ledger. +tags: [move-sc] +teams: + - iotaledger/vm-language --- import MigrationWarning from '../../_snippets/migration-warning.mdx'; diff --git a/docs/content/developer/stardust/units.mdx b/docs/content/developer/stardust/units.mdx index 5cbd87679e2..ce24ea80c95 100644 --- a/docs/content/developer/stardust/units.mdx +++ b/docs/content/developer/stardust/units.mdx @@ -1,6 +1,9 @@ --- title: Units and Conversions description: Explains the units for IOTA token +tags: [move-sc] +teams: + - iotaledger/vm-language --- import MigrationWarning from '../../_snippets/migration-warning.mdx'; diff --git a/docs/content/iota-identity/explanations/authenticated-assets.mdx b/docs/content/iota-identity/explanations/authenticated-assets.mdx index 0e47fbb1bf2..f4c33da8565 100644 --- a/docs/content/iota-identity/explanations/authenticated-assets.mdx +++ b/docs/content/iota-identity/explanations/authenticated-assets.mdx @@ -7,7 +7,7 @@ teams: tags: - explanation - getting-started - - move + - move-sc - identity --- diff --git a/docs/content/references/cli/ceremony.mdx b/docs/content/references/cli/ceremony.mdx index 74c41542e42..eadac5fc192 100644 --- a/docs/content/references/cli/ceremony.mdx +++ b/docs/content/references/cli/ceremony.mdx @@ -1,14 +1,16 @@ --- title: IOTA Genesis Ceremony CLI description: The IOTA Genesis Ceremony CLI provides commands for building a Genesis blob file. -tags: [ move, cli, reference, validator, iota-cli] +tags: [ cli, reference, validator, iota-cli] teams: - iotaledger/dev-tools + - iotaledger/vm-language --- The IOTA CLI `genesis-ceremony` command allows the orchestration of an IOTA Genesis Ceremony, where multiple remote validators can sign a genesis blob. Each step persists in a file structure that can be shared (for instance, via GitHub) with the validators. +that can be shared (for instance, via GitHub) with the validators. ## Commands diff --git a/docs/content/references/cli/cheatsheet.mdx b/docs/content/references/cli/cheatsheet.mdx index c408eb71777..0911e33db73 100644 --- a/docs/content/references/cli/cheatsheet.mdx +++ b/docs/content/references/cli/cheatsheet.mdx @@ -1,6 +1,6 @@ --- title: IOTA CLI Cheat Sheet -tags: [ move, cli, reference, address, iota-cli] +tags: [cli, reference, address, iota-cli] teams: - iotaledger/dev-tools --- diff --git a/docs/content/references/cli/client.mdx b/docs/content/references/cli/client.mdx index cc4fa2ed9e3..b39ecb9c6d9 100644 --- a/docs/content/references/cli/client.mdx +++ b/docs/content/references/cli/client.mdx @@ -1,7 +1,7 @@ --- title: IOTA Client CLI description: The IOTA Client CLI provides command-level access to interact with the IOTA network. -tags: [ move, cli, transaction, address, reference, iota-cli] +tags: [ cli, transaction, address, reference, iota-cli] teams: - iotaledger/dev-tools --- diff --git a/docs/content/references/cli/console.mdx b/docs/content/references/cli/console.mdx index b64ca550863..8733c98a273 100644 --- a/docs/content/references/cli/console.mdx +++ b/docs/content/references/cli/console.mdx @@ -1,7 +1,7 @@ --- title: IOTA Console CLI description: The IOTA Console CLI provides command-level access to interact with the IOTA network by wrapping the IOTA Client CLI command. -tags: [ move, cli, reference, iota-cli] +tags: [ cli, reference, iota-cli] teams: - iotaledger/dev-tools --- diff --git a/docs/content/references/cli/keytool.mdx b/docs/content/references/cli/keytool.mdx index b45b685b735..963d81e6e1f 100644 --- a/docs/content/references/cli/keytool.mdx +++ b/docs/content/references/cli/keytool.mdx @@ -1,7 +1,7 @@ --- title: IOTA Keytool CLI description: The IOTA Keytool CLI has commands for managing and generating addresses, working with private keys, or signatures. -tags: [ move, cli, reference, iota-cli] +tags: [ cli, reference, iota-cli] teams: - iotaledger/dev-tools --- diff --git a/docs/content/references/cli/move.mdx b/docs/content/references/cli/move.mdx index 9d6575e8855..512f6689946 100644 --- a/docs/content/references/cli/move.mdx +++ b/docs/content/references/cli/move.mdx @@ -1,7 +1,7 @@ --- title: IOTA Move CLI description: The IOTA CLI move command provides commands for working with Move source code directly from a terminal or console. -tags: [ move, cli, reference, iota-cli] +tags: [ cli, reference, iota-cli] teams: - iotaledger/dev-tools --- diff --git a/docs/content/references/cli/ptb.mdx b/docs/content/references/cli/ptb.mdx index 5a9c40845f4..2674992283e 100644 --- a/docs/content/references/cli/ptb.mdx +++ b/docs/content/references/cli/ptb.mdx @@ -1,7 +1,7 @@ --- title: IOTA Client PTB CLI description: The IOTA Client PTB CLI enables a user to construct a PTB and execute it from the command line or a file. -tags: [ move, cli, address, reference, iota-cli] +tags: [ cli, address, reference, iota-cli] teams: - iotaledger/dev-tools --- diff --git a/docs/content/references/cli/validator.mdx b/docs/content/references/cli/validator.mdx index ccd56c23ba8..dbf7cee24d9 100644 --- a/docs/content/references/cli/validator.mdx +++ b/docs/content/references/cli/validator.mdx @@ -1,6 +1,6 @@ --- title: IOTA Validator CLI -tags: [ move, cli, validator, iota-cli] +tags: [ cli, validator, iota-cli] teams: - iotaledger/dev-tools --- diff --git a/docs/content/references/execution-architecture/adapter.mdx b/docs/content/references/execution-architecture/adapter.mdx index 22459fd4a05..f87cce18c40 100644 --- a/docs/content/references/execution-architecture/adapter.mdx +++ b/docs/content/references/execution-architecture/adapter.mdx @@ -1,6 +1,8 @@ --- title: Adapter description: This document describes the architectural approach and execution flow for the adapter and related components. +teams: + - iotaledger/vm-language --- import ThemedImage from '@theme/ThemedImage'; diff --git a/docs/content/references/execution-architecture/execution-layer.mdx b/docs/content/references/execution-architecture/execution-layer.mdx index c0f04f857b3..7e1a2390419 100644 --- a/docs/content/references/execution-architecture/execution-layer.mdx +++ b/docs/content/references/execution-architecture/execution-layer.mdx @@ -1,6 +1,8 @@ --- title: IOTA Execution Layer description: This document describes the architectural approach for iota execution layer. +teams: + - iotaledger/vm-language --- The execution layer is one of the main components of the IOTA architecture. diff --git a/docs/content/references/execution-architecture/iota-execution.mdx b/docs/content/references/execution-architecture/iota-execution.mdx index 24896c30caf..29b97e205ac 100644 --- a/docs/content/references/execution-architecture/iota-execution.mdx +++ b/docs/content/references/execution-architecture/iota-execution.mdx @@ -1,6 +1,8 @@ --- title: IOTA Execution Crate description: This document describes the architectural approach for iota execution crate. +teams: + - iotaledger/vm-language --- import ThemedImage from '@theme/ThemedImage'; diff --git a/docs/content/references/execution-architecture/natives.mdx b/docs/content/references/execution-architecture/natives.mdx index e49c37329bb..f52ec4664c9 100644 --- a/docs/content/references/execution-architecture/natives.mdx +++ b/docs/content/references/execution-architecture/natives.mdx @@ -1,6 +1,8 @@ --- title: Natives & Object Runtime description: This document describes the object runtime and native functions flow. +teams: + - iotaledger/vm-language --- import ThemedImage from '@theme/ThemedImage'; diff --git a/docs/content/references/move/abilities.mdx b/docs/content/references/move/abilities.mdx index 1f34d29be8c..c021d949ee2 100644 --- a/docs/content/references/move/abilities.mdx +++ b/docs/content/references/move/abilities.mdx @@ -1,3 +1,8 @@ +--- +tags: [move-sc] +teams: + - iotaledger/vm-language +--- # Abilities Abilities are a typing feature in Move that control what actions are permissible for values of a given type. This system grants fine grained control over the "linear" typing behavior of values, as well as if and how values are used in global storage. This is implemented by gating access to certain bytecode instructions so that for a value to be used with the bytecode instruction, it must have the ability required (if one is required at all—not every instruction is gated by an ability). diff --git a/docs/content/references/move/generics.mdx b/docs/content/references/move/generics.mdx index d2ea5e7dd89..de96bc482cf 100644 --- a/docs/content/references/move/generics.mdx +++ b/docs/content/references/move/generics.mdx @@ -1,3 +1,8 @@ +--- +tags: [move-sc] +teams: + - iotaledger/vm-language +--- # Generics Generics can be used to define functions and structs over different input data types. This language feature is sometimes referred to as *parametric polymorphism*. In Move, we will often use the term generics interchangeably with type parameters and type arguments. diff --git a/docs/content/references/move/move-lock.mdx b/docs/content/references/move/move-lock.mdx index 51d5b91725d..a2d5063a2dd 100644 --- a/docs/content/references/move/move-lock.mdx +++ b/docs/content/references/move/move-lock.mdx @@ -1,6 +1,9 @@ --- title: Move.lock File description: Get the details of a Move package lock file. +tags: [move-sc] +teams: + - iotaledger/vm-language --- When you build a Move package, the process creates a `Move.lock` file at the root of your package. The file acts as a communication layer between the Move compiler and other tools, like chain-specific command line interfaces and third-party package managers. The `Move.lock` file contains information about your package, including its dependencies, that aids operations like verification of source code against on-chain packages and package manager compatibility. diff --git a/docs/content/references/move/move-toml.mdx b/docs/content/references/move/move-toml.mdx index 4896598d597..92b3141e743 100644 --- a/docs/content/references/move/move-toml.mdx +++ b/docs/content/references/move/move-toml.mdx @@ -1,6 +1,9 @@ --- title: Move.toml File -description: Get the details for a Move package manifest. +description: Get the details for a Move package manifest.--- +tags: [move-sc] +teams: + - iotaledger/vm-language --- Every Move package has a `Move.toml` file as a manifest for the package. The IOTA Move compiler creates the `Move.toml` file for you when you create a new package, but you might need to update the file throughout the lifespan of your package. diff --git a/docs/content/references/rust-sdk.mdx b/docs/content/references/rust-sdk.mdx index 05102a0879b..48e7165ca84 100644 --- a/docs/content/references/rust-sdk.mdx +++ b/docs/content/references/rust-sdk.mdx @@ -1,7 +1,8 @@ --- title: IOTA Rust SDK description: The IOTA Rust SDK provides Rust wrappers around the IOTA API. Using the SDK, you can interact with IOTA networks using the Rust programming language. -tags: [ rust, sdk, reference, rust-sdk]teams: +tags: [ rust, sdk, reference, rust-sdk] +teams: - iotaledger/dev-tools --- diff --git a/docs/content/tags.yml b/docs/content/tags.yml index 2633f13b2c3..b052afb1851 100644 --- a/docs/content/tags.yml +++ b/docs/content/tags.yml @@ -20,9 +20,9 @@ tutorial: description: Learning orientated guide. # Programming languages -move: - label: Move - description: Move programming language. +move-sc: + label: Move Smart Contracts + description: Move Smart Contract programming language. python: label: Python From f9ce1b8dc5e7c5d3e13ca23f6f7b0b07bc5395bf Mon Sep 17 00:00:00 2001 From: Junwei Date: Fri, 31 Jan 2025 17:18:56 +0800 Subject: [PATCH 49/51] feat: add archive configuration to validator config template (#4938) * feat: add archive configuration to validator config template - Adjusted the archive bucket name. * fix: remove default pruning-watermark from template * feat: add archive in README.md * Update docker/fullnode/README.md Co-authored-by: Lucas Tortora <85233773+lucas-tortora@users.noreply.github.com> * Update docs/content/operator/iota-full-node/source.mdx Co-authored-by: Lucas Tortora <85233773+lucas-tortora@users.noreply.github.com> * Update docs/content/operator/iota-full-node/source.mdx Co-authored-by: Ching-Hua (Vivian) Lin * Update docker/fullnode/README.md Co-authored-by: Ching-Hua (Vivian) Lin --------- Co-authored-by: Lucas Tortora <85233773+lucas-tortora@users.noreply.github.com> Co-authored-by: Ching-Hua (Vivian) Lin Co-authored-by: Alexander Sporn --- docs/content/operator/archives.mdx | 14 ++++++------- .../operator/iota-full-node/source.mdx | 20 ++++++++++++++++++- nre/config/validator.yaml | 14 +++++++++++-- setups/fullnode/docker/README.md | 16 +++++++++++++++ 4 files changed, 54 insertions(+), 10 deletions(-) diff --git a/docs/content/operator/archives.mdx b/docs/content/operator/archives.mdx index e85b44865c3..580d2da376f 100644 --- a/docs/content/operator/archives.mdx +++ b/docs/content/operator/archives.mdx @@ -55,9 +55,9 @@ To enable your node to fallback to an archive in case of lag, add this to your f state-archive-read-config: - object-store-config: object-store: "S3" - # Use iota-testnet-archives for testnet - # Use iota-mainnet-archives for mainnet - bucket: "iota--archives" + # Use iota-testnet-archive for testnet + # Use iota-mainnet-archive for mainnet + bucket: "iota--archive" # Use your AWS account access key id aws-access-key-id: "" # Use your AWS account secret access key @@ -78,9 +78,9 @@ state-archive-read-config: state-archive-read-config: - object-store-config: object-store: "GCS" - # Use iota-mainnet-archives for mainnet + # Use iota-mainnet-archive for mainnet # Notice there is no archive bucket setup for testnet in GCS - bucket: "iota--archives" + bucket: "iota--archive" # Use your gcloud service account credentials google-service-account: "" object-store-connection-limit: 20 @@ -107,8 +107,8 @@ Even though these buckets are publicly readable, you need to make sure to proper ], "Effect": "Allow", "Resource": [ - "arn:aws:s3:::iota-mainnet-archives/*", - "arn:aws:s3:::iota-mainnet-archives" + "arn:aws:s3:::iota-mainnet-archive/*", + "arn:aws:s3:::iota-mainnet-archive" ] } ] diff --git a/docs/content/operator/iota-full-node/source.mdx b/docs/content/operator/iota-full-node/source.mdx index 6d0939870bf..579775af5d8 100644 --- a/docs/content/operator/iota-full-node/source.mdx +++ b/docs/content/operator/iota-full-node/source.mdx @@ -117,7 +117,23 @@ cp crates/iota-config/data/fullnode-template.yaml fullnode.yaml -5. (Optional, skip this step to accept the default paths to resources). Edit the `fullnode.yaml` file to use custom paths. +5. Set Up Archival Fallback + +This allows nodes that fall behind to catch up by downloading archive data rather than relying on synchronization. For more details about archives, see [IOTA Archives](https://docs.iota.org/operator/archives). + +```yaml +state-archive-read-config: + - object-store-config: + object-store: "S3" + aws-endpoint: "https://archive..iota.cafe" + aws-virtual-hosted-style-request: true + object-store-connection-limit: 20 + no-sign-request: true + concurrency: 5 + use-for-pruning-watermark: false +``` + +6. (Optional, skip this step to accept the default paths to resources). Edit the `fullnode.yaml` file to use custom paths. 1. Update the `db-path` field with the path to the full node database. ```yaml db-path: "/db-files/iota-fullnode"` @@ -132,6 +148,8 @@ cp crates/iota-config/data/fullnode-template.yaml fullnode.yaml migration-tx-data-path: "/opt/iota/config/migration.blob" ``` + + ## 3. Compile the Node Run the following command to compile the `iota-node`. diff --git a/nre/config/validator.yaml b/nre/config/validator.yaml index f1aff1eb53c..136c9aa8668 100644 --- a/nre/config/validator.yaml +++ b/nre/config/validator.yaml @@ -5,6 +5,8 @@ protocol-key-pair: path: /opt/iota/key-pairs/protocol.key network-key-pair: path: /opt/iota/key-pairs/network.key +account-key-pair: + path: /opt/iota/key-pairs/account.key db-path: /opt/iota/db/authorities_db network-address: /ip4/0.0.0.0/tcp/8080/http metrics-address: "0.0.0.0:9184" @@ -35,5 +37,13 @@ db-checkpoint-config: indirect-objects-threshold: 18446744073709551615 metrics: push-interval-seconds: 60 - # push-url: https://metrics-proxy.testnet.iota.cafe:8443/publish/metrics - # push-url: https://metrics-proxy.mainnet.iota.cafe:8443/publish/metrics + push-url: https://metrics-proxy..iota.cafe:8443/publish/metrics # UPDATE THIS +state-archive-read-config: + - object-store-config: + object-store: "S3" + aws-endpoint: "https://archive..iota.cafe" # UPDATE THIS + aws-virtual-hosted-style-request: true + object-store-connection-limit: 20 + no-sign-request: true + concurrency: 5 + use-for-pruning-watermark: false diff --git a/setups/fullnode/docker/README.md b/setups/fullnode/docker/README.md index 498e176190e..39b2a36e3f0 100644 --- a/setups/fullnode/docker/README.md +++ b/setups/fullnode/docker/README.md @@ -62,6 +62,22 @@ The genesis blob defines the IOTA network configuration. Before starting the Ful - [Devnet migration blob](https://dbfiles.devnet.iota.cafe/migration.blob): `curl -fLJO https://dbfiles.devnet.iota.cafe/migration.blob` +### Set Up Archival Fallback + +This allows nodes that fall behind to catch up by downloading archive data rather than relying on synchronization. For more details about archives, see [IOTA Archives](https://docs.iota.org/operator/archives). + +```yaml +state-archive-read-config: + - object-store-config: + object-store: "S3" + aws-endpoint: "https://archive..iota.cafe" + aws-virtual-hosted-style-request: true + object-store-connection-limit: 20 + no-sign-request: true + concurrency: 5 + use-for-pruning-watermark: false +``` + ## Start Your IOTA Full Node Run the following command to start the IOTA Full Node in Docker: From 576e9d99d7182f761908ea93f32361731de804b3 Mon Sep 17 00:00:00 2001 From: Lucas Tortora <85233773+lucas-tortora@users.noreply.github.com> Date: Fri, 31 Jan 2025 08:59:39 -0300 Subject: [PATCH 50/51] removed unused imaged and edit iota_multisig_structure.png (#5104) --- .../tokenomics/gas-fees-explorer.png | Bin 56132 -> 0 bytes .../iota_multisig_structures.png | Bin 189055 -> 177724 bytes .../how-tos/get-funds/firefly/hit-send.png | Bin 37053 -> 0 bytes docs/site/static/img/iota-evm/multichain.png | Bin 38994 -> 0 bytes 4 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 docs/site/static/img/about-iota/tokenomics/gas-fees-explorer.png delete mode 100644 docs/site/static/img/iota-evm/evm/how-tos/get-funds/firefly/hit-send.png delete mode 100644 docs/site/static/img/iota-evm/multichain.png diff --git a/docs/site/static/img/about-iota/tokenomics/gas-fees-explorer.png b/docs/site/static/img/about-iota/tokenomics/gas-fees-explorer.png deleted file mode 100644 index b0677b142e2787a9d2644f0346add79d54c1d2e3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56132 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≤lMR6B@ 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 diff --git a/docs/site/static/img/developer/cryptography/transaction-auth/iota_multisig_structures.png b/docs/site/static/img/developer/cryptography/transaction-auth/iota_multisig_structures.png index 8e7d8ee3173c4f8529e2626611cc4d523dd7b8b6..cb5c7959b59ede66bee24393e78960e200ceba2b 100644 GIT binary patch literal 177724 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

??)qZ774mzaB0XH$X=D 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�z?HC>*!^0U$pr8b9S)kKhj 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 G`~M##oX7tF literal 189055 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 z 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

ZgHs%f{PJbd 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 E0rJJC1^@s6 diff --git a/docs/site/static/img/iota-evm/multichain.png b/docs/site/static/img/iota-evm/multichain.png deleted file mode 100644 index 2c761f458668d16033ebd68781bdd306b92cca95..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38994 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

K`fs* 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 From a2a18ac57330e9ea6584419d4d0d848710169614 Mon Sep 17 00:00:00 2001 From: Roman Overko <63564739+roman1e2f5p8s@users.noreply.github.com> Date: Fri, 31 Jan 2025 17:11:52 +0100 Subject: [PATCH 51/51] fix(iota-move, move-cli): fix uppercase issue, update validation error message (#4916) --- crates/iota-move/src/new.rs | 3 ++- external-crates/move/crates/move-cli/src/base/new.rs | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/crates/iota-move/src/new.rs b/crates/iota-move/src/new.rs index c7c4f7d107e..cd040f84376 100644 --- a/crates/iota-move/src/new.rs +++ b/crates/iota-move/src/new.rs @@ -24,10 +24,11 @@ pub struct New { impl New { pub fn execute(self, path: Option<&Path>) -> anyhow::Result<()> { let name = &self.new.name.to_lowercase(); + let provided_name = &self.new.name.to_string(); self.new .execute(path, [(IOTA_PKG_NAME, IOTA_PKG_PATH)], [(name, "0x0")], "")?; - let p = path.unwrap_or_else(|| Path::new(&name)); + let p = path.unwrap_or_else(|| Path::new(&provided_name)); let mut w = std::fs::File::create( p.join(SourcePackageLayout::Sources.path()) .join(format!("{name}.move")), diff --git a/external-crates/move/crates/move-cli/src/base/new.rs b/external-crates/move/crates/move-cli/src/base/new.rs index 7e46a0ae34e..cd5b2eafa7d 100644 --- a/external-crates/move/crates/move-cli/src/base/new.rs +++ b/external-crates/move/crates/move-cli/src/base/new.rs @@ -49,8 +49,8 @@ impl New { if !Identifier::is_valid(&name) { return Err(anyhow!( - "Invalid package name. Package name must start with a lowercase letter \ - and consist only of lowercase letters, numbers, and underscores." + "Invalid package name. Package name must start with a letter or underscore \ + and consist only of letters, numbers, and underscores." )); }

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 z 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 G|Gxm2h0Oy1 diff --git a/docs/site/static/img/iota-evm/evm/how-tos/get-funds/firefly/hit-send.png b/docs/site/static/img/iota-evm/evm/how-tos/get-funds/firefly/hit-send.png deleted file mode 100644 index 45599074cccdb5d1d5f924c1771661a6c457f6db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37053 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μ>Fyo<96|W_Gsv;scBO@xcgi6`Dlp& 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

yGYv^n_> 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 Nsy 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 z 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 )=!9Xb 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 literal 0 HcmV?d00001 diff --git a/docs/site/static/img/developer/getting-started/token-transfer/wallet-connected.png b/docs/site/static/img/developer/getting-started/token-transfer/wallet-connected.png new file mode 100644 index 0000000000000000000000000000000000000000..aea321ff18dc01e9e8456bf115688066e9a12aa3 GIT binary patch literal 57190 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 z zkJe~3`bL6&9N|(_=m;7eG`bi7eSp?4L*`^`}@19d$j$BR; z@KK8WR7ClXH>(a85qcWzfQXy2^2Kq=FL)CrVI{5Bdt}f)cYblHK9^6gidyCLjry(1 zioI@FQ$VsCcd~nV$b+}?XdVe2S0ZI{Kg6hsTgDVN*6K>c`wc6&2Iu+J|Ct*v`8&#B zo)C$3zqp+{(yg%kL5_fCM*|e288!`V0G6MF6C|enMs% z@*6+`prCRJP4uO+ zLi@9w0MCudy@xyEfoIkej%Vva$w|{+h01^L$q5Mpry{}-&c!wO{V=z&*OJv&d~o)m zLr@gt9Q<2H(XRb8xN_zO6gBEL+7|(UmOJH*m8{+%b&-$R>FK4Y1!?VYGm4>H)MP2hYF?TPW}BUY5qOfU zt?lawFbiQQtivcu+cSRSawzws-S1rsEa@I3f3?p_#r`Q~q~xS{LSUUgMvQ69W(|@B z`UcRwB?iiyz0XL+h0n;L$?lQ)Mca?O6O5?Eiv_w%nkJuk)H-IKqegRmb(*6_CKS=ka+ zAsZX-eA6mj&fSJoZ({};ClfU&%59ql^Nz$U=5emiJxkFrm4X?%c0dnPISvIpKDB9e z!Rl#fwwlzH(l*&~FKuzZWX$$%b6mpti-ncn7T#QbX3(`{Z!k9R?;07UOtBkMRA3ckqPt*72I-l1D&?{hpR zOBuhl+}zBbX11>ANKEq^{VGxsq*|h~aBv_<8i$U8K9Bj1G|4tf`9X(E>S(1uZjV{zAzl9(c~>VnGg9ui zrND_V#$xo%s9~4aHI-OXiBln~uh4@OVagA(PzzwgmpxC+_rQEMjGw@_T{m|+z_9$< z^wDH13-SWMN~>5YF<0(`R5m*+ZYW1>S9T6pTkT8|UiYs-gGOIXoxhVly0J*@__<5$ zM|$8Ax%CBRWW+R9FfE!Bf2X$jJTa-&2v*CLk*eSErN>^sz{ykGkwLO{dNM}Qu9Tef zt*0$bDNZrhp}@dD?-Fzf;1EUp6m9Ke%5GW4NQ11av%K#>AAOL0~u%z8m9SEvI_AOiwIMn=++v2W>s@_#&UnZt~`6{|<71 zrE-IyoIqPFl)Io)G~>EQ?5;;ExWX#s+|nuuk;=Zf8}{boCUg*}_>Z7sXpaH{Aa5bU zK|UJ;Vd*;yu*O3WKc@8GfmY_S9@fx9w@>N-Mlc~eWF-Nva@oLwM+1p%i?C(yoxrpCU@uSw0k@SF9=!^2kH|Y{DQ&vO%tD^L)(0A$R zIq=M!atWn|%dciah#ff5S>|C@S${I!*}W5gG)PZr`{C~Nq_*wy9`llv>&LXp%mNBxIghtda@-MlE?FBXdRDofY+jL@Av4kNBiWVspcD>7??R_YL5T0 z^tt2G3Z?h`Ko`%>&NH6Wv#_cSNj1_!788fG!#ys)A7?$bA7R*THbh27PJTAGkxLk^ zT_+f|Tn^pfKQ`^G9zjfQA&c@0HJV`_p4slKkE)2bmMy1rN_u7XsB z8$<@)rgDrLP}U$W((>W#yMcr5fP+4-4lO1+Z{K7XW!q*&jXfeIZfkT+GV6vFnx3PY ztkUmU%at;^ZH8sfoqk(?K&7qJ0jEE$T;0PJ%XQ@Oa&ylQwhTGzYXb4cVwO7guW>)t@i2jV@Tr@C|0a*HAJVCZtp4^^atj2`wS&RqDHy!&j^2S1PDJos> z%c#_tXGb%;m6)l4VW5P@xCLf0KC<#SmCmNwBedFC`%xilj8hmW@rXs=b4%ejQ&G}y z{juWqF+wvGmy@wG>FQ4M$?JK!>2vW#_=2fWp2QNh5-6`sf@zw5he@71*4F`*GMuc< z*b^4Nya!Yd=Ry5}`%3lOr|5Vdb$lTvderCn3#xpQs$!O;KwOQLLrHXDSq^9mXF&1BmjVrDxP{&s)k`b^lT?r^PHIEx&qrIHSzClI7eB0eb^HI8XN7 zIolxEY_H#3cEW2OIMz~{cub25G>@2OFAOgLy8|E(?LV+$EF%V>Ipgr3%)*ox(R7A}r0KxT^(MN*jVu7r( zesfWG-s1MDX@V%oacsE#Tq0_0ZqAg-@$JD*lV^l+mR@Vl` z#N%|Roo)QAsII3s%zn+B!s3RFj=8Vt5XHD3bXRosJPN6+ss`Gd#y%8jP!kleU|TxR zr{GQH&9Yxnm0*ZbrKxW8qZHu@e zyFRKrZxY4Y+M^xfzPct|X6C#Xf%>Sl{v-20b>~g+vkGS`BGd&&`jS%|v4&d9{jM52 z{`qBGq6Ou*7Rwuv2c1@$X4h$1PwlS6n@yF979Dgx2(5xe|^#9&hd7(#TGYDk`(_$9`e_n}?W8ev~(?SnZi*^Sxw2nVso>Pr~ z>K1$qY}WpXXcqadK9;sj?TOFm0-wBf^6%wqIl=Ou&2TS__(&HsDM@?I>>Q z?@{86Qrf|7^(b$4y?qK+wh0-eM&|tN;#1b*Ww0bj_^R)-m8Z(qO03^}ii}q~SXC|! zI6W^sFQ)=LDwo3*RgSuM?MX62y0rLOk46d7xh`GZ`WAdpYsc{SL)%w{PMp@diJdwY z8GeK8mBZ31)p!bChrQ^r@lj>P(sbF7zt@1ieXxd@XOL+{6~ORu(I1xCY%q>~j@#9j znWd~ItG=AN*KrZI{j#6fyTnh-|K~yeYEa^R57EN%`$Y%a1r6 z_i+C{Z7TH?5E6>dZ7sZ0@d!5EC+#_lr7Ow2vXChiAHREK!dVG{G3DGUICo#he{iQ- zk?Ja*Hn7pHY9Z=5281k$VmbzMQyTh}GiGR#rYqib!RKU?&*mBUph_@VJv}5i@UE}d zGb+5$K^t&`9~>Dgtq7^)M}j%IPvs<)8YCymDOgOdMjnwWD70F4X073toVUiM)Hj?_Nq;Q%O36J}M=rT6{=r4Fu)6G(BSX<5!ep;N zfg6 zaF^^)bQ{arV+}E=uI~lD3Zg572ibD2POeHg%Sc~E?9|K4sZuZtL-$J!fg+-ttB?Kn zw=y8(MQ5Gp0332Yj$eT9Gd@=fQK~wZ~9s^*wE=3<<1{SJ-IX(1Ta$Sx*-s z>g7#8+AA^^i#5tyJ_Wb5I2`3W7IG%H>*lysRJb1>y)QO-sG~Q@NOgD`pK8WWU7hPr za4u-7xIH$c4x+*JwiKL@m~q;(`@?}gbF0e3_!?_xczjreQBbS;N1GV11q+K=ZCf!MhI?@^8$*jrtR$_fm1OU@XgKxbv%ZpHiY;rl}1=C3Pjc zF0M5@HnhDewICr?*-Z5Z(y=FMoGPJ4m!zH{5Mj3z3$C7dN*V&B);)Gj#U;7S9;am= z1ye3%V`p-GEvtWw$To?*k#On-q6Me!tKQv|Is$bO3cQ`caN_tlDWk3T991c)mYqB; z{AhAY1WRi8!Y!hWWSgru?cyJ-3y(55OiWG+}Dz zthiLowGdn_PdXo4-Lf95?29ZFB;92X415O3rZ~o_rnk}*X^+? zu^&*mOyF06=<+*E)4*6>=bSc{KZw56JH(ar3%=2=?H<#ARd}o%jbc#id~}Hiq4Ns4 z;-Dcwf!K*ia16$eC)^5h842PZ3#5zHSyG0Av#1UTcW1v~{HY0zRhY^sM-th0)YrLr zP!VTEw8(Z^CCbwFSPIxnJDdeU^ntOvNdW#Q*;OUt1yxP_h&~?MZ-KvO|F(X-o}Z)% z$I_c=J&3^OoNQas-Pu4#pCz0IN3bilN28qSj^DEcyi6N;NSmrAc(1}$>j9(j3%f>C ztWX|YFbbn&y9~+Lc(oS=UyjpMfjP;$Ul@K{3PCR?Ph3-B0UmhTi9Mkj^c(f>GQ2BS zWoqnBD+Oa_v1b_==fVXHvhrr0-G-`7Z|VmSEkptW1KN?nHg58(0Vv?hQwEZ~rVq@5 z<`GCDD)gO>LbBTfw!l9iLC!OHg$! z+}iR=UHXlxLDK+V;JE}jVc3jjF}03WK&SDy%Uyx(ck3q`ez%^}*-5A6}LpUn*$Q;n((9>K*i} z%;fS9*cV@JJVq}37zfX!04fT?!0^b=@D zNtUkxl9-ywuM6DNixStc1hQY%3^KiGA=lX6$3q;A6C1oHo_I?H7KM6_T-UPr;~}DI zu4D8#z1PFz34p7q#j!9)f?sj90^g;3S4rD0*kf*GBt+Fr*5%+2&&lJ(eOr8vD%ud> zm3FIJ8?I2zY1zJFtMHdw!#|LI)tOmuT%(e2a=REFxCU>B2};Y5l#p2WB?@f;bkbH5J#O!I$B-s`2NdAa%!OBHH`b9prc=rl##_ zAQ|UciR{FEdW?PfK*Vs}JW!yU+b}X&1KHHtz7@>lAv+eSTFmZL7@Yk9 zV?aYS+#SE3aNupC0dF&Z0GpyF8|M=2D#Pv0?cjs>R38y3H?=qDCuonwZvYXL&LLHG zp`aR}NL|gxJH_C2BA(UO+Kxev_ch#Pcx|jLZV}(HRR&jPvamBtHX|C%Y(KhT6K^mU zX24~!CLDLO>EswU( zNWa{&-_Q{CFR6MN$@D;+a=4#B-Qjeegx>_fgUbaXl24OMuvRoBAMst}2^m*1RSMph zuM+SawgY@knh+4%*YJ0usGG5Yc<NZW)djaB zl|lB{x{=FRpHGju?^>Tfetf)})(b^Fpm>FM%f999Dct+~8 z#Cw@yd$PWUK!`#C7bemv;(IB0VY)`3cMVuyAcbr0GIhWhqkRBZv*(8EmisMElXAyQ z1c;Rbq>y%Gt)d!4PkR^{6)vt3sQU$QHcrAvzF=P@Nu&x;b2b5)s$u;tL4Y5e0*v{w zb(7o7${fg?CQq9sJQoD1YMhK>RuvLD#kPrJUxC}>@FPqx2K8zJ6nx;Ycxa_QALbsJ8) zW38IUqK$eq+3zd)dy{>eD9;paqhrCzsF`?Mh2^YRY<-p!(c~9iqTyzX>#q-5Q}4@E zisXFdrDiB_b@sa_kR^8kyxjQ6FSEpRP)Q!(#RkC3wF0jCOJ6w}MW>`aIDR1 z2moj^Kk9tvRx7>d1s^0J{>nOTj|1=+{{X}NSV{npt8)#WFZOli ziU-~t@#|dxvA2YC(f3j#&%B$XEkx8Glio9QKSb+ev`4k#%5%T~V^P6BID5cY9OTA! zVSOrbE&}N{%DG_N11y&suK^sP!zzzQ@tPEkzG(G1Bt2^#nEhrhzZ9-SrqT&d6p_WOj=J zGpL^~I@KBu6v@Te4aAv7{-O)x9LwIOSfnD+;ryPc1dAcNXprjH^w{D~wOC9PO8uSHJ0ApjmG#Wiv zA+EMlJgARjTjidWhJeHc)5rxN343{vgoUUD0?v;JSa60T#GDjqlF0C*k+VVmyNt&d=d zSGx`;M=cfkCO0oZkZ1d>hZE3-k=AefOyw*zEa0;Y<# zxG%&N1W@NW2UUT)f7N-p2=M;ZQUQD5OWT--$B*59+8}lopc@4i-Kig8UWaqNNL2b$3_z9)~5`{d@hQf2=bMS6wQ z+}Yjc!XeD_FU1+|oc`2-)ae*$5d}=7@B0B)>3SMSKCy3N3i|0dQ~?g{h@d9b6AyTz z(AD37<@EuS5|G}cyNRj=|FCm1?IcmyYLz$k;{B}Mw5L^z4$Li4;Qs!mqr+IEH#L0# zr=PmK44Qbr;bEB;U#2pscRsk3{@{Qbhz{BFywlVSo93#Dt% z6a7gKFwefMW$?I0ycO)?N?pKA{!~z>=-A{UZ1G z1!CrE{^+N+VE~4=50Z9^IY;TEkpAyaXmvg^67)Zykz@w6RD6x)DRQL(>V}^#k42Tcx*wQa9*eM1EZw^+ z!VFX$g0k5}{DZ<3uan=9xkDOEu$mZscL>M15;RtPg?zS<7Ns1xvmQwU|Eor)3t znin|!X&028ESQu2YaM@QZ%1f#gaCf6UnlPfRjnPE!~gbRGg{eas|$OmS=ui#IZ41h zW0PD})ep%N|B{=mP3}hGVZuE^+a-9P2`H_=x)FzK;TRiGA|4UaNuVA%fMq+W9MowL z-3Y36+D}~_V>?p=ZqV$vrvk%YxJl9jLfO@{ZoTZs(>>-mU7+VaI|gH(Lw%? zUYKwK$LIbk>W7v;1?#{nY?K7P)AApn@xQFh{}LIAs4m%D^*euWaKA9Gdh}$hXxyDh}+hgvZm$9?)Zr#@ z3+~yLgwl~Kd~x_zGf%{dMhx2SQRTsYu0xgeWbEyA_c<^7>UEFbWn89-;a6xUOLoLC{63FTfZ#nz__`=$=kIfep{Rbm30Xmf(xD!48 zgN6PtEAziZ1|GcDT^N1n(g3ajs9E3v`T2)g08kg`AJi;fb}tT%pEU4eEI@klUw{Md zxyIDhdT2t#+bc&qSOZR}>@zqNk4eTE=B0Qrt6uT@!?!97Y&CQJA#ix~%Lo7aj<;Z> zC8h47QYEe}XwN;t6NzoKns<56o<1HnA+cn7F6#>Ih>Kam`NF+#rid%$63yu&tD=Ys zUT+^J{Nb$K?IQ4rSfHfJ##x_<^FC5|J>8Z@~6nQxHQYQ z!=)iYJ0j@Ye(zPxq3Nd9DW_!fxw$y5LtSJl-;C7(EE~MQfcBiwp;OX*5_|I;+4d;Ss`BuCUOw1o>zxya@6+XApTzAr?n5W#=F9NI zUS<`zcPJn~iD&qk{r_VDxZ(zIq43-N$N#~Jw$qxFwGX#Zdr973<_ZWO>=}A5_Uhs2 zM*`>{NV6LL-$8}3|9_)N0R7x7d515I_x@u5{pY%M4~`1|iS_?^F?;3+82HNThd-!y zCjt+tBIrw9a)lHR1>$k97f&6>eOi=Wy*<>(!%o>T_S6(^v1wC#v&7E@!*$QJCZ(Rq zzHq1lc<+0_#U4ULRhs*#9$Fp*T=>wo` z(6jwt?R{rd6ic@@j-UhsK|lp$6p;*~f@DTfK#-syh~%JxFbp{d=a`YCA}CqR3L*#$ z8AOug3<5*WIp^@zoO{k|&wX<;$rLpDllb>DSZLnOma(YW-X7yA|O!UAX=3TX-M z+xHzvy&wBv;(2@p{>Cv^et@XP`@aWR0NlIJ%SYn_8KMdG9Ft5AB9!= zb%N4IP9BwkRr;;NK(Yewbe@tNrD*A)7?{1tgy+>g37(nS<@>OW(Q;>?wC2bP{=F)U zu$*BfD9v7>?b!Ns{9#)Q(gRrbR4s4JLWH(B=F%O0 z_z6yieM*QBrl{x-!76-~ws`2tJAPQSL#kVEtIQObUwH`YI$%R7|8&cKYAVCWE+=Tr z%1;>T23?+VmD_dwwJu|LSuM}Qn^fcUU!7g@p z;l=L>+`!?JjVIt$nGbM)&b4Ao#2EG7Xjd{p!?gwCm3Pd~y>aHP5k zn7hhS;%DI(5*dV!=jG=-uxLkK!q@Q<*BikCPco`=U}HO9;zUBNKfW_t757dz5!M)kt^i*pvBEbM*3LdW2iTb$ zYWqS|F=<|F~3Ol3%GZxzF*ZFCpfthFPOU*xa8pz zkafz)&)VsUu*=(RlsJXdbV~U25ngz-I2I@Z?z^EOs1JKz33s4K>Hg<0VC@yDev-hH zS&H`7z;-U$m*7U(YURThLW~mJD14Ce3wSq*8u%)OI&=)Mc9zTlu+vFH(3s>X!>;dA zz6d+vXg`FYnEc#0`E_9%qYS!)SswS@&^7yun?>u$p6cFO!>Km zL1M?`SM7p@p&e7=40KfSeN?L!Fj=eW7un`oEp2?m44*}}J161!tr+repHbhy#))Oq z;lk?)Y3pN6Nke`6uX=gz+P!DQEj)?{20Ct2q))deTM=32@g0cnV{FWx_Lcr^IybrN z{INO8DLjGewr51Y2)Wg0w^LP1E|)!Akv*^!QWoI&_=~^5FmsCQw)fC7yJ#;2zH@Kd z@abWwwvEat-bK22U5s>Zdr@?l3~`UThXSveuVQG)tk3wFSx;wRVh7X}1Y9%#lBHdx zkhmFpnd(h_ih^{PO5Agwx6~JplT$M(dWRo39m<@55!L2ftyU_mN>&Y0M&BGrW%~K+`1A`q-o{r$UQy zb7_twd_uTd^fU4rd)wNZviR-9k#7?Y6)fvtNF4OM<`2Ba`Tj_-ABv5lX47XHTIapo ziEtoV1^baJGX9EP*nQP;4{Y68aXbz2tM=;>*Y`s3v4lNBqBW8v)#gKbxHW}5RJh$5l0MnXTjWu3!eX`fHj?==aVNbMWtbW2B$ z@4TLDrm=qJN(9Zdgzys>6TO*c)9x;{Hg;UAbd?)s&_}?OzF&hK&)mLJJ>=5Bo#XVrG_CR5SfmDPak)rA-0agr4tH9;)7^U5wAzzN=Y7hF(Oeu&+Ba%a&w-XX7{;k_xBy+@UA^cA#nbeB$R z7Zy$BjR~K0@7j*>EOrV`Q<%^HY;auKZ8~r4=DMkC*-!7a;l@foewHs9N{Z(5O#45S9K-KlU;Nhj{M)*H(b9`>W~0+qtUmFE8N3Ej z@k1(~Eo+C9-d;)Wo?=XA?)hx7Q*?LoHQx6zQ_7W6ylY(Sn3iDb?~VPRUC_(SHkgt2 zV!Gc7psWKQtOan|Usg)AU6AdFO?QMO^&6fZ_d`u}w=6swG~VUUeC+PZys2h+{e;EY zlq?tb<-E>@Qi~$=B5yOWg!GRtlI!UrlYN<4lQ)HAguOhv(^HQLb-imSSX{pN zlja9==B>FoxtdQc1*OiO$HvEOt!0~NAO--}l{XTx*y%$K>2Jm72QyC?i}{EVVlv+~HKvpOYqKopTfE zeP}F5jL-Yn*rHGx56oT1={GOTX|Iu*_PO ztZYeFm~?8HbYG5)eCz&Wl%bldJ3{t(vPQCUc6S)>*=2T}UINhp$aq$Y1t`2kUd3z6`+P1oNMLSxnZo=It3? zXjbtw$+qD51(imRDT}Ph=gRC%7}o-S(URqyPaIB6z=&cyMWFN831kSyzE1f3hS6%S+c*7E&#~-(Tps$sFL~&$dkHL`#tYWb{LP zRbtbN{i2x6YH#kkc@CsKBjV z)u)itA&gE@T({d1){^BlTJmCvSyr}bEBo!6ofHEu9mWc3a;jw;4a0M9^;Lz78B zY96slfDzSlbK_L_O-ScnrHR#bn7#U-V~Jdevm=tb-hmRbQ5gFaMDM{?XYWFGWT2AC zQ(_JG1OMqt+#55w4qA$utiUlUVrF_oAN5qoqU!In04ANr1>1;Ldt(G}z7B*n;;%Hh z>^M^O2r+m_asChDA{col^-Q*3g@+)LrrdYzD{#3?%}dks3Qy8vRp}L@Rvq^KV;;35 zbWGcqN1-ny!y?Epe{R}|Nk6v@N2V<25RBq&eOH<7^fN*P69c)^$cj9%uSu`*3Uo15 zm&B@AT0eSwTJOz0yU`oj*;Mbfeh!|Dl36BpiJEc%2ey3Lj_7zOY6iv6dqY-M{kxh4Oa5&PZtxctLuGIl3zMJg78S{Z&0|DpXcok645g|1p~E?e#sntov>8F zX97GP)0HHR*YBMT9MoPM&~c9cV+^YyVaHECb#}C>VU2)1R%1DmqH*csJAw__fAf0Vbe`ofZU5sU@k6{A*X}-)R3S5emAHWTG|DF zPc%6~N3Okx{^A{4*a3XVKsCf>++KlN(Z)WiBM2Ob^6}kgHSHIWt~3orPI9;J#YsC-$wBOLPfCP6y+ZqGy@SFHl2`{!c)Pw zMMe;RjPTr7?jy)-WjoRnR%Rsx znThwE*#|E(JwTiGv6Bt{)0T;zQr`m@0=u$1-0+r>1_+gMS+W{fvyNs3oJ8-7otHK$ z5OPJ`9=tKso9qp|F2w;0QYySRhLphYB9(?q&>`)&$HrQkTnzVeBSbATGZl}=s7`VW zkNKIODwGo4M!Ww~^e^96ajOZA-HA=D-p+(Ic^7|<%>5lZ<)sSt5J|oXce`se+j9hh zwYPIWQ2B;A=*^T%OS;{Rc%?3Rt7OL^5$s9;O`@%5^|S0H)rW1rZpwp@eT{S46d&{1 zv~=m-YbT5CP(4I{Lg3f@Gd^kX2|-?1!hd`=f7*1ab-IK#riqd@6J=1Pa=vvY*{S+U z0>IOqviDCy^`vf!9lPQ8EJOlon0s)jYiRd6j<&jMA6-)8N8QNxyhkl{-=)$}d(4P4 zux1?Vyz49gd8@=ViPs-GeeEA2yr)38Iv6mU*(uk< zx02+bwpEAr&!E4VjnOy_?aRN;&@(J+f6HU}_1=K7FVbkPd8Y!$C>as2g^vm;s)Ho~ z;?qAhx@`AGC7~a#da2!O`xbfPdQOoz@PVe>V;nK8U4ujiO`@I?c=eKRe5WBMQmAPJ z*4(0*r7PJBNk8$EWksWDp>q^!Va=aH=HuC|-pYzK`G)A(DCn)-ED(;#p)^hqIpMRLNOxu)?&g3Y2 zygy(R0;Vfp(h0dN)isD4F0YkbO>(f0)%zwQGws)F+n>eae4uo10cGlGAKO#ZkeOT0 zP<(ba#qAp}2SoBphXWnwgOB+0?yxPA-fru@=Gcb0*b>?HILgy(Wg=wQq+lqnrJZH) z{H@n3LhU+q%-&OLil%7G?<-NVx-81U7=PehPtICu7vvR$$sf#HMuQhO=h{OPHP4v< zL0?nLCk}ZprKWbr=f+rH=HANpqeHinnh(j&&-|RMx71=&&%+6|CdAA&WV*PIl(F%- z>@_F*$59K|OSHiL_o?rO=I^mbk0&Lw=W|ng^mAEuJ*3i+S{3$u5_vu27T#!OrqFSx zL&5j&Z0Ha7@9!Ddx08{(qm7%kRvltCno7~SEj>!*@68|@<9?Fc;8z-RQ_t|xkxyFO zETVe~oW0YJ8BB$9m=-3DEzD<@PgePdTIv1-nn`lZel{-un;mG)!pUsMaR-QY~v9vlYym zx#P-||L)1Q#_~rurQ1pd&#F7KjhQ}!X~jty_UfuX zaON#PgblQ{Ih?#i$2wDQ2z+_6&batj{8o2F{{j@II*iB@?}#@gKm-pchz`U@vHBdd zHEdKz@ntIRR{sizH|}RUogA$EAln2{{a{}V+OEGcW*1aNak=T|wL?Tjv2^=sw$0~X z{g46uHVfE`a&JsO;)He=r208}JH=lSTRrv(%}dlIKxW1HyTrlPoFLF!n|>xVt&Pni z*AhxSAsV0Y`RnAabI}YGHPYa4C1Qp9f|?!4L_cZh7`ZPR6~u)URRufV^Sg;eL>%3G z>Dh;wA2lV)fl$+dC4@b5ke;IT?5W)~7Z4w9!eo}4Ih|`_A3;Oe1bPq}^0_ubOd;9{ z5!TR3uZ&4mr0H!g_wZy;jeA;qQ^s=+4ec88t2gkOR$0V}RD2IG{1249yw1exJ6tg~ zJ@^oH05IiJo(*xS0^K7IA^TYYgX<6?a@-aIf2in^Kcm@UWB zF8UgT>Q`|Cx6Zeum!(NT44Rvei&s~@18u1zm!ife|2fX{lvcaz`Hha(l`3f)B?bR` zD1#4d&CTq(rv)FEuR0gKyK=fHcWT(w+{TDM##V(0d(MKl(ARQPK`u(@AQ>|ngtAg* z>wmgFjDWh}Kvd>xxhF9#)ApheJSCFg|HLuWbj4CvKGG`Of%u~vBOFw;05PCkja%Ibnf%>DZGzKau9~%2YBHVvS?0@{~ zQA)FF^L~eZC;&h@^|v%pbRaNcer3K3q7cXk|Mt<7cmk7Mvuh#t^7k)Lc}J5GiYdve z;X^)JbL~IN!ZYqyzy=++Q7vFI(&*t`o9K~fB%{=z2&v`Et7-V|RS~u$p&1SmJ-boC zqo9JYHTxCaCQ^Wm^}pO0C@M>lzP}CrohXn6<3EV@?{I)u7OlB1($bxLJEXgtiI5;( zFjUbP60fcL0^~MIEdfa!{cSx^%cG!lU_O5TFwqdAcmHd|*1W&|Be}fJzej9~dH12_ zfpR2lev!mM6PeLH#F^S)k1uy|%p?Lfck!RPL|XqU1R&URun9s$l3_2=zi{hX6m}hR zeSIq3n9BFbKLR$>eGf~aQ!Dx;=$@o~+c}lr=7oAd{X0|37W&6mD%L>acx~GwaiYV0 z=njw*sa8x1(fvN0UO{%wLYLdJt@nIn6+FQTz&?3J+yX|hmwMz&( z{lA8x8d^tp6NPEFQNjqF#(V;2DSYR-RZ!YDH9g~>yukK&I%$KF<)R(5pMhAMbkr+?zQB2*2;B-x4&TWUN7LZZHQ`P z>d%_>Ul{aTwOur1Wml7l3+K~#Fy*8%FVw=?pSd_EHZOoHl9Wy4ey1|#ljGeoS^d1< zjD-cui)S(A82AL4S(;Y}PW>ms08*}IQGyg6G?5S1yLJ=i351naUuKbrx@DEvbb1PpJoFm#%y3%`FxrxRyrde2;W! zy}R&P_9e@@g!lQiWV_}4k~vosJ(T%%65h@>bgj((@JdY=@fy#MbzF@clg}J`t5EbU z>bUrl|A3FKw+L;B#}L+~<9oT}-fydpAU4am$;L>?Vj1Fdc-Go;1pK0U&W|MNFMRst zYMUzQH6uIRCDLE<&@U{M5Mvc;XX7|h9`t{HX80_=&$I03Gn2(3fj`4I=A0~(jJK*+nT<=SoCy?2qE{p}t z7~iw%3q`wSU(YPTL9cSFWbCm#PX+m875;;HuA8gxq|H!nW6^iD{*lB$wn5N5azGW#d8 z!=WAvesw!cJAGtVBBrwHDW95Ib_2!ctFAb zF;_%03!xA~>x|Rr(s!4Z#iIO2_FPGY%EI0YdEF*Ayjm4}c0u+obt2+~ z3>!g_IA)hZ-zHwT-7~@`z@m4gL_~M*K#*F`=S%CuIS**E>~GHIzg9iyH8x`5I(aJY zgJ-$>m`~XFL9f1%{7Ie6mBrfblkHazy^nA?XL)`|w=L&uvYUwhNaRk@0{ciY*AUSn z3rFi~zuc$)*ge^}c&p=y7f!`HVdaI!v4Vhj53@IoA8&_gH5e=n7PL$+1bA?cHD>30 zsyA?L2_q!e;~4WSr=Ne9#5lL(cnl^(Xu2xgA86;bJq?(BJ1-r}I4>e=*dmc6DTFdy zc;#+d+xKc=E?^olSH#|SEjbg^Uubo@c&IU97IX8iCX4EP@evtLvG%?{!JcXEwzkqS zJBeE?X-`^h^p5w#c=dEH+TZ6Y%31CAug{2!U|UfGR=Fo~$14a8s(uzbHt{fuUiEPx z#8#2&f>_N|mGccrc1|`n>)sR|%Xw^QFH9*-`1_u?KWd$(CV#XWKE+YUjQ{!}F4LXh z8K?C_L1nOFUhUybcym-gpDqp!lC~;u;v;Y~;rJxC*%jw@M!CVebSdbJwuNl>BdcqY z(m91`IksjVb6pI&6g|sR{hjZ+CK#p=m}{Mqo5V_i!KpfS|pD{8Y_P?3ypEvQqu~?F6&pBs<)QII_ zlimtu*&{-B@A{j@GST?-*U=JUdPP>Fk%7#&Yl9=@GOT(h8gbr<$7B}kuRp2S-xzWJ zWPIw_XJlA~8XpGS!IzOU%8ZM}B#W!I*Cq=tbmR?4A9>6yZJ(+bruEB<8>13VUAnsc zj_tCvBz0v*fM$BwY8*0%ozY(tA1mKhRMB59~$KBOV9!mkhSO5v9ExIA2`sc{U}z$y`wHv zOgd~XUN)h7F=g;T@<;T`x>I7yy6E}*RV*D{Eo*bXkqaBC;7~ybh(IZ;7 zWE>Z1Z#JCXqSY@mZR_c}rtkW=w?0m^>T$4j+jWt#Hy&5UJHFt<_RiS7l@`Ra{3FY% zfn*s>L%AOsBCbym+m8joFnd|&TN$V7r=5S8T#Iw-9Ix~*>Z$zdSp!N9<}s2omovJB zDrLX+C$zcr-`A?1!+T3{sg_4!mM1bJrWD$|JoFYL8Lp|#rt!2#eVMJ0l@b+dQuX2L zZ%jSvoibX>UW-%C=+j(SDayo8s4Skuw1)*anjQL~*pgyfb5%%k`olul=`u9i(jAtD zf<6Jc1TUix^`eV+#TmMI0*3swvyFO8Mut|zlex+cum@C3t0fpteEP+q?-V~?nPaVD zP=(2NUt4H$Ip?)T6D2Gn=-Mr3QW4+6>&+o_>wSF|PX(yjYQNPfwcZ_IE_cVkA%}j;Nx7ymKL+gx&x=fy~8J#Dir1bPI zN;3722DC3Y&!6KhIaHit+^wFuSaUC~tCvgA&D`?&sDSg{{Cgn+R?@>M$?MzadzSn2 z6{h-|MW+}OPq!t=w5{%S|1tzBB!!j+VisE4!<%?JvIlG2uYJDb>~E^e*EQn{D!L|_ z`J4A+GDg}KdPjd$)@KpwHiQh_tvouPGH^)8&+)bE9*Fn;RUOyuyxwnWXmD`cyHu`= zVLX(1xM6SMgPgBN53N7Ekijn6Rq5PQiO3!>oiB*$>t3HWj0j{72%9WtkMmbETs0aF zcNiVi$mp(jl^oDKswNN=ztDUq&QzW?X}j|#sew}!9&2gkESMSP+Q?Hx?j_2d;K06^ z_N`RVoQS^>5GI{n-{(>g8u!3ADDrujc}+=U7TUtw&0wU^)v8RGv!N~cBFFnyXK(qj6#JT6UHdB6BG)rU7yK6^aby|eJB0#XeeYyyW@Esi zAZ{blWf3arI)?U)3L7I|aW#w77Rm@?J~O*=rP%mph$W)_z<{RcTZT*e6ky zhnDbC@m@Y(pS-xAgVDNHM62)KWC^47bY_k8E1R$zP0-X6R+=J_dTrZ6q>dZWF{-9V zzk<>NQ-|vzoa(CE=Ff@upNF3M7bJ)LHj%>0aF`kbL!WrQUSG{4lseox#>I!&$rCts z&q3`U1sdak0vX2_5S>~GIK$aL_)MqMGpJcAQREVrkofI`2LDJ`6@v!@tccT2)C^Z` zhkJ#SuIn3jA9#r3qIy&5mA;d>!uTr&8~YJ6m3@yW{fOE|C|135T0iEt?(MgSC6tjs zQa24VdMZLsS3_dW0Ql#Q^vXW}l;><4` zl+nALyGD_?%HBl@kr5>=w-Pc=MsI4G#$+_+v(LdAF>)oIK$-5rZ`K89p7#n+ranlM zP(vp;SO?u`gXN`(HL$rJYv`f!SMrpux{B#z$+Ui0>(tGYvqCS~hne)_%yq*qgm6Q+ zgY(o5mSK8F-zPwQ1VBhzobM`WkvaHzJo5-4m?~706afjO^YeFKK5?Aq9XKTRmZRt_ zQmAeZdNd%8C8VHlEyJ|-Q<$mI;;ir~vExkDsYHGq@8K%_NBl>jj2U(hlVZV_S><@N zr=!imvrwXez-ct^n<(277q<`dSpC!v$dDlM&)*Jt^FH-VG(*+kCO<*O%}roNDbJh! z{S@S<-=Q*KfB;vq6_W6Ozhl_g>OL~ne@gNn!@$l_B;Hsy-H(MbN1F(yc^^nzsi25T z>VFd}e?J^e2}%^VqJS+n#RAUABkCJDI_cF$gV zT1c`n9~`CcH;OsPX_$UcGqvbva zc7z`8-cJHN$eTf>K-zAp_Yl`*qj8`JwKE^EzL1jMjmQD6JP-uC+aFl>!yoqt3UdG4 z6ngyPb|SB5Lz5lq6p4MWA_w6QmI0p8MZ&J4yyLrJH};WX<-i8_MfKirXbxeckzf&o zqlt)1AE3DL7v_j*f@N**l?vC*?C1CW-0FbcMF{VP#8ex`3DyKTMzCPXN!OET4XGXk zwuZ*sKS5OQzX{N>enL5Y;F5ssNZUA2aK#7IytMRmo$@0kIk3_%(sqVJBLHZFYu@h8 zN!{saaxzVm@CW;NrVdan)vd2bBha-;DC#5%>li(*C)!WZk9zD}8t16guO4|IH%LkM z^`+Zi$NMJ{T#2{u^x%d00XS)KcfbAnm$3gdT>+5f(Y;kdLgGrmM^h3j-9&c3m4~dl z4E(+SyWLVW?LA9kgsA8URA_VWQ%Jc2RI&dN4=-Vl;}%4pq+Cc2J@a zN)zelHJ!rq!Hk6I(W`$Os9ChGq@k39&m%d#$(gco88?qa#4 zL;^1Vt8HOVsfd)4=oc9_7-6wr_uVt1Z3>%+?-u#x@*^Zg7Kb_rjFyj=m>GtE!2hg= zyoA#NP~S+br*UAKSPSs7Z#swmqdZNOjs=1m_Ok#wz=6r$gQWlAsuZ>#3QUjabis;eLbRU7sI)xIU!*POZ%n@GaE z$U~{$7+Zy^k%GGq1g~xjR-qWjKw^;F5WNV1PpxH8!tOtY{QHkn%!;qUIQ@D5{iDf$ zLY@*ujb{4UfBn|oU%n@3?amO|UXzMM&_X!R%^AZ(^|L*wT6J3em z^)WI)%kVcbA2MJ*+tuGfDkc90a){TA`iKgBSHsx_-+5GYGU{Mq15YmzS-Z(QFJm>+ zQKTf61SAFufUaC8(Y05gOz56b9(>nm3E|J(PvM(jDnxMHz#9`FXCP5mM+s1j@`^b8 z3)Kmyd{7<>-^4YB2!syoZ=w5SMQ4I3jCc`)a5ST-=m!z<|(1%~xz?;`O zu+>!lLkYChdgHsXXR)W41Zm-A1-KlFnmU>HzMFIyB6lQ^7TRtL{Q_qHikHNx@YDpe z-+~g`GyT+`!=CB~HrOI8LaDVWNwJH4VD%2`4+?}=Hu)BNhTZo>Qx#rAwA>66VYurC zG4Mu6dn8ak$CU-aN8$`OCGr|gdVydP-9JlS6YaK@#(?~*>ET%@EE2%Z9iz7-=!i#P zZgXBUAu&nvBjh#5<=>F93vwm$%NM@>+ZP!B2F{0c1OyXK zOe8VC2`73Z_+P>I{~>*qsJN0AbUQY52L1KUePHS`8BviCD}fmcip_+7AvY}m!(4iJ z{t3$sz>r(V6<$N?NC1YnIbn~g+=jRW!0=My6iH!CrjRK^(>a?ABL;xsYqMSwV!)yf z()@7`{(ZMmzNk=>sS20zFB$gHK~2HBghH3`+a|RfT{0&qn}d$KlvZQdnK+V?oE^jr$xpKwRd$QywfD2Wz1;L}AZDojCvWJeatw1X3g16Q`fWr6e2#(wY!XOWd1IX*=enf)g`3eBwdu|PhNu&T& zsrrJ{ARq1ns(fi+O+psMbc*6wX~bC8@d z@*03?bK^x4r~?v}Vc4T2D3EG^I@NhoBm^c0P-puEN{Bi(v7#7&IxHpWTFgfLdh& z!osIqND^KQlxDzD3EzU?n~y1MVTfC@huqU!kvyPLe7Q-83rWixcwhKb4hfh*1`;@p zE$H#h!0sM+iy*_AZp(3Xw>nC+9dx5oI}sK$VYtp>QOHc#L|?g2P@(=u%HR$9HY%0C z?EiRz-eh_~8pU#e`517QL~GG^0P3&>qM^lB8*Svj+ZOheio)SOcmzNpuOWAv&M=Xf z-M4|rB&d(WPquA{NrVMJbAw-dHmU}CMGSDIi)6*8HVOcG#SP4nR=Hn?pigeps~Cs^ zrO8f^a6Sm19FYzhB_aLo04%m6YvErwKq&6`zuPUv?lZS7NGw+mnH4ow4moWUHqjOA zc3}8>Z(oF;M$v?i<7`FrTWbr`Hm9Dl6KW<99RI6(d&p}}v7LJX@7j`KZLp_&JKdWg zQ+d;7_kb*v%oYsnW6`lWBKd4=4eJR|EMwf11jnOKUNdkSlYwd>u`atKESkea;4>!M z5TLbaw-$=#WAJ9(L^!`it%yX#CP4+}BvrHM|7Kf?wMnPZB!XRXH$V`KB=|{hv<9Lp zMrz1Wl~7VahztS7(gKq7iJskHC|^0iVGMixdEjT$4B*AmLXtd5w&jv>$CT*w#EnAE z0<@9)g%+an?~Qj!05yvc+a^6nvD~Y=*kFK zXEL`SdhjtkPBc5bvbWk6sI%CD>;vCf+-%rK)Y*-GumhdqkEZMFVH|^hH!y!U>^jNY_2~VV|Y^WbeI{3O(bjnUXs%#Wv_(E(c9e_Rf9o z?28r|PQSHUdDMn?)xPhgbz2rheiI)MYfoM4xcbwnJT79xoqZ7FMIKIHeoxn2dw`59 zdX=^K-%q)mz=r=(@(iEYav0TdhuW%L!6%J<=1dyo%MyD90EEcN$}s=-tU7*?rxZN# zS+)#}G0|40q;)aFev%lOx~}oO<4J)YG_W{>cyFoQ%q2qwUA* zvjlt@kQ4XF6O})S3;lsNYa!40Zm9SJ`uP#5KXNT5=JPqExEg;SUfe-Nky79gQj$3vam8_X8N%}ny#bcQn#p2c~qlJ7rQXqco!+kGkm?hm? zsnSknJ}V|n2ov&@@z+;)oW#>YuNo+8RoP*o-!w2FaFom*1J=KJBosUL`m3%&f9H4O zyV@0v2&W4esv0eSNw2dCVF>v?>KJ)vOx5~M1jLz{I1A{6oT?vAknfH!QS$RKhp~-c z#2;wmcLJO{Hh}MVPLUSpudqAQ(j%%BXJjD#b`b^+C9`{nb;y4rL{x09o^R8Lo#{eh z)r}{F?`%m$=1$?AczP=CgkXC;M^y#4vq3w70AMaO5s3f&txK#6Hf`bSuff6zzgOi) z-UEYo*@Ip5bpH6uU^oA`y|dkc0mw%guv{Rx_3U~u-0)j7GjuO#_JrX@e}vVl*i_aA z*mFvcHye;s>M4D|^Yq~=da1wc2o7OvfT#s>Qu0FCT$lR3r2+kRNCUX_{yJiq+U?eEW@6@~tt;&oY zm-a1PY2*7ANrqKmOr1AK3%VADZ_2FYoUYH!tat6A7umZ6NhNnY0>nbpLT9?j@0l!& zuzzm+#PiRdHL#|XYuQsY&>|;F5G~H?874#G)4VP9xxZHXI{0L1=YMl99UlozEls9F z4hM^)NICCYxyUT{_=mG~t6**YJ@R+i&80xA?8-)0c;d2>dX;-tsrs!#F7{(fe|q?x z-r0YFXt+6_fu^cXMNTU)*S z%KQELGy8YS_v?Rh=0i_S7ed-dtQ!YjKIpZ!*w37*kNZ7!Z=FwufEJa zB3JOVGkixyV-(#feEm{n!{q{;AT^Xei0iUWe5wYmDge#X{c?i#U7KKgYo?K>nTw7pVutxEj=4=S_`n^cGcD$u6S0D{i(mq zG-9OR>%2`pn0gHZ@z$_KjEd{)?cNXKbJmt@$8(=UOq!PaI5WFfyNPYO7=P1x=8#b@ zYa&C+uCzTZ6>Snisb(PQDfK8f&iT9D2(CrXKRjT3?c~n3-7mNjxA#-zczu~OhzNfl zzeCG1;y3OiCsGlE?dwbZ6XopLuC0RWgPo39vgE6usA5 z3?ImPEsyqN+9MB*)aXO^r6eG5G~00s0bhEI>Rp%Qi=|dXlUZF^q?_@C@|F^c;PJ3_ zEyDo*#ENH+Uk(45ns2yOFw_&idaJ`tnFG>osUXx+=L7cpwHB<|%VQZ2(ruU_33Sw( z+;_-{<-r@LrV&nB5$~-p8tyd=FtZjUbagj*pL10Ujpd;$8Dl+lFe_@ByIg$BJ?<~o&Ta*G8Ow&0>TV;{GeJv ZJoxpdP-h3Kf(-n-a9;J?m$OEH{68Me>RJE* literal 0 HcmV?d00001 diff --git a/docs/site/static/img/developer/getting-started/token-transfer/wallet-transaction.png b/docs/site/static/img/developer/getting-started/token-transfer/wallet-transaction.png new file mode 100644 index 0000000000000000000000000000000000000000..e999186aad3c61b44b271ad08dcc9caa6579256c GIT binary patch literal 53569 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 ao&R0y)4Rcy76}OOPf}D)q(VsF@BaWL`GFDu literal 0 HcmV?d00001 From 26ca13a16f9d03a48e11cf6adfff58a3f1adb946 Mon Sep 17 00:00:00 2001 From: Tomasz Pastusiak Date: Wed, 29 Jan 2025 15:54:48 +0100 Subject: [PATCH 23/51] [indexer]: Cleanup large-object representation of genesis transaction (#5016) --- Cargo.lock | 2 - .../src/types/transaction_block/mod.rs | 14 +- crates/iota-indexer/Cargo.toml | 6 - .../examples/index_genesis_transaction.rs | 133 ---------------- crates/iota-indexer/src/indexer_reader.rs | 32 +--- .../iota-indexer/src/models/large_objects.rs | 124 --------------- crates/iota-indexer/src/models/mod.rs | 1 - .../iota-indexer/src/models/transactions.rs | 144 +----------------- .../src/store/pg_indexer_store.rs | 10 +- 9 files changed, 15 insertions(+), 451 deletions(-) delete mode 100644 crates/iota-indexer/examples/index_genesis_transaction.rs delete mode 100644 crates/iota-indexer/src/models/large_objects.rs diff --git a/Cargo.lock b/Cargo.lock index e403b74057a..0d8f1cda148 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6945,7 +6945,6 @@ dependencies = [ "futures", "iota-config", "iota-data-ingestion-core", - "iota-genesis-builder", "iota-json", "iota-json-rpc", "iota-json-rpc-api", @@ -6968,7 +6967,6 @@ dependencies = [ "move-bytecode-utils", "move-core-types", "prometheus", - "rand 0.8.5", "rayon", "regex", "secrecy", diff --git a/crates/iota-graphql-rpc/src/types/transaction_block/mod.rs b/crates/iota-graphql-rpc/src/types/transaction_block/mod.rs index 40e524913fa..6980762af7b 100644 --- a/crates/iota-graphql-rpc/src/types/transaction_block/mod.rs +++ b/crates/iota-graphql-rpc/src/types/transaction_block/mod.rs @@ -418,12 +418,7 @@ impl TransactionBlock { ); } - let pool = db.inner.get_pool(); - for mut stored in transactions { - if stored.is_genesis() { - stored = stored.set_genesis_large_object_as_inner_data(&pool)?; - } - + for stored in transactions { let cursor = stored.cursor(checkpoint_viewed_at).encode_cursor(); let inner = TransactionBlockInner::try_from(stored)?; let transaction = TransactionBlock { @@ -466,12 +461,7 @@ impl Loader for Db { let transaction_digest_to_stored: BTreeMap<_, _> = transactions .into_iter() - .map(|mut tx| { - if tx.is_genesis() { - tx = tx.set_genesis_large_object_as_inner_data(&self.inner.get_pool())?; - } - Ok((tx.transaction_digest.clone(), tx)) - }) + .map(|tx| Ok((tx.transaction_digest.clone(), tx))) .collect::, Error>>()?; let mut results = HashMap::new(); diff --git a/crates/iota-indexer/Cargo.toml b/crates/iota-indexer/Cargo.toml index cedabf38ca2..72bf377d57e 100644 --- a/crates/iota-indexer/Cargo.toml +++ b/crates/iota-indexer/Cargo.toml @@ -62,12 +62,10 @@ shared_test_runtime = [] [dev-dependencies] # external dependencies -rand.workspace = true serde_json.workspace = true # internal dependencies iota-config.workspace = true -iota-genesis-builder.workspace = true iota-keys.workspace = true iota-move-build.workspace = true iota-swarm-config.workspace = true @@ -81,7 +79,3 @@ path = "src/main.rs" [package.metadata.cargo-udeps.ignore] development = ["simulacrum"] - -[[example]] -name = "index_genesis_transaction" -path = "examples/index_genesis_transaction.rs" diff --git a/crates/iota-indexer/examples/index_genesis_transaction.rs b/crates/iota-indexer/examples/index_genesis_transaction.rs deleted file mode 100644 index 02491a37c83..00000000000 --- a/crates/iota-indexer/examples/index_genesis_transaction.rs +++ /dev/null @@ -1,133 +0,0 @@ -// Copyright (c) 2024 IOTA Stiftung -// SPDX-License-Identifier: Apache-2.0 - -use clap::Parser; -use diesel::{ExpressionMethods, QueryDsl, RunQueryDsl}; -use iota_genesis_builder::{Builder as GenesisBuilder, SnapshotSource, SnapshotUrl}; -use iota_indexer::{ - db::{self, reset_database}, - errors::IndexerError, - indexer_reader::IndexerReader, - models::transactions::StoredTransaction, - schema::transactions, - store::indexer_store::IndexerStore, - test_utils::create_pg_store, - types::{IndexedTransaction, TransactionKind}, -}; -use iota_swarm_config::genesis_config::ValidatorGenesisConfigBuilder; -use rand::rngs::OsRng; - -#[derive(Parser, Debug)] -#[command(about = "Example that indexes the genesis transaction into the database")] -struct Args { - /// Remotely stored migration snapshots. - #[arg( - long, - name = "iota|", - help = "Remote migration snapshots.", - default_values_t = vec![SnapshotUrl::Iota], - num_args(0..) - )] - migration_snapshots: Vec, -} - -const DEFAULT_DB_URL: &str = "postgres://postgres:postgrespw@localhost:5432/iota_indexer"; - -// Build genesis with `IOTA` stardust snapshot -fn genesis_builder(migration_sources: Vec) -> GenesisBuilder { - // Create the builder - let mut builder = GenesisBuilder::new(); - - // Create validators - let mut validators = Vec::new(); - let mut key_pairs = Vec::new(); - let mut rng = OsRng; - for i in 0..2 { - let validator_config = ValidatorGenesisConfigBuilder::default().build(&mut rng); - let validator_info = validator_config.to_validator_info(format!("validator-{i}")); - let validator_addr = validator_info.info.iota_address(); - validators.push(validator_addr); - key_pairs.push(validator_config.authority_key_pair); - builder = builder.add_validator(validator_info.info, validator_info.proof_of_possession); - } - - for migration_source in migration_sources { - builder = builder.add_migration_source(migration_source); - } - - for key in &key_pairs { - builder = builder.add_validator_signature(key); - } - builder -} - -#[tokio::main] -pub async fn main() -> Result<(), IndexerError> { - let _guard = telemetry_subscribers::TelemetryConfig::new() - .with_env() - .init(); - - let args = Args::parse(); - let migration_sources = args - .migration_snapshots - .into_iter() - .map(SnapshotSource::S3) - .collect(); - - // Create genesis transaction - let (tx_digest, sender_signed_data, effects, summary) = { - tokio::task::spawn_blocking(|| { - let mut builder = genesis_builder(migration_sources); - let genesis = builder.get_or_build_unsigned_genesis(); - tracing::info!("genesis built"); - let summary = genesis.checkpoint.clone(); - let effects = genesis.effects.clone(); - let tx_digest = *genesis.transaction.digest(); - let data = genesis.transaction.data().clone(); - (tx_digest, data, effects, summary) - }) - .await - .unwrap() - }; - let db_txn = IndexedTransaction { - tx_sequence_number: 0, - tx_digest, - sender_signed_data, - effects, - checkpoint_sequence_number: *summary.sequence_number(), - timestamp_ms: summary.timestamp_ms, - object_changes: Default::default(), - balance_change: Default::default(), - events: Default::default(), - transaction_kind: TransactionKind::SystemTransaction, - successful_tx_num: 1, - }; - - let digest_to_bytes = db_txn.tx_digest.into_inner().to_vec(); - let expected_transactions = bcs::to_bytes(&db_txn.sender_signed_data).unwrap(); - let expected_effects = bcs::to_bytes(&db_txn.effects).unwrap(); - - let pg_store = create_pg_store(DEFAULT_DB_URL.to_string().into(), true); - reset_database(&mut pg_store.blocking_cp().get().unwrap()).unwrap(); - pg_store.persist_transactions(vec![db_txn]).await.unwrap(); - - let mut conn = db::get_pool_connection(&pg_store.blocking_cp())?; - let stored = transactions::table - .filter(transactions::transaction_digest.eq(digest_to_bytes)) - .first::(&mut conn) - .unwrap(); - - let stored = stored - .set_genesis_large_object_as_inner_data(&pg_store.blocking_cp()) - .unwrap(); - - let reader = IndexerReader::new(DEFAULT_DB_URL.to_owned())?; - // We just want to verify that the call succeeds. - let _coin_metadata = reader - .get_coin_metadata_in_blocking_task("0x2::iota::IOTA".parse().unwrap()) - .await?; - - assert!(expected_transactions == stored.raw_transaction); - assert!(expected_effects == stored.raw_effects); - Ok(()) -} diff --git a/crates/iota-indexer/src/indexer_reader.rs b/crates/iota-indexer/src/indexer_reader.rs index d757d32d085..43a789ec2e3 100644 --- a/crates/iota-indexer/src/indexer_reader.rs +++ b/crates/iota-indexer/src/indexer_reader.rs @@ -450,7 +450,7 @@ impl IndexerReader { &self, digest: TransactionDigest, ) -> Result { - let mut stored_txn: StoredTransaction = run_query!(&self.pool, |conn| { + let stored_txn: StoredTransaction = run_query!(&self.pool, |conn| { transactions::table .filter( transactions::tx_sequence_number @@ -465,7 +465,6 @@ impl IndexerReader { .first::(conn) })?; - stored_txn = stored_txn.set_genesis_large_object_as_inner_data(&self.pool)?; stored_txn.try_into_iota_transaction_effects() } @@ -473,13 +472,12 @@ impl IndexerReader { &self, sequence_number: i64, ) -> Result { - let mut stored_txn: StoredTransaction = run_query!(&self.pool, |conn| { + let stored_txn: StoredTransaction = run_query!(&self.pool, |conn| { transactions::table .filter(transactions::tx_sequence_number.eq(sequence_number)) .first::(conn) })?; - stored_txn = stored_txn.set_genesis_large_object_as_inner_data(&self.pool)?; stored_txn.try_into_iota_transaction_effects() } @@ -491,7 +489,7 @@ impl IndexerReader { .iter() .map(|digest| digest.inner().to_vec()) .collect::>(); - let transactions = run_query!(&self.pool, |conn| { + run_query!(&self.pool, |conn| { transactions::table .inner_join( tx_digests::table @@ -502,11 +500,7 @@ impl IndexerReader { .filter(tx_digests::tx_digest.eq_any(digests)) .select(StoredTransaction::as_select()) .load::(conn) - })?; - transactions - .into_iter() - .map(|store| store.set_genesis_large_object_as_inner_data(&self.pool)) - .collect() + }) } async fn multi_get_transactions_in_blocking_task( @@ -565,11 +559,7 @@ impl IndexerReader { } None => (), } - let transactions = run_query!(&self.pool, |conn| query.load::(conn))?; - transactions - .into_iter() - .map(|stored| stored.set_genesis_large_object_as_inner_data(&self.pool)) - .collect() + run_query!(&self.pool, |conn| query.load::(conn)) } pub async fn get_owned_objects_in_blocking_task( @@ -748,15 +738,9 @@ impl IndexerReader { query = query.order(transactions::dsl::tx_sequence_number.asc()); } let pool = self.get_pool(); - let mut stored_txes = - run_query_async!(&pool, move |conn| query - .limit(limit as i64) - .load::(conn))?; - - stored_txes = stored_txes - .into_iter() - .map(|store| store.set_genesis_large_object_as_inner_data(&self.pool)) - .collect::, _>>()?; + let stored_txes = run_query_async!(&pool, move |conn| query + .limit(limit as i64) + .load::(conn))?; self.stored_transaction_to_transaction_block(stored_txes, options) .await diff --git a/crates/iota-indexer/src/models/large_objects.rs b/crates/iota-indexer/src/models/large_objects.rs deleted file mode 100644 index 0b8effed9fd..00000000000 --- a/crates/iota-indexer/src/models/large_objects.rs +++ /dev/null @@ -1,124 +0,0 @@ -// Copyright (c) 2024 IOTA Stiftung -// SPDX-License-Identifier: Apache-2.0 - -//! Expose server-side large-object functions. -//! -//! Based on -//! -//! See also - -use std::time::Duration; - -use diesel::{ - RunQueryDsl, define_sql_function, - pg::sql_types::Oid, - select, - sql_types::{BigInt, Binary, Integer, Nullable}, -}; -use downcast::Any; - -use crate::{ - db::ConnectionPool, - errors::{Context, IndexerError}, - transactional_blocking_with_retry, -}; - -const DB_COMMIT_SLEEP_DURATION: Duration = Duration::from_secs(3600); - -define_sql_function! { - /// Returns an `Oid` of an empty new large object. - fn lo_create(loid: Oid) -> Oid -} - -define_sql_function! { - /// Writes data starting at the given offset within - /// the large object. - /// - /// The large object is enlarged if necessary. - fn lo_put(loid: Oid, offset: BigInt, data: Binary) -} - -define_sql_function! { - /// Gets the large object with OID `loid`. - /// Returns an error if the object doesn't exist. - fn lo_get(loid: Oid, offset: Nullable, length: Nullable ) -> Binary -} - -/// Create an empty large object -/// -/// Returns the object identifier (`oid`) represented as `u32`. -pub fn create_large_object(pool: &ConnectionPool) -> Result { - transactional_blocking_with_retry!( - pool, - |conn| select(lo_create(0)).get_result(conn), - DB_COMMIT_SLEEP_DURATION - ) - .map_err(IndexerError::from) - .context("failed to store large object") -} - -/// Store raw data as a large object in chunks. -/// -/// Returns the object identifier (`oid`) represented as `u32`. -pub fn put_large_object_in_chunks( - data: Vec, - chunk_size: usize, - pool: &ConnectionPool, -) -> Result { - let oid = create_large_object(pool)?; - - if let Err(err) = i64::try_from(data.len()) { - return Err(IndexerError::Generic(err.to_string())); - } - - for (chunk_num, chunk) in data.chunks(chunk_size).enumerate() { - let offset = (chunk_num * chunk_size) as i64; - tracing::trace!("Storing large-object chunk at offset {}", offset); - // TODO: (to treat in a different issue): - // remove dangling chunks (either by using a transaction or by handling - // manually) - // - // additionally we could apply a backoff retry strategy - transactional_blocking_with_retry!( - pool, - |conn| select(lo_put(oid, offset, chunk)).execute(conn), - DB_COMMIT_SLEEP_DURATION - ) - .map_err(IndexerError::from) - .context("failed to insert large object chunk")?; - } - Ok(oid) -} - -/// Get a large object from the database in chunks. -pub fn get_large_object_in_chunks( - oid: u32, - chunk_size: usize, - pool: &ConnectionPool, -) -> Result, IndexerError> { - let mut data: Vec = vec![]; - let mut chunk_num = 0; - loop { - let length = i32::try_from(chunk_size).map_err(|e| IndexerError::Generic(e.to_string()))?; - let offset = (chunk_num * chunk_size) as i64; - - tracing::trace!("Fetching large-object chunk at offset {}", offset); - - let chunk = transactional_blocking_with_retry!( - pool, - |conn| { select(lo_get(oid, Some(offset), Some(length))).get_result::>(conn) }, - DB_COMMIT_SLEEP_DURATION - ) - .map_err(IndexerError::from) - .context("failed to query large object chunk")?; - - let chunk_len = chunk.len(); - data.extend(chunk); - - if chunk_len < chunk_size { - break; - } - chunk_num += 1; - } - Ok(data) -} diff --git a/crates/iota-indexer/src/models/mod.rs b/crates/iota-indexer/src/models/mod.rs index 065061e2c25..3f922be5780 100644 --- a/crates/iota-indexer/src/models/mod.rs +++ b/crates/iota-indexer/src/models/mod.rs @@ -8,7 +8,6 @@ pub mod display; pub mod epoch; pub mod event_indices; pub mod events; -pub(crate) mod large_objects; pub mod move_call_metrics; pub mod network_metrics; pub mod obj_indices; diff --git a/crates/iota-indexer/src/models/transactions.rs b/crates/iota-indexer/src/models/transactions.rs index c6542e92a35..c066bb0c275 100644 --- a/crates/iota-indexer/src/models/transactions.rs +++ b/crates/iota-indexer/src/models/transactions.rs @@ -23,9 +23,7 @@ use move_core_types::{ }; use crate::{ - db::ConnectionPool, - errors::{Context, IndexerError}, - models::large_objects::{get_large_object_in_chunks, put_large_object_in_chunks}, + errors::IndexerError, schema::transactions, types::{IndexedObjectChange, IndexedTransaction, IndexerResult}, }; @@ -136,7 +134,6 @@ impl StoredTransaction { self.events.get(idx).cloned().flatten() } - const LARGE_OBJECT_CHUNK_SIZE: usize = 100 * 1024 * 1024; pub async fn try_into_iota_transaction_block_response( self, options: IotaTransactionBlockResponseOptions, @@ -293,145 +290,6 @@ impl StoredTransaction { } } -impl StoredTransaction { - /// Store the raw transaction data as a large object in postgres - /// and replace `self.raw_transaction` with a pointer to the large object. - fn store_raw_transaction_as_large_object( - mut self, - pool: &ConnectionPool, - ) -> Result { - tracing::debug!("Storing raw transaction as large object data"); - let raw_tx = std::mem::take(&mut self.raw_transaction); - let oid = put_large_object_in_chunks(raw_tx, Self::LARGE_OBJECT_CHUNK_SIZE, pool)?; - self.raw_transaction = oid.to_le_bytes().to_vec(); - Ok(self) - } - - /// Store object changes as a large object in postgres - /// and replace `self.object_changes` with a pointer to the large object. - fn store_object_changes_as_large_object( - mut self, - pool: &ConnectionPool, - ) -> Result { - tracing::debug!("Storing object changes as large object data"); - let object_changes = std::mem::take(&mut self.object_changes); - let data = bcs::to_bytes(&object_changes) - .map_err(IndexerError::from) - .context("failed to encode object changes as large object")?; - let oid = put_large_object_in_chunks(data, Self::LARGE_OBJECT_CHUNK_SIZE, pool)?; - self.object_changes.push(Some(oid.to_le_bytes().to_vec())); - - Ok(self) - } - - /// Store the raw effects data as a large object in postgres - /// and replace `self.raw_effects` with a pointer to the large object. - fn store_raw_effects_as_large_object( - mut self, - pool: &ConnectionPool, - ) -> Result { - tracing::debug!("Storing raw effects as large object data"); - let raw_tx = std::mem::take(&mut self.raw_effects); - let oid = put_large_object_in_chunks(raw_tx, Self::LARGE_OBJECT_CHUNK_SIZE, pool)?; - self.raw_effects = oid.to_le_bytes().to_vec(); - Ok(self) - } - - /// This method checks if this is the genesis transaction, - /// and if true it stores the raw data as a large object - /// in postgres, replacing `self.raw_transaction`,`self.raw_effects`, - /// and `self.object_changes` with the respective pointers. - pub fn store_inner_genesis_data_as_large_object( - self, - pool: &ConnectionPool, - ) -> Result { - if !self.is_genesis() { - return Ok(self); - } - self.store_raw_transaction_as_large_object(pool)? - .store_raw_effects_as_large_object(pool)? - .store_object_changes_as_large_object(pool) - } - - /// This method replaces `self.raw_transaction` large object id with the - /// actual large object data - fn set_large_object_as_raw_transaction( - mut self, - pool: &ConnectionPool, - ) -> Result { - tracing::debug!("Setting large object data as raw transaction"); - let raw_oid = std::mem::take(&mut self.raw_transaction); - let raw_oid: [u8; 4] = raw_oid - .try_into() - .map_err(|_| IndexerError::Generic("invalid large object identifier".to_owned()))?; - let oid = u32::from_le_bytes(raw_oid); - - self.raw_transaction = - get_large_object_in_chunks(oid, Self::LARGE_OBJECT_CHUNK_SIZE, pool)?; - - Ok(self) - } - - /// This method replaces `self.raw_effects` large object id with the actual - /// large object data - fn set_large_object_as_raw_effects( - mut self, - pool: &ConnectionPool, - ) -> Result { - tracing::debug!("Setting large object data as raw effects"); - let raw_oid = std::mem::take(&mut self.raw_effects); - let raw_oid: [u8; 4] = raw_oid - .try_into() - .map_err(|_| IndexerError::Generic("invalid large object identifier".to_owned()))?; - let oid = u32::from_le_bytes(raw_oid); - - self.raw_effects = get_large_object_in_chunks(oid, Self::LARGE_OBJECT_CHUNK_SIZE, pool)?; - - Ok(self) - } - - /// This method replaces `self.object_changes` large object id with the - /// actual large object data - fn set_large_object_as_object_changes( - mut self, - pool: &ConnectionPool, - ) -> Result { - tracing::debug!("Setting large object data as object changes"); - let raw_oid = std::mem::take(&mut self.object_changes) - .pop() - .flatten() - .ok_or_else(|| IndexerError::Generic("invalid large object identifier".to_owned()))?; - - // The first values is the raw oid - let oid = - u32::from_le_bytes(raw_oid.try_into().map_err(|_| { - IndexerError::Generic("invalid large object identifier".to_owned()) - })?); - let stored_data = get_large_object_in_chunks(oid, Self::LARGE_OBJECT_CHUNK_SIZE, pool)?; - self.object_changes = bcs::from_bytes(&stored_data) - .map_err(IndexerError::from) - .context("failed to decode object changes from large object")?; - - Ok(self) - } - - /// The genesis transactions uses a pointer to the large object - /// as inner data. - /// - /// This replaces the pointer with the actual large object data. - pub fn set_genesis_large_object_as_inner_data( - self, - pool: &ConnectionPool, - ) -> Result { - if !self.is_genesis() { - return Ok(self); - } - self.set_large_object_as_raw_transaction(pool)? - .set_large_object_as_raw_effects(pool)? - .set_large_object_as_object_changes(pool) - } -} - pub fn stored_events_to_events( stored_events: StoredTransactionEvents, ) -> Result, IndexerError> { diff --git a/crates/iota-indexer/src/store/pg_indexer_store.rs b/crates/iota-indexer/src/store/pg_indexer_store.rs index 858c27f7ee3..55c5e3d9e50 100644 --- a/crates/iota-indexer/src/store/pg_indexer_store.rs +++ b/crates/iota-indexer/src/store/pg_indexer_store.rs @@ -721,12 +721,10 @@ impl PgIndexerStore { .metrics .checkpoint_db_commit_latency_transactions_chunks_transformation .start_timer(); - let transactions = transactions.iter().map(StoredTransaction::from); - let transactions = { - transactions - .map(|stored| stored.store_inner_genesis_data_as_large_object(&self.blocking_cp)) - .collect::, _>>()? - }; + let transactions = transactions + .iter() + .map(StoredTransaction::from) + .collect::>(); drop(transformation_guard); transactional_blocking_with_retry!( From 9d988eca032800a95edbf798b3f9af520a2d0d1b Mon Sep 17 00:00:00 2001 From: Panteleymonchuk Date: Wed, 29 Jan 2025 17:50:24 +0200 Subject: [PATCH 24/51] feat(wallet-dashboard): update migration portfolio to include shared objects (#4974) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat(core): add StardustIndexerClient * feat(dashboard): add stardust objects from indexer. * feat(core): enhance StardustIndexerClient with basic output mapping and new types * feat(dashboard): add NFT resolved outputs retrieval and mapping functions * refactor(core, dashboard): unify output types and enhance mapping functions * feat(wallet-dashboard, core): enhance Stardust output handling and add pagination support * fix(core, dashboard): pr fixes * feat(sdk): add metadata configuration for stardustIndexer in .env.defaults * refactor(core): rename limit parameter to page_size in StardustIndexerClient * refactor(core): update PageParams interface and adjust pagination parameters in StardustIndexerClient * refactor(core): update return_amount * refactor(core): update StardustIndexerClient methods and rename hook for clarity * refactor(dashboard): remove unused variables in useGetAllStardustSharedObjects hook * fix: add missing 0x to stardust package id * refactor(core, dashboard): update Stardust package ID format, improve metadata handling in hooks, rename variables. --------- Co-authored-by: cpl121 <100352899+cpl121@users.noreply.github.com> Co-authored-by: Begoña Alvarez --- apps/core/src/api/StardustIndexerClient.ts | 72 ++++++++++++++++ apps/core/src/api/index.ts | 1 + .../core/src/constants/migration.constants.ts | 5 +- .../contexts/StardustIndexerClientContext.tsx | 40 +++++++++ apps/core/src/contexts/index.ts | 1 + apps/core/src/utils/migration/index.ts | 1 + .../migration/mapStardustIndexerOutputs.ts | 83 +++++++++++++++++++ apps/core/src/utils/migration/types.ts | 39 ++++++++- .../app/(protected)/migrations/page.tsx | 14 +++- .../hooks/useGetAllStardustSharedObjects.ts | 77 +++++++++++++++++ .../hooks/useGetStardustMigratableObjects.ts | 23 ++++- apps/wallet-dashboard/instrumentation.ts | 3 + apps/wallet-dashboard/lib/utils/timelock.ts | 2 +- .../providers/AppProviders.tsx | 41 ++++----- .../StardustIndexerClientProvider.tsx | 18 ++++ .../wallet-dashboard/sentry.common.config.mjs | 3 + .../src/components/IotaClientProvider.tsx | 2 +- sdk/typescript/src/client/network.ts | 7 +- 18 files changed, 397 insertions(+), 35 deletions(-) create mode 100644 apps/core/src/api/StardustIndexerClient.ts create mode 100644 apps/core/src/contexts/StardustIndexerClientContext.tsx create mode 100644 apps/core/src/utils/migration/mapStardustIndexerOutputs.ts create mode 100644 apps/wallet-dashboard/hooks/useGetAllStardustSharedObjects.ts create mode 100644 apps/wallet-dashboard/providers/StardustIndexerClientProvider.tsx diff --git a/apps/core/src/api/StardustIndexerClient.ts b/apps/core/src/api/StardustIndexerClient.ts new file mode 100644 index 00000000000..69238ed403f --- /dev/null +++ b/apps/core/src/api/StardustIndexerClient.ts @@ -0,0 +1,72 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +import { StardustIndexerOutput } from '../utils'; + +export interface PageParams { + page?: number; + pageSize?: number; +} + +export class StardustIndexerClient { + private baseUrl: string; + + constructor(baseUrl?: string) { + if (!baseUrl) { + throw new Error('Base URL for IndexerAPI is required.'); + } + this.baseUrl = baseUrl; + } + + private async request( + endpoint: string, + options?: RequestInit, + params?: Record, + ): Promise { + const url = new URL(`${this.baseUrl}${endpoint}`); + + // Append query parameters if provided + if (params) { + Object.entries(params).forEach(([key, value]) => { + if (value !== undefined) { + url.searchParams.append(key, value.toString()); + } + }); + } + + const response = await fetch(url, { + ...(options ?? {}), + headers: { + 'Content-Type': 'application/json', + ...(options?.headers || {}), + }, + }); + + if (!response.ok) { + const errorText = await response.text(); + throw new Error(`API Error: ${response.status} ${response.statusText} - ${errorText}`); + } + + return response.json(); + } + + public getBasicResolvedOutputs = async ( + address: string, + params?: PageParams, + ): Promise => { + return this.request(`/v1/basic/resolved/${address}`, undefined, { + page: params?.page, + page_size: params?.pageSize, + }); + }; + + public getNftResolvedOutputs = async ( + address: string, + params?: PageParams, + ): Promise => { + return this.request(`/v1/nft/resolved/${address}`, undefined, { + page: params?.page, + page_size: params?.pageSize, + }); + }; +} diff --git a/apps/core/src/api/index.ts b/apps/core/src/api/index.ts index ae131558368..2a8cb51fa2f 100644 --- a/apps/core/src/api/index.ts +++ b/apps/core/src/api/index.ts @@ -2,3 +2,4 @@ // SPDX-License-Identifier: Apache-2.0 export * from './SentryHttpTransport'; +export * from './StardustIndexerClient'; diff --git a/apps/core/src/constants/migration.constants.ts b/apps/core/src/constants/migration.constants.ts index 45072d1d652..4e1491da228 100644 --- a/apps/core/src/constants/migration.constants.ts +++ b/apps/core/src/constants/migration.constants.ts @@ -4,6 +4,9 @@ import { IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; export const STARDUST_PACKAGE_ID = - '000000000000000000000000000000000000000000000000000000000000107a'; + '0x000000000000000000000000000000000000000000000000000000000000107a'; export const STARDUST_BASIC_OUTPUT_TYPE = `${STARDUST_PACKAGE_ID}::basic_output::BasicOutput<${IOTA_TYPE_ARG}>`; export const STARDUST_NFT_OUTPUT_TYPE = `${STARDUST_PACKAGE_ID}::nft_output::NftOutput<${IOTA_TYPE_ARG}>`; +export const STARDUST_EXPIRATION_UNLOCK_CONDITION_TYPE = `${STARDUST_PACKAGE_ID}::expiration_unlock_condition::ExpirationUnlockCondition`; +export const STARDUST_STORAGE_DEPOSIT_RETURN_UC_TYPE = `${STARDUST_PACKAGE_ID}::storage_deposit_return_unlock_condition::StorageDepositReturnUnlockCondition`; +export const STARDUST_TIMELOCK_TYPE = `${STARDUST_PACKAGE_ID}::timelock_unlock_condition::TimelockUnlockCondition`; diff --git a/apps/core/src/contexts/StardustIndexerClientContext.tsx b/apps/core/src/contexts/StardustIndexerClientContext.tsx new file mode 100644 index 00000000000..a728945f535 --- /dev/null +++ b/apps/core/src/contexts/StardustIndexerClientContext.tsx @@ -0,0 +1,40 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +import { useContext, createContext, useMemo } from 'react'; +import { StardustIndexerClient } from '../'; +import { getNetwork } from '@iota/iota-sdk/client'; + +type StardustIndexerClientContextType = { + stardustIndexerClient: StardustIndexerClient | null; +}; + +export const StardustIndexerClientContext = createContext( + null, +); + +export function useStardustIndexerClientContext(): StardustIndexerClientContextType { + const context = useContext(StardustIndexerClientContext); + if (!context) { + throw new Error('useStardustIndexerClient must be used within a StardustClientProvider'); + } + return context; +} + +export function useStardustIndexerClient(network?: string) { + const { metadata } = getNetwork<{ + stardustIndexer?: string; + }>(network || ''); + + const stardustIndexerClient = useMemo(() => { + if (metadata?.stardustIndexer) { + return new StardustIndexerClient(metadata?.stardustIndexer); + } else { + return null; + } + }, [metadata?.stardustIndexer]); + + return { + stardustIndexerClient, + }; +} diff --git a/apps/core/src/contexts/index.ts b/apps/core/src/contexts/index.ts index fe492c59d09..b1090f621f4 100644 --- a/apps/core/src/contexts/index.ts +++ b/apps/core/src/contexts/index.ts @@ -3,3 +3,4 @@ export * from './ThemeContext'; export * from './HiddenAssetsProvider'; +export * from './StardustIndexerClientContext'; diff --git a/apps/core/src/utils/migration/index.ts b/apps/core/src/utils/migration/index.ts index 1f09b64ac4a..077fe443852 100644 --- a/apps/core/src/utils/migration/index.ts +++ b/apps/core/src/utils/migration/index.ts @@ -3,3 +3,4 @@ export * from './createMigrationTransaction'; export * from './types'; +export * from './mapStardustIndexerOutputs'; diff --git a/apps/core/src/utils/migration/mapStardustIndexerOutputs.ts b/apps/core/src/utils/migration/mapStardustIndexerOutputs.ts new file mode 100644 index 00000000000..3a7338a3189 --- /dev/null +++ b/apps/core/src/utils/migration/mapStardustIndexerOutputs.ts @@ -0,0 +1,83 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +import { IotaObjectData } from '@iota/iota-sdk/client'; +import { + STARDUST_BASIC_OUTPUT_TYPE, + STARDUST_EXPIRATION_UNLOCK_CONDITION_TYPE, + STARDUST_NFT_OUTPUT_TYPE, + STARDUST_STORAGE_DEPOSIT_RETURN_UC_TYPE, + STARDUST_TIMELOCK_TYPE, +} from '../../constants'; +import { StardustIndexerOutput } from './types'; + +type MapStardustOutput = (output: StardustIndexerOutput, type: string) => IotaObjectData; + +export function mapStardustBasicOutputs(output: StardustIndexerOutput) { + return mapStardustOutput(output, STARDUST_BASIC_OUTPUT_TYPE); +} + +export function mapStardustNftOutputs(output: StardustIndexerOutput): IotaObjectData { + return mapStardustOutput(output, STARDUST_NFT_OUTPUT_TYPE); +} + +const mapStardustOutput: MapStardustOutput = function ( + output: StardustIndexerOutput, + type: string, +) { + return { + objectId: output.id, + digest: '', + version: '', + type: type, + content: { + dataType: 'moveObject' as const, + type: type, + fields: { + balance: output.balance.value, + expiration_uc: output.expiration + ? { + type: STARDUST_EXPIRATION_UNLOCK_CONDITION_TYPE, + fields: { + owner: output.expiration.owner, + return_address: output.expiration.return_address, + unix_time: output.expiration.unix_time, + }, + } + : null, + id: { + id: output.id, + }, + metadata: output.metadata, + native_tokens: { + type: '0x2::bag::Bag', + fields: { + id: { + id: output.native_tokens.id, + }, + size: output.native_tokens.size, + }, + }, + sender: output.sender, + storage_deposit_return_uc: output.storage_deposit_return + ? { + type: STARDUST_STORAGE_DEPOSIT_RETURN_UC_TYPE, + fields: { + return_address: output.storage_deposit_return.return_address, + return_amount: output.storage_deposit_return.return_amount, + }, + } + : null, + tag: output.tag, + timelock_uc: output.timelock + ? { + fields: { + unix_time: output.timelock.unix_time, + }, + type: STARDUST_TIMELOCK_TYPE, + } + : null, + }, + }, + }; +}; diff --git a/apps/core/src/utils/migration/types.ts b/apps/core/src/utils/migration/types.ts index 6f078b149f6..a812341134f 100644 --- a/apps/core/src/utils/migration/types.ts +++ b/apps/core/src/utils/migration/types.ts @@ -2,12 +2,10 @@ // SPDX-License-Identifier: Apache-2.0 import { z } from 'zod'; -import { STARDUST_PACKAGE_ID } from '../../constants'; +import { STARDUST_EXPIRATION_UNLOCK_CONDITION_TYPE, STARDUST_PACKAGE_ID } from '../../constants'; const ExpirationUnlockConditionSchema = z.object({ - type: z.literal( - `${STARDUST_PACKAGE_ID}::expiration_unlock_condition::ExpirationUnlockCondition`, - ), + type: z.literal(STARDUST_EXPIRATION_UNLOCK_CONDITION_TYPE), fields: z.object({ owner: z.string(), return_address: z.string(), @@ -60,6 +58,38 @@ export const BasicOutputObjectSchema = CommonOutputObjectWithUcSchema.extend({ sender: z.string().nullable().optional(), }); +const StardustIndexerOutputSchema = z.object({ + id: z.string(), + balance: z.object({ + value: z.number(), + }), + native_tokens: z.object({ + id: z.string(), + size: z.number(), + }), + storage_deposit_return: z + .object({ + return_address: z.string(), + return_amount: z.number(), + }) + .nullable(), + timelock: z + .object({ + unix_time: z.number(), + }) + .nullable(), + expiration: z + .object({ + owner: z.string(), + return_address: z.string(), + unix_time: z.number(), + }) + .nullable(), + metadata: z.array(z.number()).nullable(), + tag: z.string().nullable(), + sender: z.string().nullable(), +}); + export const NftOutputObjectSchema = CommonOutputObjectWithUcSchema; export type ExpirationUnlockCondition = z.infer; @@ -71,3 +101,4 @@ export type CommonOutputObject = z.infer; export type CommonOutputObjectWithUc = z.infer; export type BasicOutputObject = z.infer; export type NftOutputObject = z.infer; +export type StardustIndexerOutput = z.infer; diff --git a/apps/wallet-dashboard/app/(protected)/migrations/page.tsx b/apps/wallet-dashboard/app/(protected)/migrations/page.tsx index e9215b53f13..885aca68270 100644 --- a/apps/wallet-dashboard/app/(protected)/migrations/page.tsx +++ b/apps/wallet-dashboard/app/(protected)/migrations/page.tsx @@ -21,7 +21,12 @@ import { } from '@iota/apps-ui-kit'; import { Assets, IotaLogoMark, Tokens } from '@iota/apps-ui-icons'; import { useCurrentAccount, useIotaClient } from '@iota/dapp-kit'; -import { STARDUST_BASIC_OUTPUT_TYPE, STARDUST_NFT_OUTPUT_TYPE, useFormatCoin } from '@iota/core'; +import { + STARDUST_BASIC_OUTPUT_TYPE, + STARDUST_NFT_OUTPUT_TYPE, + useFormatCoin, + useStardustIndexerClientContext, +} from '@iota/core'; import { IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; import { StardustOutputMigrationStatus } from '@/lib/enums'; import { MigrationObjectsPanel, MigrationDialog } from '@/components'; @@ -37,7 +42,7 @@ function MigrationDashboardPage(): JSX.Element { const [selectedStardustObjectsCategory, setSelectedStardustObjectsCategory] = useState< StardustOutputMigrationStatus | undefined >(undefined); - + const { stardustIndexerClient } = useStardustIndexerClientContext(); const { data: stardustMigrationObjects, isPlaceholderData } = useGetStardustMigratableObjects(address); const { @@ -111,9 +116,12 @@ function MigrationDashboardPage(): JSX.Element { queryClient.invalidateQueries({ queryKey: ['migration-transaction', address], }); + queryClient.invalidateQueries({ + queryKey: ['stardust-shared-objects', address, stardustIndexerClient], + }); }); }, - [iotaClient, queryClient, address], + [iotaClient, queryClient, address, stardustIndexerClient], ); const MIGRATION_CARDS: MigrationDisplayCardProps[] = [ diff --git a/apps/wallet-dashboard/hooks/useGetAllStardustSharedObjects.ts b/apps/wallet-dashboard/hooks/useGetAllStardustSharedObjects.ts new file mode 100644 index 00000000000..1e15fe9e510 --- /dev/null +++ b/apps/wallet-dashboard/hooks/useGetAllStardustSharedObjects.ts @@ -0,0 +1,77 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +import { useQuery } from '@tanstack/react-query'; +import { + mapStardustBasicOutputs, + mapStardustNftOutputs, + PageParams, + StardustIndexerOutput, + TimeUnit, + useStardustIndexerClientContext, +} from '@iota/core'; +import { IotaObjectData } from '@iota/iota-sdk/client'; + +const LIMIT_PER_REQ = 50; + +export function useGetAllStardustSharedObjects(address: string) { + const { stardustIndexerClient } = useStardustIndexerClientContext(); + + const fetchPaginatedStardustSharedObjects = async ( + mapFn: (output: StardustIndexerOutput) => IotaObjectData, + fetchFn: (address: string, params: PageParams) => Promise, + ) => { + const allData: StardustIndexerOutput[] = []; + let page = 1; + + try { + do { + const data = await fetchFn(address, { page, pageSize: LIMIT_PER_REQ }); + + if (!data || !data.length) { + break; + } + + allData.push(...data); + page++; + } while (page); + } catch (e) { + console.error(e); + } + + return allData.map(mapFn); + }; + + return useQuery({ + queryKey: ['stardust-shared-objects', address, stardustIndexerClient], + queryFn: async () => { + if (!stardustIndexerClient) { + return { + basic: [], + nfts: [], + }; + } + + const basicOutputs = await fetchPaginatedStardustSharedObjects( + mapStardustBasicOutputs, + stardustIndexerClient.getBasicResolvedOutputs, + ); + + const nftOutputs = await fetchPaginatedStardustSharedObjects( + mapStardustNftOutputs, + stardustIndexerClient.getNftResolvedOutputs, + ); + + return { + basic: basicOutputs, + nfts: nftOutputs, + }; + }, + enabled: !!address, + staleTime: TimeUnit.ONE_SECOND * TimeUnit.ONE_MINUTE * 5, + placeholderData: { + basic: [], + nfts: [], + }, + }); +} diff --git a/apps/wallet-dashboard/hooks/useGetStardustMigratableObjects.ts b/apps/wallet-dashboard/hooks/useGetStardustMigratableObjects.ts index e17bb3d6b3b..cbbbeb1d6a8 100644 --- a/apps/wallet-dashboard/hooks/useGetStardustMigratableObjects.ts +++ b/apps/wallet-dashboard/hooks/useGetStardustMigratableObjects.ts @@ -10,9 +10,12 @@ import { TimeUnit, useGetAllOwnedObjects, } from '@iota/core'; +import { useGetAllStardustSharedObjects } from './useGetAllStardustSharedObjects'; export function useGetStardustMigratableObjects(address: string) { const { data: currentEpochMs } = useGetCurrentEpochStartTimestamp(); + const { data: stardustSharedObjectsData, isPending: stardustSharedObjectsPending } = + useGetAllStardustSharedObjects(address); const { data: basicOutputObjects } = useGetAllOwnedObjects(address, { StructType: STARDUST_BASIC_OUTPUT_TYPE, }); @@ -20,6 +23,9 @@ export function useGetStardustMigratableObjects(address: string) { StructType: STARDUST_NFT_OUTPUT_TYPE, }); + const sharedBasicOutputObjects = stardustSharedObjectsData!.basic; + const sharedNftOutputObjects = stardustSharedObjectsData!.nfts; + return useQuery({ queryKey: [ 'stardust-migratable-objects', @@ -27,15 +33,25 @@ export function useGetStardustMigratableObjects(address: string) { currentEpochMs, basicOutputObjects, nftOutputObjects, + sharedBasicOutputObjects, + sharedNftOutputObjects, ], queryFn: () => { const epochMs = Number(currentEpochMs) || 0; const { migratable: migratableBasicOutputs, timelocked: timelockedBasicOutputs } = - groupStardustObjectsByMigrationStatus(basicOutputObjects ?? [], epochMs, address); + groupStardustObjectsByMigrationStatus( + [...(basicOutputObjects ?? []), ...sharedBasicOutputObjects], + epochMs, + address, + ); const { migratable: migratableNftOutputs, timelocked: timelockedNftOutputs } = - groupStardustObjectsByMigrationStatus(nftOutputObjects ?? [], epochMs, address); + groupStardustObjectsByMigrationStatus( + [...(nftOutputObjects ?? []), ...sharedNftOutputObjects], + epochMs, + address, + ); return { migratableBasicOutputs, @@ -48,7 +64,8 @@ export function useGetStardustMigratableObjects(address: string) { !!address && currentEpochMs !== undefined && basicOutputObjects !== undefined && - nftOutputObjects !== undefined, + nftOutputObjects !== undefined && + !stardustSharedObjectsPending, staleTime: TimeUnit.ONE_SECOND * TimeUnit.ONE_MINUTE * 5, placeholderData: { migratableBasicOutputs: [], diff --git a/apps/wallet-dashboard/instrumentation.ts b/apps/wallet-dashboard/instrumentation.ts index e54f0e74003..e45e1fc6212 100644 --- a/apps/wallet-dashboard/instrumentation.ts +++ b/apps/wallet-dashboard/instrumentation.ts @@ -1,3 +1,6 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + export { captureException } from '@sentry/nextjs'; export async function register() { diff --git a/apps/wallet-dashboard/lib/utils/timelock.ts b/apps/wallet-dashboard/lib/utils/timelock.ts index f8e06340922..9817acc1757 100644 --- a/apps/wallet-dashboard/lib/utils/timelock.ts +++ b/apps/wallet-dashboard/lib/utils/timelock.ts @@ -49,7 +49,7 @@ export function mapTimelockObjects(iotaObjects: IotaObjectData[]): TimelockedObj const fields = iotaObject.content.fields as unknown as TimelockedIotaResponse; return { id: fields.id, - locked: { value: BigInt(fields.locked) }, + locked: { value: BigInt(fields?.locked || '0') }, expirationTimestampMs: Number(fields.expiration_timestamp_ms), label: fields.label, }; diff --git a/apps/wallet-dashboard/providers/AppProviders.tsx b/apps/wallet-dashboard/providers/AppProviders.tsx index 9fc6ef3ead4..867d195dd08 100644 --- a/apps/wallet-dashboard/providers/AppProviders.tsx +++ b/apps/wallet-dashboard/providers/AppProviders.tsx @@ -13,6 +13,7 @@ import { useState } from 'react'; import { KioskClientProvider, useLocalStorage } from '@iota/core'; import { growthbook } from '@/lib/utils'; import { ThemeProvider } from '@iota/core'; +import { StardustIndexerClientProvider } from './StardustIndexerClientProvider'; import { createIotaClient } from '@/lib/utils/defaultRpcClient'; growthbook.init(); @@ -36,25 +37,27 @@ export function AppProviders({ children }: React.PropsWithChildren) { defaultNetwork={persistedNetwork} onNetworkChange={handleNetworkChange} > - - - - {children} - - - - + + + + + {children} + + + + + diff --git a/apps/wallet-dashboard/providers/StardustIndexerClientProvider.tsx b/apps/wallet-dashboard/providers/StardustIndexerClientProvider.tsx new file mode 100644 index 00000000000..e1e85e5bf81 --- /dev/null +++ b/apps/wallet-dashboard/providers/StardustIndexerClientProvider.tsx @@ -0,0 +1,18 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +'use client'; + +import { useIotaClientContext } from '@iota/dapp-kit'; +import { StardustIndexerClientContext, useStardustIndexerClient } from '@iota/core'; + +export const StardustIndexerClientProvider: React.FC = ({ children }) => { + const { network } = useIotaClientContext(); + const { stardustIndexerClient } = useStardustIndexerClient(network); + + return ( + + {children} + + ); +}; diff --git a/apps/wallet-dashboard/sentry.common.config.mjs b/apps/wallet-dashboard/sentry.common.config.mjs index 33b6a30f0e3..90fb6705790 100644 --- a/apps/wallet-dashboard/sentry.common.config.mjs +++ b/apps/wallet-dashboard/sentry.common.config.mjs @@ -1,3 +1,6 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + export const IS_PROD = process.env.NODE_ENV === 'production'; export const SENTRY_DSN = IS_PROD diff --git a/sdk/dapp-kit/src/components/IotaClientProvider.tsx b/sdk/dapp-kit/src/components/IotaClientProvider.tsx index 3f53437956f..787f7b97b1a 100644 --- a/sdk/dapp-kit/src/components/IotaClientProvider.tsx +++ b/sdk/dapp-kit/src/components/IotaClientProvider.tsx @@ -40,7 +40,7 @@ export type IotaClientProviderProps = { ); const DEFAULT_NETWORKS = { - localnet: { url: getNetwork(Network.Localnet).url }, + localnet: { url: getNetwork(Network.Localnet)?.url }, }; const DEFAULT_CREATE_CLIENT = function createClient( diff --git a/sdk/typescript/src/client/network.ts b/sdk/typescript/src/client/network.ts index cbe06abc203..e23b9ea9e13 100644 --- a/sdk/typescript/src/client/network.ts +++ b/sdk/typescript/src/client/network.ts @@ -15,7 +15,7 @@ export type NetworkId = Network | string; export type ChainType = `${string}:${string}`; -export interface NetworkConfiguration { +export interface NetworkConfiguration { id: Network; name: string; url: string; @@ -23,6 +23,7 @@ export interface NetworkConfiguration { chain: ChainType; faucet?: string; kiosk?: KioskConfiguration; + metadata?: Metadata; } export interface KioskConfiguration { @@ -52,10 +53,10 @@ export function getAllNetworks(): NetworksConfiguration { return networks; } -export function getNetwork(network: NetworkId): NetworkConfiguration { +export function getNetwork(network: NetworkId): NetworkConfiguration { const networks = getAllNetworks(); - const requestedNetwork = networks[network] ?? network; + const requestedNetwork = (networks[network] ?? network) as NetworkConfiguration; return requestedNetwork; } From 2946744a8e5fb72f92a936c3a818025cf967e6bc Mon Sep 17 00:00:00 2001 From: Lucas Tortora <85233773+lucas-tortora@users.noreply.github.com> Date: Wed, 29 Jan 2025 12:53:43 -0300 Subject: [PATCH 25/51] task(devx): Add Tags - Rust SDK (#4994) * task(devx): Add Tags - Rust SDK * Update docs/content/developer/iota-101/transactions/sign-and-send-transactions.mdx * fix(devx): add missing tags * Update docs/content/developer/iota-101/transactions/sponsored-transactions/use-sponsored-transactions.mdx * add iotaledger@dev-tools team * change team to teams * fix team tag * dprint --- .../iota-101/objects/transfers/transfer-to-object.mdx | 3 +++ .../transactions/ptb/programmable-transaction-blocks.mdx | 4 +++- .../iota-101/transactions/sign-and-send-transactions.mdx | 4 +++- .../sponsored-transactions/use-sponsored-transactions.mdx | 4 +++- docs/content/developer/iota-101/using-events.mdx | 3 +++ .../developer/stardust/claiming/address-unlock-condition.mdx | 3 +++ docs/content/developer/stardust/claiming/alias.mdx | 3 +++ docs/content/developer/stardust/claiming/basic.mdx | 3 +++ docs/content/developer/stardust/claiming/foundry.mdx | 3 +++ docs/content/developer/stardust/claiming/nft.mdx | 3 +++ docs/content/developer/stardust/claiming/self-sponsor.mdx | 3 +++ docs/content/references/rust-sdk.mdx | 3 ++- docs/content/tags.yml | 4 ++++ 13 files changed, 39 insertions(+), 4 deletions(-) diff --git a/docs/content/developer/iota-101/objects/transfers/transfer-to-object.mdx b/docs/content/developer/iota-101/objects/transfers/transfer-to-object.mdx index 55c3805966c..00900eb1c3b 100644 --- a/docs/content/developer/iota-101/objects/transfers/transfer-to-object.mdx +++ b/docs/content/developer/iota-101/objects/transfers/transfer-to-object.mdx @@ -1,6 +1,9 @@ --- title: Transfer to Object description: On IOTA, you can transfer objects to objects in the same way you can transfer objects to addresses. +tags: [ rust, sdk, rust-sdk] +teams: + - iotaledger/dev-tools --- import Quiz from '@site/src/components/Quiz'; import questions from '/json/developer/iota-101/objects/transfers/transfer-to-object.json'; diff --git a/docs/content/developer/iota-101/transactions/ptb/programmable-transaction-blocks.mdx b/docs/content/developer/iota-101/transactions/ptb/programmable-transaction-blocks.mdx index b30b86e3a89..28894de7fdb 100644 --- a/docs/content/developer/iota-101/transactions/ptb/programmable-transaction-blocks.mdx +++ b/docs/content/developer/iota-101/transactions/ptb/programmable-transaction-blocks.mdx @@ -1,6 +1,8 @@ --- description: Learn how to execute multiple commands in a single IOTA transaction using programmable transaction blocks. -tags: [ move, transaction] +tags: [ move, transaction, rust-sdk] +teams: + - iotaledger/dev-tools --- import Quiz from '@site/src/components/Quiz'; import questions from '/json/developer/iota-101/transactions/ptb/programmable-transaction-blocks.json'; diff --git a/docs/content/developer/iota-101/transactions/sign-and-send-transactions.mdx b/docs/content/developer/iota-101/transactions/sign-and-send-transactions.mdx index 1c4e58b956d..0d63eed57c9 100644 --- a/docs/content/developer/iota-101/transactions/sign-and-send-transactions.mdx +++ b/docs/content/developer/iota-101/transactions/sign-and-send-transactions.mdx @@ -1,6 +1,8 @@ --- description: A guide on how to construct, sign, and submit transactions in a Move-based blockchain. -tags: [ tutorial, move, rust, typescript, transaction] +tags: [ tutorial, sdk, move, rust, typescript, transaction, rust-sdk] +teams: + - iotaledger/dev-tools --- import Quiz from '@site/src/components/Quiz'; import questions from '/json/developer/iota-101/transactions/sign-and-send-transactions.json'; diff --git a/docs/content/developer/iota-101/transactions/sponsored-transactions/use-sponsored-transactions.mdx b/docs/content/developer/iota-101/transactions/sponsored-transactions/use-sponsored-transactions.mdx index 4ea5be44691..ec716778af6 100644 --- a/docs/content/developer/iota-101/transactions/sponsored-transactions/use-sponsored-transactions.mdx +++ b/docs/content/developer/iota-101/transactions/sponsored-transactions/use-sponsored-transactions.mdx @@ -1,6 +1,8 @@ --- description: A guide to using sponsored transactions on the IOTA blockchain, including . -tags: [ move, transaction, address] +tags: [ move, transaction, address, rust-sdk] +teams: + - iotaledger/dev-tools --- import Quiz from '@site/src/components/Quiz'; diff --git a/docs/content/developer/iota-101/using-events.mdx b/docs/content/developer/iota-101/using-events.mdx index 4505faeb763..cbd0059ad85 100644 --- a/docs/content/developer/iota-101/using-events.mdx +++ b/docs/content/developer/iota-101/using-events.mdx @@ -1,5 +1,8 @@ --- description: Learn how to monitor IOTA on-chain activity by subscribing to events emitted by Move packages. +tags: [ rust, sdk, rust-sdk] +teams: + - iotaledger/dev-tools --- import Quiz from '@site/src/components/Quiz'; import questions from '/json/developer/iota-101/using-events.json'; diff --git a/docs/content/developer/stardust/claiming/address-unlock-condition.mdx b/docs/content/developer/stardust/claiming/address-unlock-condition.mdx index a4319e0a32d..3b736bef7d8 100644 --- a/docs/content/developer/stardust/claiming/address-unlock-condition.mdx +++ b/docs/content/developer/stardust/claiming/address-unlock-condition.mdx @@ -1,5 +1,8 @@ --- description: A guide on how to claim Outputs Unlockable by an Alias/NFT Address in the Move-based IOTA ledger. +tags: [ rust, sdk, rust-sdk] +teams: + - iotaledger/dev-tools --- import MigrationWarning from '../../../_snippets/migration-warning.mdx'; diff --git a/docs/content/developer/stardust/claiming/alias.mdx b/docs/content/developer/stardust/claiming/alias.mdx index 7b248a77505..367c3f171c2 100644 --- a/docs/content/developer/stardust/claiming/alias.mdx +++ b/docs/content/developer/stardust/claiming/alias.mdx @@ -1,5 +1,8 @@ --- description: A guide on how to claim Alias Outputs in the Move-based IOTA ledger. +tags: [ rust, sdk, rust-sdk] +teams: + - iotaledger/dev-tools --- import MigrationWarning from '../../../_snippets/migration-warning.mdx'; diff --git a/docs/content/developer/stardust/claiming/basic.mdx b/docs/content/developer/stardust/claiming/basic.mdx index c4eeb572990..1522911882b 100644 --- a/docs/content/developer/stardust/claiming/basic.mdx +++ b/docs/content/developer/stardust/claiming/basic.mdx @@ -1,5 +1,8 @@ --- description: A guide on how to claim Basic Outputs in Move by assessing and unlocking owned objects. +tags: [ rust, sdk, rust-sdk] +teams: + - iotaledger/dev-tools --- import MigrationWarning from '../../../_snippets/migration-warning.mdx'; diff --git a/docs/content/developer/stardust/claiming/foundry.mdx b/docs/content/developer/stardust/claiming/foundry.mdx index 601caef7ca7..f27edb81e01 100644 --- a/docs/content/developer/stardust/claiming/foundry.mdx +++ b/docs/content/developer/stardust/claiming/foundry.mdx @@ -1,5 +1,8 @@ --- description: A guide to claiming Foundry Outputs by extracting the CoinManagerTreasuryCap from an AliasOutput in the Move-based IOTA ledger. +tags: [ rust, sdk, rust-sdk] +teams: + - iotaledger/dev-tools --- import MigrationWarning from '../../../_snippets/migration-warning.mdx'; diff --git a/docs/content/developer/stardust/claiming/nft.mdx b/docs/content/developer/stardust/claiming/nft.mdx index ae33a5c6d54..ba0cdea5c15 100644 --- a/docs/content/developer/stardust/claiming/nft.mdx +++ b/docs/content/developer/stardust/claiming/nft.mdx @@ -1,5 +1,8 @@ --- description: A guide on how to claim and convert NFT Outputs in the Move-based IOTA ledger. +tags: [ rust, sdk, rust-sdk] +teams: + - iotaledger/dev-tools --- import MigrationWarning from '../../../_snippets/migration-warning.mdx'; diff --git a/docs/content/developer/stardust/claiming/self-sponsor.mdx b/docs/content/developer/stardust/claiming/self-sponsor.mdx index f074881a53b..76f4170077e 100644 --- a/docs/content/developer/stardust/claiming/self-sponsor.mdx +++ b/docs/content/developer/stardust/claiming/self-sponsor.mdx @@ -1,5 +1,8 @@ --- description: A guide to claiming IOTA assets using self-sponsorship when the address lacks IOTA coins for transaction fees. +tags: [ rust, sdk, rust-sdk] +teams: + - iotaledger/dev-tools --- import MigrationWarning from '../../../_snippets/migration-warning.mdx'; diff --git a/docs/content/references/rust-sdk.mdx b/docs/content/references/rust-sdk.mdx index 700e577c314..05102a0879b 100644 --- a/docs/content/references/rust-sdk.mdx +++ b/docs/content/references/rust-sdk.mdx @@ -1,7 +1,8 @@ --- title: IOTA Rust SDK description: The IOTA Rust SDK provides Rust wrappers around the IOTA API. Using the SDK, you can interact with IOTA networks using the Rust programming language. -tags: [ rust, sdk, reference] +tags: [ rust, sdk, reference, rust-sdk]teams: + - iotaledger/dev-tools --- import README from "../../../crates/iota-sdk/README.md"; diff --git a/docs/content/tags.yml b/docs/content/tags.yml index e35dbaa572f..45a780d0bc3 100644 --- a/docs/content/tags.yml +++ b/docs/content/tags.yml @@ -252,6 +252,10 @@ testing: label: Testing description: Process of evaluating code. +rust-sdk: + label: IOTA Rust SDK + description: The IOTA Rust Software Development Kit + iota-wallet: label: IOTA Wallet description: IOTA Wallet Browser Extension From 3b512bad93d5756151c9b86a6be9609a4b25162f Mon Sep 17 00:00:00 2001 From: Lucas Tortora <85233773+lucas-tortora@users.noreply.github.com> Date: Wed, 29 Jan 2025 13:09:15 -0300 Subject: [PATCH 26/51] task(devx): Add Tags - IOTA CLI (#4996) * task(devx): Add Tags - IOTA CLI * task(devx): Add Tags - IOTA CLI * fix(devx): add missing tags * Update docs/content/developer/cryptography/transaction-auth/intent-signing.mdx * add @iotaledger/dev-tools tag * fix team tag --- .../cryptography/transaction-auth/keys-addresses.mdx | 4 +++- .../developer/cryptography/transaction-auth/multisig.mdx | 3 +++ .../cryptography/transaction-auth/offline-signing.mdx | 3 +++ docs/content/developer/getting-started/build-test.mdx | 4 +++- docs/content/developer/getting-started/coffee-example.mdx | 3 +++ docs/content/developer/getting-started/connect.mdx | 4 +++- docs/content/developer/getting-started/create-a-package.mdx | 4 +++- docs/content/developer/getting-started/debug.mdx | 4 +++- docs/content/developer/getting-started/install-iota.mdx | 4 +++- docs/content/developer/getting-started/iota-environment.mdx | 2 ++ docs/content/developer/getting-started/local-network.mdx | 4 +++- docs/content/developer/getting-started/publish.mdx | 4 +++- .../package-upgrades/automated-address-management.mdx | 3 +++ .../move-overview/package-upgrades/custom-policies.mdx | 3 +++ .../developer/iota-101/objects/object-ownership/immutable.mdx | 3 +++ .../iota-101/transactions/sign-and-send-transactions.mdx | 2 +- docs/content/references/cli.mdx | 3 +++ docs/content/references/cli/ceremony.mdx | 4 +++- docs/content/references/cli/cheatsheet.mdx | 4 +++- docs/content/references/cli/client.mdx | 4 +++- docs/content/references/cli/console.mdx | 4 +++- docs/content/references/cli/keytool.mdx | 4 +++- docs/content/references/cli/move.mdx | 4 +++- docs/content/references/cli/ptb.mdx | 4 +++- docs/content/references/cli/validator.mdx | 4 +++- docs/content/tags.yml | 4 ++++ 26 files changed, 76 insertions(+), 17 deletions(-) diff --git a/docs/content/developer/cryptography/transaction-auth/keys-addresses.mdx b/docs/content/developer/cryptography/transaction-auth/keys-addresses.mdx index 8a403d9e911..06d27970f88 100644 --- a/docs/content/developer/cryptography/transaction-auth/keys-addresses.mdx +++ b/docs/content/developer/cryptography/transaction-auth/keys-addresses.mdx @@ -1,6 +1,8 @@ --- title: Keys and Addresses -tags: [ address, tutorial, transaction] +tags: [ address, tutorial, transaction, iota-cli] +teams: + - iotaledger/dev-tools --- import Quiz from '@site/src/components/Quiz'; import questions from '/json/developer/cryptography/key-addresses.json'; diff --git a/docs/content/developer/cryptography/transaction-auth/multisig.mdx b/docs/content/developer/cryptography/transaction-auth/multisig.mdx index 031f6b5242e..97aac802ef2 100644 --- a/docs/content/developer/cryptography/transaction-auth/multisig.mdx +++ b/docs/content/developer/cryptography/transaction-auth/multisig.mdx @@ -1,5 +1,8 @@ --- title: Multisig +tags: [iota-cli] +teams: + - iotaledger/dev-tools --- import Quiz from '@site/src/components/Quiz'; diff --git a/docs/content/developer/cryptography/transaction-auth/offline-signing.mdx b/docs/content/developer/cryptography/transaction-auth/offline-signing.mdx index 6510d3bdcc7..52f4e5276a9 100644 --- a/docs/content/developer/cryptography/transaction-auth/offline-signing.mdx +++ b/docs/content/developer/cryptography/transaction-auth/offline-signing.mdx @@ -1,5 +1,8 @@ --- title: Offline Signing +tags: [ iota-cli ] +teams: + - iotaledger/dev-tools --- import Quiz from '@site/src/components/Quiz'; diff --git a/docs/content/developer/getting-started/build-test.mdx b/docs/content/developer/getting-started/build-test.mdx index 6c4db2d6cf3..824d82a9a50 100644 --- a/docs/content/developer/getting-started/build-test.mdx +++ b/docs/content/developer/getting-started/build-test.mdx @@ -1,6 +1,8 @@ --- description: Learn how to build and test Move packages in IOTA with detailed instructions and examples. -tags: [move, testing, how-to, cli] +tags: [move, testing, how-to, cli, iota-cli] +teams: + - iotaledger/dev-tools --- import TestingCheatSheet from "../../_snippets/testing-cheat-sheet.mdx"; diff --git a/docs/content/developer/getting-started/coffee-example.mdx b/docs/content/developer/getting-started/coffee-example.mdx index 488806c6525..d86f57e9243 100644 --- a/docs/content/developer/getting-started/coffee-example.mdx +++ b/docs/content/developer/getting-started/coffee-example.mdx @@ -4,6 +4,9 @@ tags: - tutorial - move - getting-started + - iota-cli +teams: + - iotaledger/dev-tools --- ## Introduction diff --git a/docs/content/developer/getting-started/connect.mdx b/docs/content/developer/getting-started/connect.mdx index d300f4e5714..5a9e19f2926 100644 --- a/docs/content/developer/getting-started/connect.mdx +++ b/docs/content/developer/getting-started/connect.mdx @@ -1,6 +1,8 @@ --- description: Guide to connecting to an IOTA network for development and production. -tags: [ explanation, mainnet, testnet, devnet, cli, setup, install, getting-started ] +tags: [ explanation, mainnet, testnet, devnet, cli, setup, install, getting-started, iota-cli ] +teams: + - iotaledger/dev-tools --- import DataWipe from "../../_snippets/data-wipe.mdx"; diff --git a/docs/content/developer/getting-started/create-a-package.mdx b/docs/content/developer/getting-started/create-a-package.mdx index 4a1d416eec2..620601c6ecf 100644 --- a/docs/content/developer/getting-started/create-a-package.mdx +++ b/docs/content/developer/getting-started/create-a-package.mdx @@ -1,6 +1,8 @@ --- description: How to create a Move package in IOTA -tags: [ move, getting-started ] +tags: [ move, getting-started , iota-cli] +teams: + - iotaledger/dev-tools --- import Quiz from '@site/src/components/Quiz'; diff --git a/docs/content/developer/getting-started/debug.mdx b/docs/content/developer/getting-started/debug.mdx index 2786f11726a..b17d4e800a0 100644 --- a/docs/content/developer/getting-started/debug.mdx +++ b/docs/content/developer/getting-started/debug.mdx @@ -1,6 +1,8 @@ --- description: Learn how to use the std::debug module in Move for debugging and printing values. -tags: [move, getting-started, testing] +tags: [move, getting-started, testing, iota-cli] +teams: + - iotaledger/dev-tools --- import Quiz from '@site/src/components/Quiz'; import questions from '/json/developer/getting-started/debug.json'; diff --git a/docs/content/developer/getting-started/install-iota.mdx b/docs/content/developer/getting-started/install-iota.mdx index 4bf5fc41732..bb8ef8c2317 100644 --- a/docs/content/developer/getting-started/install-iota.mdx +++ b/docs/content/developer/getting-started/install-iota.mdx @@ -1,7 +1,9 @@ --- title: Install IOTA description: Install the IOTA framework and required prerequisites on your system, including the IOTA command line interface to interact with the IOTA network. -tags: [ how-to, cli, getting-started, install, setup ] +tags: [ how-to, cli, getting-started, install, setup , iota-cli] +teams: + - iotaledger/dev-tools --- import MacosDeps from "../../_snippets/macos-deps.mdx"; diff --git a/docs/content/developer/getting-started/iota-environment.mdx b/docs/content/developer/getting-started/iota-environment.mdx index de70a70cd84..74e04bb4af7 100644 --- a/docs/content/developer/getting-started/iota-environment.mdx +++ b/docs/content/developer/getting-started/iota-environment.mdx @@ -8,6 +8,8 @@ tags: - typescript - rust - move +teams: + - iotaledger/dev-tools --- # Before You Start diff --git a/docs/content/developer/getting-started/local-network.mdx b/docs/content/developer/getting-started/local-network.mdx index 3645a7b6aa1..a81a69be68c 100644 --- a/docs/content/developer/getting-started/local-network.mdx +++ b/docs/content/developer/getting-started/local-network.mdx @@ -1,6 +1,8 @@ --- description: Guide to setting up and using a local IOTA network for development and testing. -tags: [ how-to, install, setup, cli, typescript, sdk, testing ] +tags: [ how-to, install, setup, cli, typescript, sdk, testing, iota-cli ] +teams: + - iotaledger/dev-tools --- import Quiz from '@site/src/components/Quiz'; import questions from '/json/developer/getting-started/local-network.json'; diff --git a/docs/content/developer/getting-started/publish.mdx b/docs/content/developer/getting-started/publish.mdx index 677306197df..ea830009cc9 100644 --- a/docs/content/developer/getting-started/publish.mdx +++ b/docs/content/developer/getting-started/publish.mdx @@ -1,6 +1,8 @@ --- description: Learn how to publish your Move package on the IOTA network and interact with it using programmable transaction blocks. -tags: [move, how-to, cli] +tags: [move, how-to, cli, iota-cli] +teams: + - iotaledger/dev-tools --- import AddressPrefix from "../../_snippets/address-prefix.mdx"; diff --git a/docs/content/developer/iota-101/move-overview/package-upgrades/automated-address-management.mdx b/docs/content/developer/iota-101/move-overview/package-upgrades/automated-address-management.mdx index 41b93a3d180..de8d8bbc0a0 100644 --- a/docs/content/developer/iota-101/move-overview/package-upgrades/automated-address-management.mdx +++ b/docs/content/developer/iota-101/move-overview/package-upgrades/automated-address-management.mdx @@ -1,5 +1,8 @@ --- title: Automated Address Management +tags: [ iota-cli ] +teams: + - iotaledger/dev-tools --- When you publish or upgrade a package, its address (also known as the package ID) is tracked in the `Move.lock` file. This bookkeeping is done automatically so that you can avoid recording or updating hex addresses (for example, in the `Move.toml` file). diff --git a/docs/content/developer/iota-101/move-overview/package-upgrades/custom-policies.mdx b/docs/content/developer/iota-101/move-overview/package-upgrades/custom-policies.mdx index c1fa397f23b..754f3df010b 100644 --- a/docs/content/developer/iota-101/move-overview/package-upgrades/custom-policies.mdx +++ b/docs/content/developer/iota-101/move-overview/package-upgrades/custom-policies.mdx @@ -1,5 +1,8 @@ --- description: A guide to understanding and implementing secure package upgrade policies in IOTA using Move. +tags: [ iota-cli ] +teams: + - iotaledger/dev-tools --- import UpgradeSingleKeyRisk from "../../../../_snippets/upgrade-single-key-risk.mdx"; diff --git a/docs/content/developer/iota-101/objects/object-ownership/immutable.mdx b/docs/content/developer/iota-101/objects/object-ownership/immutable.mdx index 570f0fded88..0f56adadf7e 100644 --- a/docs/content/developer/iota-101/objects/object-ownership/immutable.mdx +++ b/docs/content/developer/iota-101/objects/object-ownership/immutable.mdx @@ -1,6 +1,9 @@ --- title: Immutable Objects description: Immutable objects on IOTA cannot be mutated, transferred, or deleted once frozen. These objects are ownerless and can be used by anyone on the network. +tags: [ iota-cli ] +teams: + - iotaledger/dev-tools --- import Quiz from '@site/src/components/Quiz'; import questions from '/json/developer/iota-101/objects/object-ownership/immutable.json'; diff --git a/docs/content/developer/iota-101/transactions/sign-and-send-transactions.mdx b/docs/content/developer/iota-101/transactions/sign-and-send-transactions.mdx index 0d63eed57c9..cf7fe825b2c 100644 --- a/docs/content/developer/iota-101/transactions/sign-and-send-transactions.mdx +++ b/docs/content/developer/iota-101/transactions/sign-and-send-transactions.mdx @@ -1,6 +1,6 @@ --- description: A guide on how to construct, sign, and submit transactions in a Move-based blockchain. -tags: [ tutorial, sdk, move, rust, typescript, transaction, rust-sdk] +tags: [ tutorial, move, rust, typescript, transaction, iota-cli, rust-sdk] teams: - iotaledger/dev-tools --- diff --git a/docs/content/references/cli.mdx b/docs/content/references/cli.mdx index f703124602c..8f52fdec08c 100644 --- a/docs/content/references/cli.mdx +++ b/docs/content/references/cli.mdx @@ -1,6 +1,9 @@ --- title: IOTA CLI description: IOTA provides command line tools to interact with the network, its features, and the Move programming language. Individual command groups are referred to as IOTA Client CLI, IOTA Console CLI, IOTA Keytool CLI, IOTA Move CLI, and IOTA Validator CLI. +tags: [ iota-cli ] +teams: + - iotaledger/dev-tools --- import CliCheckInstall from "../_snippets/cli-check-install.mdx"; diff --git a/docs/content/references/cli/ceremony.mdx b/docs/content/references/cli/ceremony.mdx index 1ffb11c29fc..74c41542e42 100644 --- a/docs/content/references/cli/ceremony.mdx +++ b/docs/content/references/cli/ceremony.mdx @@ -1,7 +1,9 @@ --- title: IOTA Genesis Ceremony CLI description: The IOTA Genesis Ceremony CLI provides commands for building a Genesis blob file. -tags: [ move, cli, reference, validator] +tags: [ move, cli, reference, validator, iota-cli] +teams: + - iotaledger/dev-tools --- The IOTA CLI `genesis-ceremony` command allows the orchestration of an IOTA Genesis Ceremony, diff --git a/docs/content/references/cli/cheatsheet.mdx b/docs/content/references/cli/cheatsheet.mdx index 4f128c417d6..c408eb71777 100644 --- a/docs/content/references/cli/cheatsheet.mdx +++ b/docs/content/references/cli/cheatsheet.mdx @@ -1,6 +1,8 @@ --- title: IOTA CLI Cheat Sheet -tags: [ move, cli, reference, address] +tags: [ move, cli, reference, address, iota-cli] +teams: + - iotaledger/dev-tools --- The cheat sheet highlights common IOTA CLI commands. diff --git a/docs/content/references/cli/client.mdx b/docs/content/references/cli/client.mdx index acb68322022..cc4fa2ed9e3 100644 --- a/docs/content/references/cli/client.mdx +++ b/docs/content/references/cli/client.mdx @@ -1,7 +1,9 @@ --- title: IOTA Client CLI description: The IOTA Client CLI provides command-level access to interact with the IOTA network. -tags: [ move, cli, transaction, address, reference] +tags: [ move, cli, transaction, address, reference, iota-cli] +teams: + - iotaledger/dev-tools --- import CliCheckInstall from "../../_snippets/cli-check-install.mdx"; diff --git a/docs/content/references/cli/console.mdx b/docs/content/references/cli/console.mdx index b52d20578c2..b64ca550863 100644 --- a/docs/content/references/cli/console.mdx +++ b/docs/content/references/cli/console.mdx @@ -1,7 +1,9 @@ --- title: IOTA Console CLI description: The IOTA Console CLI provides command-level access to interact with the IOTA network by wrapping the IOTA Client CLI command. -tags: [ move, cli, reference] +tags: [ move, cli, reference, iota-cli] +teams: + - iotaledger/dev-tools --- import CliCheckInstall from "../../_snippets/cli-check-install.mdx"; diff --git a/docs/content/references/cli/keytool.mdx b/docs/content/references/cli/keytool.mdx index 0e90699d23e..b45b685b735 100644 --- a/docs/content/references/cli/keytool.mdx +++ b/docs/content/references/cli/keytool.mdx @@ -1,7 +1,9 @@ --- title: IOTA Keytool CLI description: The IOTA Keytool CLI has commands for managing and generating addresses, working with private keys, or signatures. -tags: [ move, cli, reference] +tags: [ move, cli, reference, iota-cli] +teams: + - iotaledger/dev-tools --- import CliCheckInstall from "../../_snippets/cli-check-install.mdx"; diff --git a/docs/content/references/cli/move.mdx b/docs/content/references/cli/move.mdx index 9ae853b62e5..9d6575e8855 100644 --- a/docs/content/references/cli/move.mdx +++ b/docs/content/references/cli/move.mdx @@ -1,7 +1,9 @@ --- title: IOTA Move CLI description: The IOTA CLI move command provides commands for working with Move source code directly from a terminal or console. -tags: [ move, cli, reference] +tags: [ move, cli, reference, iota-cli] +teams: + - iotaledger/dev-tools --- import CliCheckInstall from "../../_snippets/cli-check-install.mdx"; diff --git a/docs/content/references/cli/ptb.mdx b/docs/content/references/cli/ptb.mdx index ac9f88cfbd2..5a9c40845f4 100644 --- a/docs/content/references/cli/ptb.mdx +++ b/docs/content/references/cli/ptb.mdx @@ -1,7 +1,9 @@ --- title: IOTA Client PTB CLI description: The IOTA Client PTB CLI enables a user to construct a PTB and execute it from the command line or a file. -tags: [ move, cli, address, reference] +tags: [ move, cli, address, reference, iota-cli] +teams: + - iotaledger/dev-tools --- import AddressPrefix from "../../_snippets/address-prefix.mdx"; diff --git a/docs/content/references/cli/validator.mdx b/docs/content/references/cli/validator.mdx index c751b0c181a..ccd56c23ba8 100644 --- a/docs/content/references/cli/validator.mdx +++ b/docs/content/references/cli/validator.mdx @@ -1,6 +1,8 @@ --- title: IOTA Validator CLI -tags: [ move, cli, validator] +tags: [ move, cli, validator, iota-cli] +teams: + - iotaledger/dev-tools --- The IOTA CLI `validator` command provides command-level access to validator features of the IOTA network. diff --git a/docs/content/tags.yml b/docs/content/tags.yml index 45a780d0bc3..ec4dbd0e944 100644 --- a/docs/content/tags.yml +++ b/docs/content/tags.yml @@ -252,6 +252,10 @@ testing: label: Testing description: Process of evaluating code. +iota-cli: + label: IOTA CLI + description: IOTA Command Line Interface + rust-sdk: label: IOTA Rust SDK description: The IOTA Rust Software Development Kit From 0daa3f3aa6dfbe5aa9188f781863608e195ad653 Mon Sep 17 00:00:00 2001 From: muXxer Date: Wed, 29 Jan 2025 17:47:07 +0100 Subject: [PATCH 27/51] fix: re-add rpc-indexes to support `InputObject` and `ChangedObject` filters (partly revert #3142) (#5074) --- crates/iota-core/src/authority.rs | 6 ++ crates/iota-storage/src/indexes.rs | 73 ++++++++++++++++++++ crates/iota-tool/src/db_tool/index_search.rs | 29 ++++++++ 3 files changed, 108 insertions(+) diff --git a/crates/iota-core/src/authority.rs b/crates/iota-core/src/authority.rs index 2a9fba2698b..f7796bb8914 100644 --- a/crates/iota-core/src/authority.rs +++ b/crates/iota-core/src/authority.rs @@ -2097,6 +2097,12 @@ impl AuthorityState { indexes .index_tx( cert.data().intent_message().value.sender(), + cert.data() + .intent_message() + .value + .input_objects()? + .iter() + .map(|o| o.object_id()), effects .all_changed_objects() .into_iter() diff --git a/crates/iota-storage/src/indexes.rs b/crates/iota-storage/src/indexes.rs index b4dc2456006..c49bdce8aa3 100644 --- a/crates/iota-storage/src/indexes.rs +++ b/crates/iota-storage/src/indexes.rs @@ -160,6 +160,15 @@ pub struct IndexStoreTables { #[default_options_override_fn = "transactions_to_addr_table_default_config"] transactions_to_addr: DBMap<(IotaAddress, TxSequenceNumber), TransactionDigest>, + /// Index from object id to transactions that used that object id as input. + #[deprecated] + transactions_by_input_object_id: DBMap<(ObjectID, TxSequenceNumber), TransactionDigest>, + + /// Index from object id to transactions that modified/created that object + /// id. + #[deprecated] + transactions_by_mutated_object_id: DBMap<(ObjectID, TxSequenceNumber), TransactionDigest>, + /// Index from package id, module and function identifier to transactions /// that used that moce function call as input. #[default_options_override_fn = "transactions_by_move_function_table_default_config"] @@ -458,6 +467,7 @@ impl IndexStore { pub async fn index_tx( &self, sender: IotaAddress, + active_inputs: impl Iterator, mutated_objects: impl Iterator + Clone, move_functions: impl Iterator + Clone, events: &TransactionEvents, @@ -484,6 +494,21 @@ impl IndexStore { std::iter::once(((sender, sequence), *digest)), )?; + #[allow(deprecated)] + if !self.remove_deprecated_tables { + batch.insert_batch( + &self.tables.transactions_by_input_object_id, + active_inputs.map(|id| ((id, sequence), *digest)), + )?; + + batch.insert_batch( + &self.tables.transactions_by_mutated_object_id, + mutated_objects + .clone() + .map(|(obj_ref, _)| ((obj_ref.0, sequence), *digest)), + )?; + } + batch.insert_batch( &self.tables.transactions_by_move_function, move_functions.map(|(obj_id, module, function)| { @@ -657,6 +682,12 @@ impl IndexStore { }) => Ok(self.get_transactions_by_move_function( package, module, function, cursor, limit, reverse, )?), + Some(TransactionFilter::InputObject(object_id)) => { + Ok(self.get_transactions_by_input_object(object_id, cursor, limit, reverse)?) + } + Some(TransactionFilter::ChangedObject(object_id)) => { + Ok(self.get_transactions_by_mutated_object(object_id, cursor, limit, reverse)?) + } Some(TransactionFilter::FromAddress(address)) => { Ok(self.get_transactions_from_addr(address, cursor, limit, reverse)?) } @@ -734,6 +765,46 @@ impl IndexStore { }) } + pub fn get_transactions_by_input_object( + &self, + input_object: ObjectID, + cursor: Option, + limit: Option, + reverse: bool, + ) -> IotaResult> { + if self.remove_deprecated_tables { + return Ok(vec![]); + } + #[allow(deprecated)] + Self::get_transactions_from_index( + &self.tables.transactions_by_input_object_id, + input_object, + cursor, + limit, + reverse, + ) + } + + pub fn get_transactions_by_mutated_object( + &self, + mutated_object: ObjectID, + cursor: Option, + limit: Option, + reverse: bool, + ) -> IotaResult> { + if self.remove_deprecated_tables { + return Ok(vec![]); + } + #[allow(deprecated)] + Self::get_transactions_from_index( + &self.tables.transactions_by_mutated_object_id, + mutated_object, + cursor, + limit, + reverse, + ) + } + pub fn get_transactions_from_addr( &self, addr: IotaAddress, @@ -1573,6 +1644,7 @@ mod tests { address, vec![].into_iter(), vec![].into_iter(), + vec![].into_iter(), &TransactionEvents { data: vec![] }, object_index_changes, &TransactionDigest::random(), @@ -1616,6 +1688,7 @@ mod tests { address, vec![].into_iter(), vec![].into_iter(), + vec![].into_iter(), &TransactionEvents { data: vec![] }, object_index_changes, &TransactionDigest::random(), diff --git a/crates/iota-tool/src/db_tool/index_search.rs b/crates/iota-tool/src/db_tool/index_search.rs index 694b610467d..70ee8693827 100644 --- a/crates/iota-tool/src/db_tool/index_search.rs +++ b/crates/iota-tool/src/db_tool/index_search.rs @@ -67,6 +67,22 @@ pub fn search_index( termination ) } + "transactions_by_input_object_id" => { + get_db_entries!( + db_read_only_handle.transactions_by_input_object_id, + from_id_seq, + start, + termination + ) + } + "transactions_by_mutated_object_id" => { + get_db_entries!( + db_read_only_handle.transactions_by_mutated_object_id, + from_id_seq, + start, + termination + ) + } "transactions_by_move_function" => { get_db_entries!( db_read_only_handle.transactions_by_move_function, @@ -241,6 +257,19 @@ fn from_addr_seq(s: &str) -> Result<(IotaAddress, TxSequenceNumber), anyhow::Err Ok((address, sequence_number)) } +fn from_id_seq(s: &str) -> Result<(ObjectID, TxSequenceNumber), anyhow::Error> { + // Remove whitespaces + let s = s.trim(); + let tokens = s.split(',').collect::>(); + if tokens.len() != 2 { + return Err(anyhow!("Invalid object id, sequence number pair")); + } + let oid = ObjectID::from_str(tokens[0].trim())?; + let sequence_number = TxSequenceNumber::from_str(tokens[1].trim())?; + + Ok((oid, sequence_number)) +} + fn from_id_module_function_txseq( s: &str, ) -> Result<(ObjectID, String, String, TxSequenceNumber), anyhow::Error> { From 75aca23527c63654e36683d785dd46256997e4bf Mon Sep 17 00:00:00 2001 From: Lucas Tortora <85233773+lucas-tortora@users.noreply.github.com> Date: Wed, 29 Jan 2025 14:05:54 -0300 Subject: [PATCH 28/51] task(devx): Add tags - Tokenomics (#4984) * task(devx): Added tags to docs pertaining to tokenomics * dprint * add team tag * update tag * fix team tag format * fix team tags --- docs/content/about-iota/FAQ.mdx | 3 +++ .../about-iota/iota-architecture/staking-rewards.mdx | 6 ++++++ docs/content/about-iota/tokenomics/gas-in-iota.mdx | 3 +++ docs/content/about-iota/tokenomics/gas-pricing.mdx | 3 +++ docs/content/about-iota/tokenomics/iota-token.mdx | 3 +++ docs/content/about-iota/tokenomics/proof-of-stake.mdx | 3 +++ docs/content/about-iota/tokenomics/staking-unstaking.mdx | 3 +++ docs/content/about-iota/tokenomics/tokenomics.mdx | 3 +++ docs/content/about-iota/tokenomics/validators-staking.mdx | 3 +++ docs/content/tags.yml | 4 ++++ 10 files changed, 34 insertions(+) diff --git a/docs/content/about-iota/FAQ.mdx b/docs/content/about-iota/FAQ.mdx index 4922db81130..cb969156d02 100644 --- a/docs/content/about-iota/FAQ.mdx +++ b/docs/content/about-iota/FAQ.mdx @@ -1,6 +1,9 @@ import ValidatorRequirementsTab from '../_snippets/validator-requirements-tab.mdx' --- +tags: [tokenomics] +teams: + - iotaledger/research description: Frequently asked question about IOTA Rebased, Move and the IOTA Rebased Proposal. --- # FAQs diff --git a/docs/content/about-iota/iota-architecture/staking-rewards.mdx b/docs/content/about-iota/iota-architecture/staking-rewards.mdx index 21c7ab5d878..028b4aabb31 100644 --- a/docs/content/about-iota/iota-architecture/staking-rewards.mdx +++ b/docs/content/about-iota/iota-architecture/staking-rewards.mdx @@ -1,3 +1,9 @@ +--- +teams: + - iotaledger/research +tags: + - tokenomics +--- import StakingPoolReqs from "../../_snippets/staking-pool-reqs.mdx"; import Quiz from '@site/src/components/Quiz'; import {questions} from '../../../site/static/json/about-iota/iota-architecture/staking-reward.json'; diff --git a/docs/content/about-iota/tokenomics/gas-in-iota.mdx b/docs/content/about-iota/tokenomics/gas-in-iota.mdx index 896ef5f5f7f..e0897329b8f 100644 --- a/docs/content/about-iota/tokenomics/gas-in-iota.mdx +++ b/docs/content/about-iota/tokenomics/gas-in-iota.mdx @@ -1,6 +1,9 @@ --- title: Gas in IOTA description: An IOTA transaction must both pay for the computational cost of execution and pay a deposit for storing the objects a transaction creates or mutates. +tags: [tokenomics] +teams: + - iotaledger/research --- import Quiz from '@site/src/components/Quiz'; diff --git a/docs/content/about-iota/tokenomics/gas-pricing.mdx b/docs/content/about-iota/tokenomics/gas-pricing.mdx index d7bb6f50064..968a8620b49 100644 --- a/docs/content/about-iota/tokenomics/gas-pricing.mdx +++ b/docs/content/about-iota/tokenomics/gas-pricing.mdx @@ -1,5 +1,8 @@ --- title: IOTA Gas Pricing +tags: [tokenomics] +teams: + - iotaledger/research --- import Quiz from '@site/src/components/Quiz'; diff --git a/docs/content/about-iota/tokenomics/iota-token.mdx b/docs/content/about-iota/tokenomics/iota-token.mdx index 4e48c0d6e11..bf06c41306f 100644 --- a/docs/content/about-iota/tokenomics/iota-token.mdx +++ b/docs/content/about-iota/tokenomics/iota-token.mdx @@ -1,5 +1,8 @@ --- title: IOTA Token +tags: [tokenomics] +teams: + - iotaledger/research description: The native asset on IOTA is called IOTA. --- diff --git a/docs/content/about-iota/tokenomics/proof-of-stake.mdx b/docs/content/about-iota/tokenomics/proof-of-stake.mdx index a45bf874fd8..58211cea6c1 100644 --- a/docs/content/about-iota/tokenomics/proof-of-stake.mdx +++ b/docs/content/about-iota/tokenomics/proof-of-stake.mdx @@ -1,5 +1,8 @@ --- title: Proof of Stake +tags: [tokenomics] +teams: + - iotaledger/research --- import Quiz from '@site/src/components/Quiz'; diff --git a/docs/content/about-iota/tokenomics/staking-unstaking.mdx b/docs/content/about-iota/tokenomics/staking-unstaking.mdx index 1517046de17..03ee75efbad 100644 --- a/docs/content/about-iota/tokenomics/staking-unstaking.mdx +++ b/docs/content/about-iota/tokenomics/staking-unstaking.mdx @@ -1,5 +1,8 @@ --- title: Staking and Unstaking +tags: [tokenomics] +teams: + - iotaledger/research description: Staking and unstaking IOTA with validators earns a percentage of rewards they receive from gas fees. --- diff --git a/docs/content/about-iota/tokenomics/tokenomics.mdx b/docs/content/about-iota/tokenomics/tokenomics.mdx index 981e93ea2e2..cedf45c8f13 100644 --- a/docs/content/about-iota/tokenomics/tokenomics.mdx +++ b/docs/content/about-iota/tokenomics/tokenomics.mdx @@ -1,5 +1,8 @@ --- title: IOTA Tokenomics +tags: [tokenomics] +teams: + - iotaledger/research --- import Quiz from '@site/src/components/Quiz'; import {questions} from '../../../site/static/json/about-iota/tokenomics/tokenomics.json'; diff --git a/docs/content/about-iota/tokenomics/validators-staking.mdx b/docs/content/about-iota/tokenomics/validators-staking.mdx index 6a628c91ab5..b3d58282ab8 100644 --- a/docs/content/about-iota/tokenomics/validators-staking.mdx +++ b/docs/content/about-iota/tokenomics/validators-staking.mdx @@ -1,5 +1,8 @@ --- title: Validators and Staking Pools +tags: [tokenomics] +teams: + - iotaledger/research --- import StakingPoolReqs from "../../_snippets/staking-pool-reqs.mdx"; diff --git a/docs/content/tags.yml b/docs/content/tags.yml index ec4dbd0e944..98745dc2786 100644 --- a/docs/content/tags.yml +++ b/docs/content/tags.yml @@ -252,6 +252,10 @@ testing: label: Testing description: Process of evaluating code. +tokenomics: + label: Tokenomics + description: Token Economics + iota-cli: label: IOTA CLI description: IOTA Command Line Interface From 78d8e375a1c155f6e5b1a596771e3846186c2dfa Mon Sep 17 00:00:00 2001 From: Lucas Tortora <85233773+lucas-tortora@users.noreply.github.com> Date: Wed, 29 Jan 2025 14:27:15 -0300 Subject: [PATCH 29/51] task(devx): Add Tags - Identity (#4992) * task(devx): Add Tags - Identity * Add missing tags * add team tags * remove duplicate * fix tag * remove misplaced tag * remove misplaced tag --- docs/content/iota-identity/contribute.mdx | 2 + .../explanations/about-identity-objects.mdx | 2 + .../explanations/authenticated-assets.mdx | 2 + .../decentralized-identifiers.mdx | 2 + .../explanations/verifiable-credentials.mdx | 2 + .../explanations/verifiable-presentations.mdx | 10 ++++ .../iota-identity/getting-started/rust.mdx | 2 + .../getting-started/universal-resolver.mdx | 2 + .../decentralized-identifiers/create.mdx | 2 + .../decentralized-identifiers/delete.mdx | 2 + .../decentralized-identifiers/resolve.mdx | 2 + .../decentralized-identifiers/update.mdx | 2 + .../domain-linkage/create-and-verify.mdx | 2 + .../iota-identity/how-tos/key-storage.mdx | 2 + .../how-tos/verifiable-credentials/create.mdx | 2 + .../verifiable-credentials/revocation.mdx | 2 + .../selective-disclosure.mdx | 2 + .../zero-knowledge-selective-disclosure.mdx | 2 + .../create-and-validate.mdx | 2 + docs/content/iota-identity/index.mdx | 2 + .../operator/telemetry/iota-telemetry.mdx | 46 +++++++++++++++++++ .../iota-identity/iota-did-method-spec.mdx | 2 + .../references/iota-identity/overview.mdx | 2 + .../iota-identity/revocation-bitmap-2022.mdx | 2 + .../revocation-timeframe-2024.mdx | 2 + docs/content/tags.yml | 4 ++ 26 files changed, 106 insertions(+) create mode 100644 docs/content/operator/telemetry/iota-telemetry.mdx diff --git a/docs/content/iota-identity/contribute.mdx b/docs/content/iota-identity/contribute.mdx index 4d24bab9869..b42f4cd1250 100644 --- a/docs/content/iota-identity/contribute.mdx +++ b/docs/content/iota-identity/contribute.mdx @@ -3,6 +3,8 @@ title: Contribute to the project sidebar_label: Contribute description: Contribute to IOTA Identity by joining the Identity initiative, via the projects GitHub repository, documentation, or sharing your knowledge. image: /img/identity/icon.png +teams: + - iotaledger/identity tags: - reference - identity diff --git a/docs/content/iota-identity/explanations/about-identity-objects.mdx b/docs/content/iota-identity/explanations/about-identity-objects.mdx index 12dcdb5553d..bdcb2de6b87 100644 --- a/docs/content/iota-identity/explanations/about-identity-objects.mdx +++ b/docs/content/iota-identity/explanations/about-identity-objects.mdx @@ -2,6 +2,8 @@ title: On-chain Identity description: The IOTA `Identity` Move object. image: /img/identity/icon.png +teams: + - iotaledger/identity tags: - explanation - identity diff --git a/docs/content/iota-identity/explanations/authenticated-assets.mdx b/docs/content/iota-identity/explanations/authenticated-assets.mdx index 4d1c14ba5f5..0e47fbb1bf2 100644 --- a/docs/content/iota-identity/explanations/authenticated-assets.mdx +++ b/docs/content/iota-identity/explanations/authenticated-assets.mdx @@ -2,6 +2,8 @@ title: Authenticated Assets description: A configurable asset that keeps track of its origin and owner. image: /img/identity/icon.png +teams: + - iotaledger/identity tags: - explanation - getting-started diff --git a/docs/content/iota-identity/explanations/decentralized-identifiers.mdx b/docs/content/iota-identity/explanations/decentralized-identifiers.mdx index e9cdaac7ac7..3256d69c33e 100644 --- a/docs/content/iota-identity/explanations/decentralized-identifiers.mdx +++ b/docs/content/iota-identity/explanations/decentralized-identifiers.mdx @@ -1,6 +1,8 @@ --- description: The Decentralized Identifiers (DID) standard from W3C is the fundamental standard that supports the concept of a decentralized digital identity. Explore the basic aspects of the DID standard. image: /img/identity/icon.png +teams: + - iotaledger/identity tags: - explanation - identity diff --git a/docs/content/iota-identity/explanations/verifiable-credentials.mdx b/docs/content/iota-identity/explanations/verifiable-credentials.mdx index 257e6864dc1..b2fa1039a13 100644 --- a/docs/content/iota-identity/explanations/verifiable-credentials.mdx +++ b/docs/content/iota-identity/explanations/verifiable-credentials.mdx @@ -1,6 +1,8 @@ --- description: Verifiable credentials are statements about the holder. They can be verified online or in person, and the holder decides who to share them with. image: /img/identity/icon.png +teams: + - iotaledger/identity tags: - explanation - identity diff --git a/docs/content/iota-identity/explanations/verifiable-presentations.mdx b/docs/content/iota-identity/explanations/verifiable-presentations.mdx index 5ae4bc6cb6e..61ad6f2d198 100644 --- a/docs/content/iota-identity/explanations/verifiable-presentations.mdx +++ b/docs/content/iota-identity/explanations/verifiable-presentations.mdx @@ -1,3 +1,13 @@ +--- +image: /img/identity/icon.png +teams: + - iotaledger/identity +tags: + - explanation + - identity + - verifiable-presentations +--- + # Verifiable Presentations A verifiable presentation is the recommended data format for sharing one or more [verifiable credentials](./verifiable-credentials.mdx). diff --git a/docs/content/iota-identity/getting-started/rust.mdx b/docs/content/iota-identity/getting-started/rust.mdx index d32f74a84e1..3017b52c125 100644 --- a/docs/content/iota-identity/getting-started/rust.mdx +++ b/docs/content/iota-identity/getting-started/rust.mdx @@ -2,6 +2,8 @@ sidebar_label: Rust description: Getting started with the IOTA Identity Rust Library. image: /img/identity/icon.png +teams: + - iotaledger/identity tags: - identity - rust diff --git a/docs/content/iota-identity/getting-started/universal-resolver.mdx b/docs/content/iota-identity/getting-started/universal-resolver.mdx index f8d03663456..5f96199e852 100644 --- a/docs/content/iota-identity/getting-started/universal-resolver.mdx +++ b/docs/content/iota-identity/getting-started/universal-resolver.mdx @@ -2,6 +2,8 @@ sidebar_label: Universal Resolver description: Getting started with the IOTA Universal Resolver. image: /img/identity/icon.png +teams: + - iotaledger/identity tags: - identity - did diff --git a/docs/content/iota-identity/how-tos/decentralized-identifiers/create.mdx b/docs/content/iota-identity/how-tos/decentralized-identifiers/create.mdx index 31d564cb870..9c1af5aaa91 100644 --- a/docs/content/iota-identity/how-tos/decentralized-identifiers/create.mdx +++ b/docs/content/iota-identity/how-tos/decentralized-identifiers/create.mdx @@ -3,6 +3,8 @@ title: Creating a Decentralized Identity sidebar_label: Create and Publish description: Create DID Documents and publish them to an IOTA network. image: /img/identity/icon.png +teams: + - iotaledger/identity tags: - how-to - identity diff --git a/docs/content/iota-identity/how-tos/decentralized-identifiers/delete.mdx b/docs/content/iota-identity/how-tos/decentralized-identifiers/delete.mdx index 9424433a6e4..91a89c2eecb 100644 --- a/docs/content/iota-identity/how-tos/decentralized-identifiers/delete.mdx +++ b/docs/content/iota-identity/how-tos/decentralized-identifiers/delete.mdx @@ -3,6 +3,8 @@ title: Delete an IOTA Identity sidebar_label: Delete description: How to deactivate or destroy an IOTA Identity image: /img/identity/icon.png +teams: + - iotaledger/identity tags: - how-to - identity diff --git a/docs/content/iota-identity/how-tos/decentralized-identifiers/resolve.mdx b/docs/content/iota-identity/how-tos/decentralized-identifiers/resolve.mdx index 3f5bb7a23dd..1ff503c02f5 100644 --- a/docs/content/iota-identity/how-tos/decentralized-identifiers/resolve.mdx +++ b/docs/content/iota-identity/how-tos/decentralized-identifiers/resolve.mdx @@ -3,6 +3,8 @@ title: Resolve an IOTA Identity sidebar_label: Resolve description: Explain how resolving works including arguments image: /img/identity/icon.png +teams: + - iotaledger/identity tags: - how-to - identity diff --git a/docs/content/iota-identity/how-tos/decentralized-identifiers/update.mdx b/docs/content/iota-identity/how-tos/decentralized-identifiers/update.mdx index e1c50866955..e044708ac3f 100644 --- a/docs/content/iota-identity/how-tos/decentralized-identifiers/update.mdx +++ b/docs/content/iota-identity/how-tos/decentralized-identifiers/update.mdx @@ -2,6 +2,8 @@ sidebar_label: Update description: How DID Documents can be manipulated and how updates should be published image: /img/identity/icon.png +teams: + - iotaledger/identity tags: - how-to - identity diff --git a/docs/content/iota-identity/how-tos/domain-linkage/create-and-verify.mdx b/docs/content/iota-identity/how-tos/domain-linkage/create-and-verify.mdx index 34b437cda69..79484a94a6b 100644 --- a/docs/content/iota-identity/how-tos/domain-linkage/create-and-verify.mdx +++ b/docs/content/iota-identity/how-tos/domain-linkage/create-and-verify.mdx @@ -2,6 +2,8 @@ description: How to link a domain and a DID sidebar_label: Create and Verify image: /img/identity/icon.png +teams: + - iotaledger/identity tags: - how-to - identity diff --git a/docs/content/iota-identity/how-tos/key-storage.mdx b/docs/content/iota-identity/how-tos/key-storage.mdx index 2116166089c..94d8c4cd4d4 100644 --- a/docs/content/iota-identity/how-tos/key-storage.mdx +++ b/docs/content/iota-identity/how-tos/key-storage.mdx @@ -3,6 +3,8 @@ title: Key Storage sidebar_label: Key Storage description: Explain the use of the storage interfaces and how they can be implemented image: /img/identity/icon.png +teams: + - iotaledger/identity tags: - how-to - identity diff --git a/docs/content/iota-identity/how-tos/verifiable-credentials/create.mdx b/docs/content/iota-identity/how-tos/verifiable-credentials/create.mdx index 3862af479cb..a44eb32b0ac 100644 --- a/docs/content/iota-identity/how-tos/verifiable-credentials/create.mdx +++ b/docs/content/iota-identity/how-tos/verifiable-credentials/create.mdx @@ -3,6 +3,8 @@ title: Create a Verifiable Credential sidebar_label: Create and Sign description: Explain how a VC is created and verified image: /img/identity/icon.png +teams: + - iotaledger/identity tags: - how-to - identity diff --git a/docs/content/iota-identity/how-tos/verifiable-credentials/revocation.mdx b/docs/content/iota-identity/how-tos/verifiable-credentials/revocation.mdx index 05e69cfdc62..1590d4a3b96 100644 --- a/docs/content/iota-identity/how-tos/verifiable-credentials/revocation.mdx +++ b/docs/content/iota-identity/how-tos/verifiable-credentials/revocation.mdx @@ -2,6 +2,8 @@ sidebar_label: Revoke description: Explain how a VC can be revoked image: /img/identity/icon.png +teams: + - iotaledger/identity tags: - how-to - identity diff --git a/docs/content/iota-identity/how-tos/verifiable-credentials/selective-disclosure.mdx b/docs/content/iota-identity/how-tos/verifiable-credentials/selective-disclosure.mdx index 9236270d117..a8c307a232f 100644 --- a/docs/content/iota-identity/how-tos/verifiable-credentials/selective-disclosure.mdx +++ b/docs/content/iota-identity/how-tos/verifiable-credentials/selective-disclosure.mdx @@ -2,6 +2,8 @@ sidebar_label: Selective Disclosure description: Explain VC with selective disclosure. image: /img/identity/icon.png +teams: + - iotaledger/identity tags: - how-to - identity diff --git a/docs/content/iota-identity/how-tos/verifiable-credentials/zero-knowledge-selective-disclosure.mdx b/docs/content/iota-identity/how-tos/verifiable-credentials/zero-knowledge-selective-disclosure.mdx index c18ceb0eac3..ffcf78ac1e7 100644 --- a/docs/content/iota-identity/how-tos/verifiable-credentials/zero-knowledge-selective-disclosure.mdx +++ b/docs/content/iota-identity/how-tos/verifiable-credentials/zero-knowledge-selective-disclosure.mdx @@ -2,6 +2,8 @@ sidebar_label: Zero Knowledge Selective Disclosure description: Zero Knowledge selectively disclosable VCs. image: /img/identity/icon.png +teams: + - iotaledger/identity tags: - how-to - identity diff --git a/docs/content/iota-identity/how-tos/verifiable-presentations/create-and-validate.mdx b/docs/content/iota-identity/how-tos/verifiable-presentations/create-and-validate.mdx index 7aff05427ca..17cb197a3c8 100644 --- a/docs/content/iota-identity/how-tos/verifiable-presentations/create-and-validate.mdx +++ b/docs/content/iota-identity/how-tos/verifiable-presentations/create-and-validate.mdx @@ -2,6 +2,8 @@ sidebar_label: Create and Validate description: Explain how a VP is created and verified image: /img/identity/icon.png +teams: + - iotaledger/identity tags: - how-to - identity diff --git a/docs/content/iota-identity/index.mdx b/docs/content/iota-identity/index.mdx index 80da6184998..7f573edae7f 100644 --- a/docs/content/iota-identity/index.mdx +++ b/docs/content/iota-identity/index.mdx @@ -1,6 +1,8 @@ --- description: The most important concepts that developers will need to know to utilize IOTA Identity to its full potential. image: /img/identity/icon.png +teams: + - iotaledger/identity tags: - reference - identity diff --git a/docs/content/operator/telemetry/iota-telemetry.mdx b/docs/content/operator/telemetry/iota-telemetry.mdx new file mode 100644 index 00000000000..55a09b7e819 --- /dev/null +++ b/docs/content/operator/telemetry/iota-telemetry.mdx @@ -0,0 +1,46 @@ +--- +title: Telemetry +description: Collects data from the node and sends it to Google Analytics for monitoring and analysis. +--- + +import Quiz from '@site/src/components/Quiz'; +import questions from '/json/node-operators/telemetry/iota-telemetry.json'; + +The `iota-telemetry` crate is used to collect data from a node, package it into structured events and send it to Google +Analytics (GA). It uses the GA4 Measurement Protocol, which allows backends to send custom event data to track node +performance and other metrics. +Access to the telemetry data is restricted to users with appropriate permissions in the GA account. + +## Constants + +The library defines following constants: +- `GA_API_SECRET`: The API secret for authenticating with GA. +- `GA_EVENT_NAME`: The name of the telemetry event being tracked. +- `GA_MEASUREMENT_ID`: The measurement ID for the GA property. +- `GA_URL`: The endpoint URL for sending data to GA. +- `HARDCODED_CLIENT_ID`: A hardcoded client ID required for the GA4 Measurement Protocol. +- `IPLOOKUP_URL`: The URL used to retrieve the node's public IP address. +- `UNKNOWN_STRING`: A fallback string used when data retrieval fails. + +## Data Types + +To organize the telemetry data that is to be sent: +- `TelemetryEvent`: Represents a single event with a name and a set of parameters. +- `TelemetryPayload`: Represents the payload to be sent, containing a client ID and a list of telemetry events. +- `IpResponse`: Represents the structure of the IP lookup service response. + +## Sending the Event + +The `send_telemetry_event` function collects the data from an `AuthorityState`. +It retrieves: +* The current git revision using `env!("CARGO_PKG_VERSION")`. +* The public IP address by calling the `get_ip` helper function. + * The `get_ip` function retrieves the node's public IP address by making a GET request to `https://api.ipify.org`. If the request fails, it returns the `UNKNOWN_STRING` constant. +* The chain identifier from the node state. +* The epoch time. + +After retrieving all data, `send_telemetry_event` constructs a `TelemetryEvent` and wraps it into +a `TelemetryPayload` type containing the hardcoded client ID. Then, the payload will be sent to GA as an HTTP POST request +with content type JSON, which can be visualized and analyzed in the GA dashboard. + + \ No newline at end of file diff --git a/docs/content/references/iota-identity/iota-did-method-spec.mdx b/docs/content/references/iota-identity/iota-did-method-spec.mdx index bdd13a83ac7..0866bf880ed 100644 --- a/docs/content/references/iota-identity/iota-did-method-spec.mdx +++ b/docs/content/references/iota-identity/iota-did-method-spec.mdx @@ -3,6 +3,8 @@ title: IOTA DID Method Specification v2.0 sidebar_label: DID Method description: How IOTA Identity implements the Decentralized Identifiers Standard on the IOTA Tangle. image: /img/identity/icon.png +teams: + - iotaledger/identity tags: - reference - identity diff --git a/docs/content/references/iota-identity/overview.mdx b/docs/content/references/iota-identity/overview.mdx index db1b1da3510..c36ba61d472 100644 --- a/docs/content/references/iota-identity/overview.mdx +++ b/docs/content/references/iota-identity/overview.mdx @@ -3,6 +3,8 @@ title: Specifications Overview sidebar_label: Overview description: Provide overview of the specifications image: /img/identity/icon.png +teams: + - iotaledger/identity tags: - reference - identity diff --git a/docs/content/references/iota-identity/revocation-bitmap-2022.mdx b/docs/content/references/iota-identity/revocation-bitmap-2022.mdx index 0a373d8c5b9..e36d285283a 100644 --- a/docs/content/references/iota-identity/revocation-bitmap-2022.mdx +++ b/docs/content/references/iota-identity/revocation-bitmap-2022.mdx @@ -3,6 +3,8 @@ title: Revocation Bitmap sidebar_label: Revocation Bitmap description: The specification for the embedded revocation bitmap. image: /img/identity/icon.png +teams: + - iotaledger/identity tags: - reference - identity diff --git a/docs/content/references/iota-identity/revocation-timeframe-2024.mdx b/docs/content/references/iota-identity/revocation-timeframe-2024.mdx index c4f7fb84ed7..55ec3ed3633 100644 --- a/docs/content/references/iota-identity/revocation-timeframe-2024.mdx +++ b/docs/content/references/iota-identity/revocation-timeframe-2024.mdx @@ -3,6 +3,8 @@ title: Revocation Timeframe 2024 sidebar_label: Revocation Timeframe 2024 description: The specification for an embeddable time-based revocation method - `RevocationTimeframe2024`. image: /img/identity/icon.png +teams: + - iotaledger/identity tags: - reference - identity diff --git a/docs/content/tags.yml b/docs/content/tags.yml index 98745dc2786..ec66644de6f 100644 --- a/docs/content/tags.yml +++ b/docs/content/tags.yml @@ -106,6 +106,10 @@ verifiable-credentials: label: Verifiable Credentials description: Verifiable Credentials. +verifiable-presentations: + label: Verifiable Presentations + description: Verifiable Presentations. + verification-method: label: Verification Method description: Verification Method. From ce7b44d0e1977dc32d9f206842757e7240867f87 Mon Sep 17 00:00:00 2001 From: muXxer Date: Wed, 29 Jan 2025 18:39:35 +0100 Subject: [PATCH 30/51] fix: json-rpc test `test_unstaking` by ignoring it (#5087) --- crates/iota-json-rpc-tests/tests/governance_api.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/crates/iota-json-rpc-tests/tests/governance_api.rs b/crates/iota-json-rpc-tests/tests/governance_api.rs index 1ff47a3aa86..056469e8e40 100644 --- a/crates/iota-json-rpc-tests/tests/governance_api.rs +++ b/crates/iota-json-rpc-tests/tests/governance_api.rs @@ -297,6 +297,7 @@ async fn test_staking() -> Result<(), anyhow::Error> { } #[sim_test] +#[ignore = "https://github.com/iotaledger/iota/issues/5085"] async fn test_unstaking() -> Result<(), anyhow::Error> { let cluster = TestClusterBuilder::new().build().await; From c9968467051d5ee11c9fec0bc11b2b46294b0e56 Mon Sep 17 00:00:00 2001 From: muXxer Date: Thu, 30 Jan 2025 10:03:56 +0100 Subject: [PATCH 31/51] cleanup: docs (#5054) * cleanup: docs * fix link * Update docs/content/about-iota/iota-architecture/iota-security.mdx Co-authored-by: Gino Osahon --------- Co-authored-by: Lucas Tortora Co-authored-by: Gino Osahon --- docs/content/about-iota/about-iota.mdx | 9 ++++----- .../iota-architecture/iota-architecture.mdx | 6 +++--- .../about-iota/iota-architecture/iota-security.mdx | 10 +++++----- .../iota-architecture/transaction-lifecycle.mdx | 10 +++++----- docs/content/about-iota/why-move.mdx | 8 ++++---- .../developer/getting-started/getting-started.mdx | 2 +- docs/content/operator/validator-committee.mdx | 12 ++++++------ docs/content/references/research-papers.mdx | 2 +- docs/site/src/pages/index.js | 2 +- 9 files changed, 30 insertions(+), 31 deletions(-) diff --git a/docs/content/about-iota/about-iota.mdx b/docs/content/about-iota/about-iota.mdx index 8909079db5a..ab9f139f9df 100644 --- a/docs/content/about-iota/about-iota.mdx +++ b/docs/content/about-iota/about-iota.mdx @@ -35,7 +35,7 @@ While the Move compiler catches many development mistakes, smart contracts can s -The [IOTA Mainnet](https://wiki.iota.org/build/networks-endpoints/#iota) processes production transaction blocks. The IOTA Mainnet's tokens have a real-world value, so we recommend that you use the IOTA Testnet or Devnet to develop your application. +The [IOTA Mainnet](https://wiki.iota.org/build/networks-endpoints/#iota) is the L1 "production" network of IOTA. The IOTA Mainnet's tokens have a real-world value, so we recommend that you use the IOTA Testnet or Devnet to develop your application. #### IOTA Testnet @@ -65,16 +65,15 @@ offers a fundamentally different approach at the L1 level. ### Networks -#### IOTA EVM and Shimmer EVM +#### IOTA EVM -IOTA EVM and Shimmer EVM are two distinct Layer 2 EVMs -running on top of the [IOTA Mainnet](./tokenomics/iota-token.mdx). +IOTA EVM is the distinct Layer 2 EVM running on top of the [IOTA Mainnet](./tokenomics/iota-token.mdx). #### IOTA EVM Testnet -IOTA EVM Testnet is the Layer 2 EVM running on top of the IOTA Testnet network. This network is subject to occasional resets (no data retention), usually announced with a one-week grace period. +IOTA EVM Testnet is the distinct Layer 2 EVM running on top of the IOTA Testnet network. This network is subject to occasional resets (no data retention), usually announced with a one-week grace period. ## IOTA Tokens diff --git a/docs/content/about-iota/iota-architecture/iota-architecture.mdx b/docs/content/about-iota/iota-architecture/iota-architecture.mdx index 0b8885cf916..cb0593c5a35 100644 --- a/docs/content/about-iota/iota-architecture/iota-architecture.mdx +++ b/docs/content/about-iota/iota-architecture/iota-architecture.mdx @@ -7,13 +7,13 @@ IOTA shares some similarities with other blockchains but is unique in many ways. ## Understand IOTA Security -Learn about the mechanisms available to secure on-chain assets, and the assurances IOTA provides regarding asset security. Understand IOTA Security explores the overall IOTA security architecture to ensure the asset types you design leverage IOTA to provide a secure experience for asset holders. +Learn about the mechanisms available to secure on-chain assets, and the assurances IOTA provides regarding asset security. "Understand IOTA Security" explores the overall IOTA security architecture, to ensure the asset types you design leverage IOTA to provide a secure experience for asset holders. Go to [Understand IOTA Security](iota-security.mdx). ## Life of a Transaction -Life of a Transaction details the transitions that all transactions on IOTA go through from creation to finality. This topic also explores some features of the blockchain (like epochs and checkpoints) that play a role in the life of a transaction. +"Life of a Transaction" details the transitions that all transactions on IOTA go through from creation to finality. This topic also explores some features of the blockchain (like epochs and checkpoints) that play a role in the life of a transaction. Go to [Life of a Transaction](transaction-lifecycle.mdx). @@ -26,7 +26,7 @@ Go to [Consensus](consensus.mdx). ## Protocol Upgrades -The IOTA protocol, framework, and execution engine are frequently extended to include new functionality and bug fixes. This functionality is added in the form of new code which is released to validator operators as part of our regular software releases. The IOTA protocol, however, requires that all IOTA validators agree about the results of executing each transaction. +The IOTA protocol, framework, and execution engine are frequently extended to include new functionality and bug fixes. This functionality is added in the form of new code which is released to validator operators as part of our regular software releases. The IOTA protocol, however, requires a supermajority of validators to agree on those protocol upgrades. Go to [Protocol Upgrades](protocol-upgrades.mdx). diff --git a/docs/content/about-iota/iota-architecture/iota-security.mdx b/docs/content/about-iota/iota-architecture/iota-security.mdx index f524ccf7030..fb3a3a36057 100644 --- a/docs/content/about-iota/iota-architecture/iota-security.mdx +++ b/docs/content/about-iota/iota-architecture/iota-security.mdx @@ -23,15 +23,15 @@ IOTA uses a delegated Proof-of-Stake (dPoS) mechanism to select validators (node ### Rewards for Validators and Stakers -Validators earn rewards from gas fees and share these rewards with users who staked their tokens to support them. If a validator performs poorly, both they and the users who supported them get lower rewards. Users' staked tokens are safe and can't be taken away by validators or anyone else. +Validators are incentivized through a constant inflation of 767,000 IOTA tokens per epoch. These tokens are distributed to validators and their delegators according to specific rules, such as the validator's commission rate and total stake. Transaction fees are burned and do not contribute to validator rewards. Users' staked tokens remain safe and cannot be taken away by validators or anyone else. ### Accountability and Rotation of Validators -Validators must be reliable and behave correctly, or they can be replaced. If validators try to censor transactions or act maliciously, they can be rotated out by the users. Users have a say in how the IOTA network evolves by choosing which validators to support and which protocol to follow. +Validators must be reliable and behave correctly, or they can be replaced. If validators try to censor transactions or act maliciously, they can be rotated out by the users. Users have a say in how the IOTA network evolves by choosing which validators to support and which protocol to follow via delegation to those validators. ## Addresses and Keys -To operate on any owned assets on IOTA, you need to hold the corresponding private key. You should keep the key private to guarantee no one can use your assets without your authorization. Even if all the validators agreed to misbehave, they could not access your assets without the private key. +To operate on any owned assets on IOTA, you need to hold the corresponding private key. You must keep your private key secret to ensure no one can use your assets without your authorization. Even if all validators agree to misbehave, they cannot access your assets without your private key. Your private key matches a single public address on the IOTA network. You can create any number of addresses on IOTA, each with its own private key. Keep in mind that addresses don't require prior registration; sending any asset to an address will create said address. Since once a transaction reaches finality, it is irreversible; you should always check the recipient address for your transactions. @@ -47,7 +47,7 @@ Move allows for shared assets. Although these shared assets are public in princi ### Certification and Finalization -When you submit a transaction in IOTA, all the validators must agree that it's valid. Once they agree, they create a _certificate_ to confirm its validity, and this _certificate_ must also be shared with all validators. Even if some validators don't follow the rules, the transaction can still be finalized by the majority of validators who do follow the IOTA protocol. This process uses cryptographic methods to ensure that validators who don't follow the rules can't trick the system into accepting false information and that misbehaving validators can't stop the system from processing transactions. +When you submit a transaction in IOTA, the validators must agree that it's valid. Once they agree, they create a _certificate_ to confirm its validity, and this _certificate_ must also be shared with all validators. Even if some validators don't follow the rules, the transaction can still be finalized by the supermajority of validators who do follow the IOTA protocol. This process uses cryptographic methods to ensure that validators who don't follow the rules can't trick the system into accepting false information and that misbehaving validators can't stop the system from processing transactions. ### Gas and Transaction Execution @@ -61,7 +61,7 @@ Users can submit transactions themselves or use third-party services to help. Th ### Reading Assets and Transaction History -IOTA validators allow users to see all the assets they hold and the history of transactions that created those assets. Validators provide cryptographic proof of every transaction that led to the current state of an asset. You can request this proof and verify it to ensure all transactions were correctly processed and agreed upon by the validators. Services that mirror the state of validators perform these checks regularly to ensure everything is correct. +IOTA full nodes allow users to see all the assets they hold and the history of transactions that created those assets. Validators provide cryptographic proof of every transaction that led to the current state of an asset. You can request this proof from full nodes and verify it to ensure all transactions were correctly processed and agreed upon by the validators. Services that mirror the state of validators perform these checks regularly to ensure everything is correct. ### Public Auditability diff --git a/docs/content/about-iota/iota-architecture/transaction-lifecycle.mdx b/docs/content/about-iota/iota-architecture/transaction-lifecycle.mdx index 599dff115f7..2ba86b3ab87 100644 --- a/docs/content/about-iota/iota-architecture/transaction-lifecycle.mdx +++ b/docs/content/about-iota/iota-architecture/transaction-lifecycle.mdx @@ -18,11 +18,11 @@ import ThemedImage from '@theme/ThemedImage'; 2. **Submit to Validators**: The IOTA protocol sends the transaction to every validator. The validators validate the transaction. If valid, the validators sign it and return the signed transaction to the client. -3. **Form a Transaction Certificate**: After collecting responses from a supermajority of validators, the client can form a transaction _certificate_. Unlike consensus-based blockchains, IOTA validators are not burdened by needing to propagate signatures or aggregate _certificate_s; this is the responsibility of the client or gateway. +3. **Form a Transaction Certificate**: After collecting responses from a supermajority of validators, the client can form a transaction _certificate_. Unlike consensus-based blockchains, IOTA validators are not burdened by needing to propagate signatures or aggregate _certificates_; this is the responsibility of the client or gateway. -4. **Send the Certificate**: The client sends the assembled _certificate_ back to all validators. The validators check its validity and acknowledge receipt. If the transaction involves only owned objects, IOTA can process and execute it immediately without waiting for consensus (**fast path consensus**). All _certificate_s are forwarded to the IOTA DAG-based consensus protocol. +4. **Send the Certificate**: The client sends the assembled _certificate_ back to all validators. The validators check its validity and acknowledge receipt. If the transaction involves only owned objects, IOTA can process and execute it immediately without waiting for consensus (**fast path consensus**). All _certificates_ are forwarded to the IOTA DAG-based consensus protocol. -5. **Consensus and Execution**: The IOTA DAG-based consensus protocol eventually produces a total order of _certificate_s. Validators check and execute _certificate_s that involve shared objects. +5. **Consensus and Execution**: The IOTA DAG-based consensus protocol eventually produces a total order of _certificates_. Validators check and execute _certificates_ that involve shared objects. 6. **Effect Certificate**: Clients can gather responses from a supermajority of validators, assemble them into an effect _certificate_, and use it as proof that the transaction is settled. @@ -42,7 +42,7 @@ Your wallet app sends the signed transaction to a full node, which then broadcas ### Transaction Certification -Validators receive the transaction from the full node. They check if it's valid and lock the involved objects to prevent double-spending. After validation, they send their signature back to the full node. When the full node collects enough validator signatures (a quorum), it creates a transaction _certificate_, which includes the transaction and the validator signatures. +Validators receive the transaction from the full node. They check if it's valid and lock the involved "owned objects" to prevent double-spending. After validation, they send their signature back to the full node. When the full node collects enough validator signatures (a quorum), it creates a transaction _certificate_, which includes the transaction and the validator signatures. ### Transaction Finalization @@ -65,7 +65,7 @@ After submission to a full node, the certification process begins. The full node * All shared input objects in the transaction exist. * The gas payment is sufficient. -If these checks pass, the validator locks the input objects to the transaction, preventing double-spending, and proceeds to sign the transaction and returns the signature to the node. The node needs signatures from a majority of validators to certify the transaction. +If these checks pass, the validator locks the input objects to the transaction, preventing double-spending, and proceeds to sign the transaction and returns the signature to the node. The node needs signatures from a supermajority of validators to certify the transaction. The full node collects these signatures in parallel to speed up the process. Once it has enough signatures (a quorum), the transaction is certified, forming a **transaction _certificate_**. diff --git a/docs/content/about-iota/why-move.mdx b/docs/content/about-iota/why-move.mdx index 9b675a6f2b5..3357911d5bd 100644 --- a/docs/content/about-iota/why-move.mdx +++ b/docs/content/about-iota/why-move.mdx @@ -4,16 +4,16 @@ title: Why Move? While EVM/Solidity is the most famous smart contracts platform, it has some downsides that IOTA Move aims to address: - - **Performance, scaling, and cost**: EVM builds on top of a global shared state, which is practical but doesn't scale well. This results in limitations in throughput, which is directly reflected in the fees you must pay to interact with these networks. The more congested the network, the more expensive it gets. This is worked around with additional extra execution layers (L2s on top of L1s) or rollup solutions, which also have downsides and limitations. + - **Performance, scaling, and cost**: EVM builds on top of a global shared state, which is practical but doesn't scale well. This results in limitations in throughput, which is directly reflected in the fees you must pay to interact with these networks. The more congested the network, the more expensive it gets. Other blockchains try to mitigate this with additional extra execution layers (L2s on top of L1s) or rollup solutions, which also have downsides and limitations. - **Security:** As the first well-used smart contract language, Solidity did not have much to go by in terms of learnings around secure practices (there was no existing ecosystem yet), and it had to develop over the years with that legacy and backward compatibility in mind. Many of the issues from the past have been mitigated with workarounds. Still, given the nature of things, there are some limitations and annoyances we currently can't get around, like the security issues it has with both the code and infamous design patterns like the `approve()` method in the ERC standards. - - **Tokens:** Assets like ERC20 tokens and ERC721/1155 NFTs are not part of the EVM and are purely standards for smart contracts deployed on an EVM chain interpreted as tokens by clients. While this works and allows much flexibility, it also has its downsides. Due to the nature of tokens being contracts and the state of your balance being stored with those contracts, it's not trivial to find all tokens in your account without knowing all token contract addresses and manually adding them, unlike the Ethereum balance itself, which is a different kind of token which can be found directly but works differently over an ERC20 token. This makes discovering your assets difficult and adds additional complexity to applications to close the gap between the native asset (ETH) and ERC20 tokens with workarounds like wrapped tokens, which is not ideal. + - **Tokens:** Assets like ERC20 tokens and ERC721/1155 NFTs are not part of the EVM and are purely standards for smart contracts deployed on an EVM chain interpreted as tokens by clients. While this works and allows much flexibility, it also has its downsides. Due to the nature of tokens being contracts and the state of your balance being stored within those contracts, it's not trivial to find all tokens in your account without knowing all token contract addresses and manually adding them, unlike the Ethereum balance itself, which is a different kind of token which can be found directly but works differently over an ERC20 token. This makes discovering your assets difficult and adds additional complexity to applications to close the gap between the native asset (ETH) and ERC20 tokens with workarounds like wrapped tokens, which is not ideal. - **Developer experience:** Solidity offers a wealth of developer tools and resources, including various libraries and frameworks to choose from, as well as extensive documentation and tutorials. The language, influenced by popular languages like C++ and JavaScript, is easy to learn and get started with. However, Solidity's lack of strictness allows for mistakes that the compiler may not catch, leading to bugs and security issues that are difficult to identify and resolve. Consequently, the developer experience suffers, and the language itself is not as safe to work with as it could be. IOTA Move is here to learn from these downsides and come up with a better alternative addressing these issues: * **Performance, scaling, and cost:** Given that IOTA Move is based on the object model (similar to UTXO's) and not a globally shared state, transactions can be executed in parallel, resulting in a much higher (potential) throughput over a traditional blockchain with shared state. This results in a lot less congestion and, thus, lower fees on an actively used network. -* **Security:** Move was designed with security in mind. The language itself is based on Rust and is very strict regarding its typing system. You really have to try to make a mistake that the compiler won't catch before deploying. There's no such thing as re-entry, and given the object-based approach of Move, Assets residing in your account can't be touched at all by the smart contract itself without access to your account keys. -* **Tokens:** In IOTA Move, there is no difference between the IOTA token (`Coin`) and a custom token (`Coin`), not in terms of use or implementation. These objects reside in your own account and can thus easily be found without needing to know a Smart Contract address (this goes for any other type of owned object as well). There's no strange `approve()` functionality, and you keep control over your own owned assets. +* **Security:** Move was designed with security in mind. The language itself is based on Rust and is very strict regarding its typing system. The Move compiler is designed to catch many common programming errors, such as type mismatches, resource misuse, and violations of ownership or borrowing rules, before deployment. This helps ensure safety and correctness without relying solely on runtime checks. There's no such thing as re-entry, and given the object-based approach of Move, Assets residing in your account can't be touched at all by the smart contract itself without access to your account keys. +* **Tokens:** In IOTA Move, there is no difference between the IOTA token (`Coin`) and a custom token (`Coin`), not in terms of use or implementation, except that the IOTA token can be used for gas payments. These objects reside in your own account and can thus easily be found without needing to know a Smart Contract address (this goes for any other type of owned object as well). There's no strange `approve()` functionality, and you keep control over your own owned assets. * **Developer Experience:** While Move is more challenging to get started with compared to Solidity due to its novelty and less mature developer tooling, the safety of the language and the ease of finding and resolving issues in your code make up for that. With Move, it's not so scary anymore to write complex logic from scratch, given most mistakes (apart from obvious implementation logic, doing things 'as intended') are caught directly by the compiler. This allows for more innovation, fewer value-destroying bugs, and a more excellent developer experience, fueling the next generation of smart contracts. diff --git a/docs/content/developer/getting-started/getting-started.mdx b/docs/content/developer/getting-started/getting-started.mdx index ae2bdb4fff8..aa53ea6edba 100644 --- a/docs/content/developer/getting-started/getting-started.mdx +++ b/docs/content/developer/getting-started/getting-started.mdx @@ -10,7 +10,7 @@ tags: # Getting Started IOTA Rebased introduces layer 1 Move smart contracts to the IOTA ecosystem. This valuable addition enhances IOTA by -offering programmability on layer 1, complementing [IOTA EVM](../../about-iota/about-iota.mdx#iota-evm-and-shimmer-evm) on layer 2. +offering programmability on layer 1, complementing [IOTA EVM](../../about-iota/about-iota.mdx#iota-evm) on layer 2. The guides in this section will guide you as you start your IOTA Rebased journey. We recommend that you start by [setting up your development environment](iota-environment.mdx), and then move on diff --git a/docs/content/operator/validator-committee.mdx b/docs/content/operator/validator-committee.mdx index 85920009733..8a5e839f79e 100644 --- a/docs/content/operator/validator-committee.mdx +++ b/docs/content/operator/validator-committee.mdx @@ -1,6 +1,6 @@ --- title: Validator Committee -description: IOTA has a committee of validators to verify on-chain transactions. Epochs, quorums, transactions, _certificate_s, and consensus are touch points for this committee. +description: IOTA has a committee of validators to verify on-chain transactions. Epochs, quorums, transactions, _certificates_, and consensus are touch points for this committee. --- import Quiz from '@site/src/components/Quiz'; @@ -20,11 +20,11 @@ Operation of the IOTA network is temporally partitioned into non-overlapping, ap A quorum is a set of validators whose combined voting power is greater than two-thirds (>2/3) of the total during a particular epoch. For example, in an IOTA instance operated by four validators that all have the same voting power, any group containing three validators is a quorum. -The quorum size of >2/3 ensures Byzantine fault tolerance (BFT). A validator commits a transaction (durably store the transaction and update its internal state with the effects of the transaction) only if it is accompanied by cryptographic signatures from a quorum. IOTA calls the combination of the transaction and the quorum signatures on its bytes a _certificate_. The policy of committing only _certificate_s ensures Byzantine fault tolerance: if >2/3 of the validators faithfully follow the protocol, they are guaranteed to eventually agree on both the set of committed _certificate_s and their effects. +The quorum size of >2/3 ensures Byzantine fault tolerance (BFT). A validator commits a transaction (durably store the transaction and update its internal state with the effects of the transaction) only if it is accompanied by cryptographic signatures from a quorum. IOTA calls the combination of the transaction and the quorum signatures on its bytes a _certificate_. The policy of committing only _certificates_ ensures Byzantine fault tolerance: if >2/3 of the validators faithfully follow the protocol, they are guaranteed to eventually agree on both the set of committed _certificates_ and their effects. ## Write requests -A validator can handle two types of write requests: transactions and _certificate_s. At a high level, a client: +A validator can handle two types of write requests: transactions and _certificates_. At a high level, a client: - Communicates a transaction to a quorum of validators to collect the signatures required to form a _certificate_. - Submits a _certificate_ to a validator to commit state changes on that validator. @@ -33,7 +33,7 @@ A validator can handle two types of write requests: transactions and _certificat When a validator receives a transaction from a client, it first performs transaction validity checks (validity of the sender's signature). If the checks pass, the validator locks all owned-objects and signs the transaction bytes, then returns the signature to the client. The client repeats this process with multiple validators until it has collected signatures on its transaction from a quorum, thereby forming a _certificate_. -The process of collecting validator signatures on a transaction into a _certificate_ and the process of submitting _certificate_s can be performed in parallel. The client can simultaneously multicast transactions/_certificate_s to an arbitrary number of validators. Alternatively, a client can outsource either or both of these tasks to a third-party service provider. This provider must be trusted for liveness (it can refuse to form a _certificate_), but not for safety (it cannot change the effects of the transaction, and does not need the user's secret key). +The process of collecting validator signatures on a transaction into a _certificate_ and the process of submitting _certificates_ can be performed in parallel. The client can simultaneously multicast transactions/_certificates_ to an arbitrary number of validators. Alternatively, a client can outsource either or both of these tasks to a third-party service provider. This provider must be trusted for liveness (it can refuse to form a _certificate_), but not for safety (it cannot change the effects of the transaction, and does not need the user's secret key). ### Certificates @@ -50,8 +50,8 @@ Narwhal enables the parallel ordering of transactions into batches that are coll - N/B operates in OX, rather than XO mode (O = order, X = execute); the execution occurs after the Narwhal/Bullshark ordering. - The output of N/B is therefore a sequence of transactions, with interdependencies stored in the transaction data itself. -Consensus sequences _certificate_s of transactions. These represent transactions that have already been presented to 2/3 of validators that checked that all their owned objects are available to be operated on and signed the transaction. Upon a _certificate_ being sequenced, IOTA sets the lock of the shared objects at the next available version to map to the execution of that _certificate_. So for example if you have a shared object X at version 2, and you sequence _certificate_ T, IOTA stores T -> [(X, 2)]. That is all you do when IOTA reaches consensus, and as a result IOTA can ingest a lot of sequenced transactions. +Consensus sequences _certificates_ of transactions. These represent transactions that have already been presented to 2/3 of validators that checked that all their owned objects are available to be operated on and signed the transaction. Upon a _certificate_ being sequenced, IOTA sets the lock of the shared objects at the next available version to map to the execution of that _certificate_. So for example if you have a shared object X at version 2, and you sequence _certificate_ T, IOTA stores T -> [(X, 2)]. That is all you do when IOTA reaches consensus, and as a result IOTA can ingest a lot of sequenced transactions. -Now, after this is done IOTA can execute all _certificate_s that have their locks set, on one or multiple cores. Obviously, transactions for earlier versions of objects need to be processed first (causally), and that reduces the degree of concurrency. The read and write set of the transaction can be statically determined from its versioned object inputs--execution can only read/write an object that was an input to the transaction, or that was created by the transaction. +Now, after this is done IOTA can execute all _certificates_ that have their locks set, on one or multiple cores. Obviously, transactions for earlier versions of objects need to be processed first (causally), and that reduces the degree of concurrency. The read and write set of the transaction can be statically determined from its versioned object inputs--execution can only read/write an object that was an input to the transaction, or that was created by the transaction. diff --git a/docs/content/references/research-papers.mdx b/docs/content/references/research-papers.mdx index 53ca90d660e..95a00bc5df1 100644 --- a/docs/content/references/research-papers.mdx +++ b/docs/content/references/research-papers.mdx @@ -42,7 +42,7 @@ This document contains a list of research papers that are relevant to IOTA. to add strong privacy to FastPay transactions (but IOTA does not plan to do this). - **Summary:** We introduce Zef, the first Byzantine-Fault Tolerant (BFT) protocol to support payments in anonymous digital coins at arbitrary scale. Zef follows the communication and security model of FastPay: both protocols are asynchronous, low-latency, linearly-scalable, and powered by partially-trusted - sharded validators. Zef further introduces opaque coins represented as off-chain _certificate_s that are bound to user accounts. In order to hide the face + sharded validators. Zef further introduces opaque coins represented as off-chain _certificates_ that are bound to user accounts. In order to hide the face values of coins when a payment operation consumes or creates them, Zef uses random commitments and NIZK proofs. Created coins are made unlinkable using the blind and randomizable threshold anonymous credentials of [Coconut](https://arxiv.org/pdf/1802.07344.pdf). To control storage costs associated with coin replay prevention, Zef accounts are designed so that data can be safely removed once an account is deactivated. Besides the specifications and a detailed diff --git a/docs/site/src/pages/index.js b/docs/site/src/pages/index.js index bf59252a2f7..3c513ab8ef2 100644 --- a/docs/site/src/pages/index.js +++ b/docs/site/src/pages/index.js @@ -63,7 +63,7 @@ export default function Home() { style={{ fontSize: "16px" }} > Discover the power of IOTA through examples, guides, and - explanations/ + explanations. Date: Thu, 30 Jan 2025 10:12:02 +0100 Subject: [PATCH 32/51] feat(wallet-dashboard): Integrate Amplitude (#4930) * feat(dashboard): Integrate Amplitude * manypkg * prettier fix dashboard * missing header * feat(dashboard): create prependLicense file in dashboard * fix(explorer): update paths to pull amplitude in explorer scripts --------- Co-authored-by: cpl121 --- apps/wallet-dashboard/ampli.json | 14 ++ apps/wallet-dashboard/app/layout.tsx | 2 + .../wallet-dashboard/components/Amplitude.tsx | 24 ++ apps/wallet-dashboard/components/index.ts | 1 + .../lib/utils/analytics/ampli/index.ts | 221 ++++++++++++++++++ .../lib/utils/analytics/amplitude.ts | 32 +++ .../lib/utils/analytics/index.ts | 5 + apps/wallet-dashboard/package.json | 7 +- apps/wallet-dashboard/prependlicense.mjs | 15 ++ pnpm-lock.yaml | 9 + 10 files changed, 329 insertions(+), 1 deletion(-) create mode 100644 apps/wallet-dashboard/ampli.json create mode 100644 apps/wallet-dashboard/components/Amplitude.tsx create mode 100644 apps/wallet-dashboard/lib/utils/analytics/ampli/index.ts create mode 100644 apps/wallet-dashboard/lib/utils/analytics/amplitude.ts create mode 100644 apps/wallet-dashboard/lib/utils/analytics/index.ts create mode 100644 apps/wallet-dashboard/prependlicense.mjs diff --git a/apps/wallet-dashboard/ampli.json b/apps/wallet-dashboard/ampli.json new file mode 100644 index 00000000000..4259ab540a1 --- /dev/null +++ b/apps/wallet-dashboard/ampli.json @@ -0,0 +1,14 @@ +{ + "Zone": "eu", + "OrgId": "100007351", + "WorkspaceId": "72fb85fc-aed9-46ef-83a2-9345888a1678", + "SourceId": "ca44ad20-3cfd-4618-aa11-4b8befb0b123", + "Branch": "main", + "Version": "1.0.0", + "VersionId": "954386e3-441d-4aa5-b9ad-1f01e0a20e55", + "Runtime": "browser:typescript-ampli-v2", + "Platform": "Browser", + "Language": "TypeScript", + "SDK": "@amplitude/analytics-browser@^1.0", + "Path": "./lib/utils/analytics/ampli" +} diff --git a/apps/wallet-dashboard/app/layout.tsx b/apps/wallet-dashboard/app/layout.tsx index e0116301147..700384ad60b 100644 --- a/apps/wallet-dashboard/app/layout.tsx +++ b/apps/wallet-dashboard/app/layout.tsx @@ -8,6 +8,7 @@ import { Metadata } from 'next'; import { AppProviders } from '@/providers'; import { FontLinks } from '@/components/FontLinks'; import { ConnectionGuard } from '@/components/connection-guard'; +import { Amplitude } from '@/components/Amplitude'; const inter = Inter({ subsets: ['latin'] }); @@ -26,6 +27,7 @@ export default function RootLayout({ + {children} diff --git a/apps/wallet-dashboard/components/Amplitude.tsx b/apps/wallet-dashboard/components/Amplitude.tsx new file mode 100644 index 00000000000..ca755764e07 --- /dev/null +++ b/apps/wallet-dashboard/components/Amplitude.tsx @@ -0,0 +1,24 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +'use client'; + +import { ampli, initAmplitude } from '@/lib/utils/analytics'; +import { useEffect } from 'react'; + +async function load() { + await initAmplitude(); + await ampli.openedWalletDashboard({ + pagePath: location.pathname, + pagePathFragment: `${location.pathname}${location.search}${location.hash}`, + walletDashboardRev: process.env.NEXT_PUBLIC_DASHBOARD_REV, + }); +} + +export function Amplitude() { + useEffect(() => { + load(); + }, []); + + return null; +} diff --git a/apps/wallet-dashboard/components/index.ts b/apps/wallet-dashboard/components/index.ts index 0a713ba5fb6..df7ea35e135 100644 --- a/apps/wallet-dashboard/components/index.ts +++ b/apps/wallet-dashboard/components/index.ts @@ -9,6 +9,7 @@ export * from './VirtualList'; export * from './ExternalImage'; export * from './PageSizeSelector'; export * from './PaginationOptions'; +export * from './Amplitude'; export * from './account-balance/AccountBalance'; export * from './coins'; diff --git a/apps/wallet-dashboard/lib/utils/analytics/ampli/index.ts b/apps/wallet-dashboard/lib/utils/analytics/ampli/index.ts new file mode 100644 index 00000000000..b5e49236573 --- /dev/null +++ b/apps/wallet-dashboard/lib/utils/analytics/ampli/index.ts @@ -0,0 +1,221 @@ +/* tslint:disable */ +/* eslint-disable */ +// @ts-nocheck +/** + * Ampli - A strong typed wrapper for your Analytics + * + * This file is generated by Amplitude. + * To update run 'ampli pull web' + * + * Required dependencies: @amplitude/analytics-browser@^1.3.0 + * Tracking Plan Version: 1 + * Build: 1.0.0 + * Runtime: browser:typescript-ampli-v2 + * + * [View Tracking Plan](https://data.eu.amplitude.com/iota-foundation/IOTA%20Wallet%20Dashboard/events/main/latest) + * + * [Full Setup Instructions](https://data.eu.amplitude.com/iota-foundation/IOTA%20Wallet%20Dashboard/implementation/web) + */ + +import * as amplitude from '@amplitude/analytics-browser'; + +export type Environment = 'iotawalletdashboard'; + +export const ApiKey: Record = { + iotawalletdashboard: '4d570cb7dc58e267349bde33f7b8bdeb', +}; + +/** + * Default Amplitude configuration options. Contains tracking plan information. + */ +export const DefaultConfiguration: BrowserOptions = { + plan: { + version: '1', + branch: 'main', + source: 'web', + versionId: '954386e3-441d-4aa5-b9ad-1f01e0a20e55', + }, + ...{ + ingestionMetadata: { + sourceName: 'browser-typescript-ampli', + sourceVersion: '2.0.0', + }, + }, + serverZone: amplitude.Types.ServerZone.EU, +}; + +export interface LoadOptionsBase { + disabled?: boolean; +} + +export type LoadOptionsWithEnvironment = LoadOptionsBase & { + environment: Environment; + client?: { configuration?: BrowserOptions }; +}; +export type LoadOptionsWithApiKey = LoadOptionsBase & { + client: { apiKey: string; configuration?: BrowserOptions }; +}; +export type LoadOptionsWithClientInstance = LoadOptionsBase & { + client: { instance: BrowserClient }; +}; + +export type LoadOptions = + | LoadOptionsWithEnvironment + | LoadOptionsWithApiKey + | LoadOptionsWithClientInstance; + +export interface OpenedWalletDashboardProperties { + activeNetwork?: string; + activeOrigin?: string; + pagePath?: string; + pagePathFragment?: string; + walletDashboardRev?: string; +} + +export class OpenedWalletDashboard implements BaseEvent { + event_type = 'Opened wallet dashboard'; + + constructor(public event_properties?: OpenedWalletDashboardProperties) { + this.event_properties = event_properties; + } +} + +export type PromiseResult = { promise: Promise }; + +const getVoidPromiseResult = () => ({ promise: Promise.resolve() }); + +// prettier-ignore +export class Ampli { + private disabled: boolean = false; + private amplitude?: BrowserClient; + + get client(): BrowserClient { + this.isInitializedAndEnabled(); + return this.amplitude!; + } + + get isLoaded(): boolean { + return this.amplitude != null; + } + + private isInitializedAndEnabled(): boolean { + if (!this.amplitude) { + console.error('ERROR: Ampli is not yet initialized. Have you called ampli.load() on app start?'); + return false; + } + return !this.disabled; + } + + /** + * Initialize the Ampli SDK. Call once when your application starts. + * + * @param options Configuration options to initialize the Ampli SDK with. + */ + load(options: LoadOptions): PromiseResult { + this.disabled = options.disabled ?? false; + + if (this.amplitude) { + console.warn('WARNING: Ampli is already intialized. Ampli.load() should be called once at application startup.'); + return getVoidPromiseResult(); + } + + let apiKey: string | null = null; + if (options.client && 'apiKey' in options.client) { + apiKey = options.client.apiKey; + } else if ('environment' in options) { + apiKey = ApiKey[options.environment]; + } + + if (options.client && 'instance' in options.client) { + this.amplitude = options.client.instance; + } else if (apiKey) { + this.amplitude = amplitude.createInstance(); + const configuration = (options.client && 'configuration' in options.client) ? options.client.configuration : {}; + return this.amplitude.init(apiKey, undefined, { ...DefaultConfiguration, ...configuration }); + } else { + console.error("ERROR: ampli.load() requires 'environment', 'client.apiKey', or 'client.instance'"); + } + + return getVoidPromiseResult(); + } + + /** + * Identify a user and set user properties. + * + * @param userId The user's id. + * @param options Optional event options. + */ + identify( + userId: string | undefined, + options?: EventOptions, + ): PromiseResult { + if (!this.isInitializedAndEnabled()) { + return getVoidPromiseResult(); + } + + if (userId) { + options = {...options, user_id: userId}; + } + + const amplitudeIdentify = new amplitude.Identify(); + return this.amplitude!.identify( + amplitudeIdentify, + options, + ); + } + + /** + * Flush the event. + */ + flush() : PromiseResult { + if (!this.isInitializedAndEnabled()) { + return getVoidPromiseResult(); + } + + return this.amplitude!.flush(); + } + + /** + * Track event + * + * @param event The event to track. + * @param options Optional event options. + */ + track(event: Event, options?: EventOptions): PromiseResult { + if (!this.isInitializedAndEnabled()) { + return getVoidPromiseResult(); + } + + return this.amplitude!.track(event, undefined, options); + } + + /** + * Opened wallet dashboard + * + * [View in Tracking Plan](https://data.eu.amplitude.com/iota-foundation/IOTA%20Wallet%20Dashboard/events/main/latest/Opened%20wallet%20dashboard) + * + * Event has no description in tracking plan. + * + * @param properties The event's properties (e.g. activeNetwork) + * @param options Amplitude event options. + */ + openedWalletDashboard( + properties?: OpenedWalletDashboardProperties, + options?: EventOptions, + ) { + return this.track(new OpenedWalletDashboard(properties), options); + } +} + +export const ampli = new Ampli(); + +// BASE TYPES +type BrowserOptions = amplitude.Types.BrowserOptions; + +export type BrowserClient = amplitude.Types.BrowserClient; +export type BaseEvent = amplitude.Types.BaseEvent; +export type IdentifyEvent = amplitude.Types.IdentifyEvent; +export type GroupEvent = amplitude.Types.GroupIdentifyEvent; +export type Event = amplitude.Types.Event; +export type EventOptions = amplitude.Types.EventOptions; +export type Result = amplitude.Types.Result; diff --git a/apps/wallet-dashboard/lib/utils/analytics/amplitude.ts b/apps/wallet-dashboard/lib/utils/analytics/amplitude.ts new file mode 100644 index 00000000000..8c469b8d487 --- /dev/null +++ b/apps/wallet-dashboard/lib/utils/analytics/amplitude.ts @@ -0,0 +1,32 @@ +// Copyright (c) Mysten Labs, Inc. +// Modifications Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +import * as amplitude from '@amplitude/analytics-browser'; +import { LogLevel, TransportType, type UserSession } from '@amplitude/analytics-types'; +import { PersistableStorage } from '@iota/core'; + +import { ampli } from './ampli'; + +const IS_PROD_ENV = process.env.NODE_ENV == 'production'; + +export const persistableStorage = new PersistableStorage(); + +export async function initAmplitude() { + await ampli.load({ + environment: 'iotawalletdashboard', + // Flip this if you'd like to test Amplitude locally + disabled: !IS_PROD_ENV, + client: { + configuration: { + cookieStorage: persistableStorage, + logLevel: IS_PROD_ENV ? LogLevel.Warn : amplitude.Types.LogLevel.Debug, + }, + }, + }); + + window.addEventListener('pagehide', () => { + amplitude.setTransport(TransportType.SendBeacon); + amplitude.flush(); + }); +} diff --git a/apps/wallet-dashboard/lib/utils/analytics/index.ts b/apps/wallet-dashboard/lib/utils/analytics/index.ts new file mode 100644 index 00000000000..acd6e17220e --- /dev/null +++ b/apps/wallet-dashboard/lib/utils/analytics/index.ts @@ -0,0 +1,5 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +export * from './ampli'; +export * from './amplitude'; diff --git a/apps/wallet-dashboard/package.json b/apps/wallet-dashboard/package.json index eb0d2f527c7..1df2714d2bf 100644 --- a/apps/wallet-dashboard/package.json +++ b/apps/wallet-dashboard/package.json @@ -9,12 +9,16 @@ "lint": "next lint && pnpm run prettier:check", "prettier:check": "prettier -c --ignore-unknown --ignore-path=../../.prettierignore --ignore-path=.prettierignore .", "prettier:fix": "prettier -w --ignore-unknown --ignore-path=../../.prettierignore --ignore-path=.prettierignore .", - "test": "jest" + "test": "jest", + "ampli": "ampli", + "pull-amplitude": "ampli pull web && node prependLicense.mjs && prettier -w ampli.json lib/utils/analytics/ampli/index.ts" }, "engines": { "node": ">= 20" }, "dependencies": { + "@amplitude/analytics-browser": "^1.10.3", + "@amplitude/analytics-types": "^0.20.0", "@growthbook/growthbook": "^1.0.0", "@growthbook/growthbook-react": "^1.0.0", "@iota/apps-ui-icons": "workspace:*", @@ -34,6 +38,7 @@ "zustand": "^4.4.1" }, "devDependencies": { + "@amplitude/ampli": "^1.31.5", "@tanstack/react-query-devtools": "^5.58.0", "@types/jest": "^29.5.2", "@types/node": "^20.14.10", diff --git a/apps/wallet-dashboard/prependlicense.mjs b/apps/wallet-dashboard/prependlicense.mjs new file mode 100644 index 00000000000..ae707b763f6 --- /dev/null +++ b/apps/wallet-dashboard/prependlicense.mjs @@ -0,0 +1,15 @@ +// Copyright (c) Mysten Labs, Inc. +// Modifications Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +import { readFile, writeFile } from 'fs/promises'; + +const LICENSE = + '// Copyright (c) Mysten Labs, Inc.\n// Modifications Copyright (c) 2024 IOTA Stiftung\n// SPDX-License-Identifier: Apache-2.0\n\n'; + +async function prependLicense(filename) { + const content = await readFile(filename, 'utf8'); + writeFile(filename, LICENSE + content); +} + +prependLicense('lib/utils/analytics/ampli/index.ts'); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index be805271ad3..362e437bc40 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1013,6 +1013,12 @@ importers: apps/wallet-dashboard: dependencies: + '@amplitude/analytics-browser': + specifier: ^1.10.3 + version: 1.13.6 + '@amplitude/analytics-types': + specifier: ^0.20.0 + version: 0.20.0 '@growthbook/growthbook': specifier: ^1.0.0 version: 1.2.0 @@ -1065,6 +1071,9 @@ importers: specifier: ^4.4.1 version: 4.5.5(@types/react@18.3.9)(immer@9.0.21)(react@18.3.1) devDependencies: + '@amplitude/ampli': + specifier: ^1.31.5 + version: 1.35.0 '@tanstack/react-query-devtools': specifier: ^5.58.0 version: 5.58.0(@tanstack/react-query@5.56.2(react@18.3.1))(react@18.3.1) From 040dff418c5db2e11861bb9c3ba110608876ff75 Mon Sep 17 00:00:00 2001 From: Alexander Sporn Date: Thu, 30 Jan 2025 11:55:44 +0100 Subject: [PATCH 33/51] feat: build docker images on platform-specific runners instead of QEMU (#5048) * feat: build iota-node docker on platform-specific runners * feat: refactored docker jobs to use a multi-level matrix to build on platform-specific runners * fix: only set docker latest tag on mainnet releases --- .github/workflows/release_docker.yml | 337 ++++++++++----------------- 1 file changed, 126 insertions(+), 211 deletions(-) diff --git a/.github/workflows/release_docker.yml b/.github/workflows/release_docker.yml index 5f8ef7568de..24c63f40a68 100644 --- a/.github/workflows/release_docker.yml +++ b/.github/workflows/release_docker.yml @@ -1,3 +1,4 @@ +# This workflow is based on https://docs.docker.com/build/ci/github-actions/multi-platform/#distribute-build-across-multiple-runners name: Publish Docker Images on: @@ -27,47 +28,102 @@ on: default: false jobs: - build-iota-node: - if: github.event_name == 'workflow_dispatch' && github.event.inputs.iota_node == 'true' || github.event_name == 'release' - runs-on: self-hosted + prepare: + outputs: + images: ${{ steps.images.outputs.images }} + runs-on: ubuntu-24.04 + steps: + - name: Define images to build + id: images + run: | + images_array=() + + # Check iota_node: true if the input is set to true and the event is workflow_dispatch, + # or if the event is a release (in which case the job should run regardless of the input). + if [ "${{ github.event_name == 'workflow_dispatch' && github.event.inputs.iota_node == 'true' || github.event_name == 'release' }}" == "true" ]; then + images_array+=("iota-node") + fi + + # Check iota_indexer: true if the input is set to true and the event is workflow_dispatch, + # or if the event is a release (in which case the job should run regardless of the input). + if [ "${{ github.event_name == 'workflow_dispatch' && github.event.inputs.iota_indexer == 'true' || github.event_name == 'release' }}" == "true" ]; then + images_array+=("iota-indexer") + fi + + # Check iota_tools: true if the input is set to true and the event is workflow_dispatch, + # or if the event is a release (in which case the job should run regardless of the input). + if [ "${{ github.event_name == 'workflow_dispatch' && github.event.inputs.iota_tools == 'true' || github.event_name == 'release' }}" == "true" ]; then + images_array+=("iota-tools") + fi + + # Check iota_graphql_rpc: true if the input is set to true and the event is workflow_dispatch, + # or if the event is a release (in which case the job should run regardless of the input). + if [ "${{ github.event_name == 'workflow_dispatch' && github.event.inputs.iota_graphql_rpc == 'true' || github.event_name == 'release' }}" == "true" ]; then + images_array+=("iota-graphql-rpc") + fi + + # Check if the images_array is empty + if [ ${#images_array[@]} -eq 0 ]; then + echo "Error: images_array is empty" + exit 1 + fi + + echo "images=[$(printf '"%s",' "${images_array[@]}" | sed 's/,$//')]" >> "$GITHUB_OUTPUT" + + build: environment: release + needs: prepare + strategy: + fail-fast: false + matrix: + image: ${{ fromJSON(needs.prepare.outputs.images) }} + os: [ + ubuntu-24.04, + ubuntu-24.04-arm, + ] + runs-on: ${{ matrix.os }} steps: - name: Checkout code uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 - - name: Read Rust toolchain version from TOML - id: read_toolchain + - name: Prepare Environment Variables run: | + if [ "${{ runner.os }}" != "Linux" ]; then + echo "Error: This workflow only supports Linux runners." + exit 1 + fi + + case "${{ runner.arch }}" in + X64) + PLATFORM_ARCH="amd64" + ;; + ARM64) + PLATFORM_ARCH="arm64" + ;; + *) + echo "Error: Unsupported architecture: ${{ runner.arch }}" + exit 1 + ;; + esac + + echo "DOCKER_FILE=docker/${{ matrix.image }}/Dockerfile" >> $GITHUB_ENV + echo "DOCKER_IMAGE=iotaledger/${{ matrix.image }}" >> $GITHUB_ENV + echo "DOCKER_PLATFORM=linux/${PLATFORM_ARCH}" >> $GITHUB_ENV + echo "PLATFORM_PAIR=linux-${PLATFORM_ARCH}" >> $GITHUB_ENV + TOOLCHAIN_VERSION=$(grep -oE 'channel = "[^"]+' ./rust-toolchain.toml | sed 's/channel = "//') echo "TOOLCHAIN_VERSION=${TOOLCHAIN_VERSION}" >> $GITHUB_ENV - - name: Log Rust toolchain version - run: echo "Rust toolchain version is ${{ env.TOOLCHAIN_VERSION }}" + echo "Rust toolchain version is ${{ env.TOOLCHAIN_VERSION }}" - - name: Set up QEMU - uses: docker/setup-qemu-action@49b3bc8e6bdd4a60e6116a5414239cba5943d3cf # v3.2.0 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@c47758b77c9736f4b2ef4073d4d51994fabfe349 # v3.7.1 + echo "GIT_REVISION=$(git describe --always --abbrev=12 --dirty --exclude '*')" >> $GITHUB_ENV + echo "BUILD_DATE=$(date -u +'%Y-%m-%d')" >> $GITHUB_ENV - - name: Docker meta for iota-node - id: meta-node + - name: Docker meta + id: meta uses: docker/metadata-action@8e5442c4ef9f78752691e2d8f8d19755c6f78e81 # v5.5.1 with: - images: iotaledger/iota-node - # mapping semver tags to networks - # v{MAJOR}.{MINOR}.{PATCH}-alpha -> alphanet - # v{MAJOR}.{MINOR}.{PATCH}-beta -> devnet - # v{MAJOR}.{MINOR}.{PATCH}-rc -> testnet - # v{MAJOR}.{MINOR}.{PATCH} -> mainnet - tags: | - type=raw,value={{sha}},enable=${{ github.event_name == 'workflow_dispatch' }} - type=raw,value=latest,enable=${{ github.event_name == 'workflow_dispatch' }} - type=raw,value={{tag}},enable=${{ github.event_name == 'release' }} - type=raw,value=alphanet,enable=${{ github.event_name == 'release' && contains(github.ref, '-alpha') }} - type=raw,value=devnet,enable=${{ github.event_name == 'release' && contains(github.ref, '-beta') }} - type=raw,value=testnet,enable=${{ github.event_name == 'release' && contains(github.ref, '-rc') }} - type=raw,value=mainnet,enable=${{ github.event_name == 'release' && !contains(github.ref, '-alpha') && !contains(github.ref, '-beta') && !contains(github.ref, '-rc') }} + images: ${{ env.DOCKER_IMAGE }} - name: Login to Docker Registry uses: docker/login-action@9780b0c442fbb1117ed29e0efdff1e18412f7567 # v3.3.0 @@ -76,136 +132,56 @@ jobs: password: ${{ secrets.DOCKER_REGISTRY_PASSWORD }} registry: ${{ secrets.DOCKER_REGISTRY_URL }} - - name: Get git revision and build date - id: git-info - run: | - echo "GIT_REVISION=$(git describe --always --abbrev=12 --dirty --exclude '*')" >> $GITHUB_ENV - echo "BUILD_DATE=$(date -u +'%Y-%m-%d')" >> $GITHUB_ENV + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@c47758b77c9736f4b2ef4073d4d51994fabfe349 # v3.7.1 - - name: Build and push Docker image for iota-node + - name: Build and push by digest + id: build-image uses: docker/build-push-action@4f58ea79222b3b9dc2c8bbdd6debcef730109a75 # v6.9.0 with: context: . - file: docker/iota-node/Dockerfile - platforms: linux/amd64,linux/arm64 - tags: ${{ steps.meta-node.outputs.tags }} - push: true - pull: true + file: ${{ env.DOCKER_FILE }} + platforms: ${{ env.DOCKER_PLATFORM }} + labels: ${{ steps.meta.outputs.labels }} + outputs: type=image,"name=${{ env.DOCKER_IMAGE }}",push-by-digest=true,name-canonical=true,push=true build-args: | GIT_REVISION=${{ env.GIT_REVISION }} BUILD_DATE=${{ env.BUILD_DATE }} RUST_IMAGE_VERSION=${{ env.TOOLCHAIN_VERSION }}-bookworm - build-iota-indexer: - if: github.event_name == 'workflow_dispatch' && github.event.inputs.iota_indexer == 'true' || github.event_name == 'release' - runs-on: self-hosted - environment: release - steps: - - name: Checkout code - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 - - - name: Read Rust toolchain version from TOML - id: read_toolchain + - name: Export digest run: | - TOOLCHAIN_VERSION=$(grep -oE 'channel = "[^"]+' ./rust-toolchain.toml | sed 's/channel = "//') - echo "TOOLCHAIN_VERSION=${TOOLCHAIN_VERSION}" >> $GITHUB_ENV - - - name: Log Rust toolchain version - run: echo "Rust toolchain version is ${{ env.TOOLCHAIN_VERSION }}" - - - name: Set up QEMU - uses: docker/setup-qemu-action@49b3bc8e6bdd4a60e6116a5414239cba5943d3cf # v3.2.0 + mkdir -p ${{ runner.temp }}/digests + digest="${{ steps.build-image.outputs.digest }}" + touch "${{ runner.temp }}/digests/${digest#sha256:}" - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@c47758b77c9736f4b2ef4073d4d51994fabfe349 # v3.7.1 - - - name: Docker meta for iota-indexer - id: meta-indexer - uses: docker/metadata-action@8e5442c4ef9f78752691e2d8f8d19755c6f78e81 # v5.5.1 + - name: Upload digest + uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 with: - images: iotaledger/iota-indexer - # mapping semver tags to networks - # v{MAJOR}.{MINOR}.{PATCH}-alpha -> alphanet - # v{MAJOR}.{MINOR}.{PATCH}-beta -> devnet - # v{MAJOR}.{MINOR}.{PATCH}-rc -> testnet - # v{MAJOR}.{MINOR}.{PATCH} -> mainnet - tags: | - type=raw,value={{sha}},enable=${{ github.event_name == 'workflow_dispatch' }} - type=raw,value=latest,enable=${{ github.event_name == 'workflow_dispatch' }} - type=raw,value={{tag}},enable=${{ github.event_name == 'release' }} - type=raw,value=alphanet,enable=${{ github.event_name == 'release' && contains(github.ref, '-alpha') }} - type=raw,value=devnet,enable=${{ github.event_name == 'release' && contains(github.ref, '-beta') }} - type=raw,value=testnet,enable=${{ github.event_name == 'release' && contains(github.ref, '-rc') }} - type=raw,value=mainnet,enable=${{ github.event_name == 'release' && !contains(github.ref, '-alpha') && !contains(github.ref, '-beta') && !contains(github.ref, '-rc') }} - - - name: Login to Docker Registry - uses: docker/login-action@9780b0c442fbb1117ed29e0efdff1e18412f7567 # v3.3.0 - with: - username: ${{ secrets.DOCKER_REGISTRY_USERNAME }} - password: ${{ secrets.DOCKER_REGISTRY_PASSWORD }} - registry: ${{ secrets.DOCKER_REGISTRY_URL }} - - - name: Get git revision and build date - id: git-info - run: | - echo "GIT_REVISION=$(git describe --always --abbrev=12 --dirty --exclude '*')" >> $GITHUB_ENV - echo "BUILD_DATE=$(date -u +'%Y-%m-%d')" >> $GITHUB_ENV - - - name: Build and push Docker image for iota-indexer - uses: docker/build-push-action@4f58ea79222b3b9dc2c8bbdd6debcef730109a75 # v6.9.0 - with: - context: . - file: docker/iota-indexer/Dockerfile - platforms: linux/amd64,linux/arm64 - tags: ${{ steps.meta-indexer.outputs.tags }} - push: true - pull: true - build-args: | - GIT_REVISION=${{ env.GIT_REVISION }} - BUILD_DATE=${{ env.BUILD_DATE }} - RUST_IMAGE_VERSION=${{ env.TOOLCHAIN_VERSION }}-bookworm - - build-iota-tools: - if: github.event_name == 'workflow_dispatch' && github.event.inputs.iota_tools == 'true' || github.event_name == 'release' - runs-on: self-hosted - environment: release + name: digests-${{ github.sha }}-${{ matrix.image }}-${{ env.PLATFORM_PAIR }} + path: ${{ runner.temp }}/digests/* + if-no-files-found: error + retention-days: 1 + + tag: + environment: release # This will require a second approval after all `build` jobs have finished (see https://github.com/orgs/community/discussions/14417) + needs: [prepare, build] + strategy: + fail-fast: false + matrix: + image: ${{ fromJSON(needs.prepare.outputs.images) }} + runs-on: ubuntu-24.04 steps: - - name: Checkout code - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 - - - name: Read Rust toolchain version from TOML - id: read_toolchain + - name: Prepare Environment Variables run: | - TOOLCHAIN_VERSION=$(grep -oE 'channel = "[^"]+' ./rust-toolchain.toml | sed 's/channel = "//') - echo "TOOLCHAIN_VERSION=${TOOLCHAIN_VERSION}" >> $GITHUB_ENV + echo "DOCKER_IMAGE=iotaledger/${{ matrix.image }}" >> $GITHUB_ENV - - name: Log Rust toolchain version - run: echo "Rust toolchain version is ${{ env.TOOLCHAIN_VERSION }}" - - - name: Set up QEMU - uses: docker/setup-qemu-action@49b3bc8e6bdd4a60e6116a5414239cba5943d3cf # v3.2.0 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@c47758b77c9736f4b2ef4073d4d51994fabfe349 # v3.7.1 - - - name: Docker meta for iota-tools - id: meta-tools - uses: docker/metadata-action@8e5442c4ef9f78752691e2d8f8d19755c6f78e81 # v5.5.1 + - name: Download digests + uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 with: - images: iotaledger/iota-tools - # mapping semver tags to networks - # v{MAJOR}.{MINOR}.{PATCH}-alpha -> alphanet - # v{MAJOR}.{MINOR}.{PATCH}-beta -> devnet - # v{MAJOR}.{MINOR}.{PATCH}-rc -> testnet - # v{MAJOR}.{MINOR}.{PATCH} -> mainnet - tags: | - type=raw,value={{sha}},enable=${{ github.event_name == 'workflow_dispatch' }} - type=raw,value=latest,enable=${{ github.event_name == 'workflow_dispatch' }} - type=raw,value={{tag}},enable=${{ github.event_name == 'release' }} - type=raw,value=alphanet,enable=${{ github.event_name == 'release' && contains(github.ref, '-alpha') }} - type=raw,value=devnet,enable=${{ github.event_name == 'release' && contains(github.ref, '-beta') }} - type=raw,value=testnet,enable=${{ github.event_name == 'release' && contains(github.ref, '-rc') }} - type=raw,value=mainnet,enable=${{ github.event_name == 'release' && !contains(github.ref, '-alpha') && !contains(github.ref, '-beta') && !contains(github.ref, '-rc') }} + path: ${{ runner.temp }}/digests + pattern: digests-${{ github.sha }}-${{ matrix.image }}-* + merge-multiple: true - name: Login to Docker Registry uses: docker/login-action@9780b0c442fbb1117ed29e0efdff1e18412f7567 # v3.3.0 @@ -214,54 +190,14 @@ jobs: password: ${{ secrets.DOCKER_REGISTRY_PASSWORD }} registry: ${{ secrets.DOCKER_REGISTRY_URL }} - - name: Get git revision and build date - id: git-info - run: | - echo "GIT_REVISION=$(git describe --always --abbrev=12 --dirty --exclude '*')" >> $GITHUB_ENV - echo "BUILD_DATE=$(date -u +'%Y-%m-%d')" >> $GITHUB_ENV - - - name: Build and push Docker image for iota-tools - uses: docker/build-push-action@4f58ea79222b3b9dc2c8bbdd6debcef730109a75 # v6.9.0 - with: - context: . - file: docker/iota-tools/Dockerfile - platforms: linux/amd64,linux/arm64 - tags: ${{ steps.meta-tools.outputs.tags }} - push: true - pull: true - build-args: | - GIT_REVISION=${{ env.GIT_REVISION }} - BUILD_DATE=${{ env.BUILD_DATE }} - RUST_IMAGE_VERSION=${{ env.TOOLCHAIN_VERSION }}-bookworm - - build-iota-graphql-rpc: - if: github.event_name == 'workflow_dispatch' && github.event.inputs.iota_graphql_rpc == 'true' || github.event_name == 'release' - runs-on: self-hosted - environment: release - steps: - - name: Checkout code - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 - - - name: Read Rust toolchain version from TOML - id: read_toolchain - run: | - TOOLCHAIN_VERSION=$(grep -oE 'channel = "[^"]+' ./rust-toolchain.toml | sed 's/channel = "//') - echo "TOOLCHAIN_VERSION=${TOOLCHAIN_VERSION}" >> $GITHUB_ENV - - - name: Log Rust toolchain version - run: echo "Rust toolchain version is ${{ env.TOOLCHAIN_VERSION }}" - - - name: Set up QEMU - uses: docker/setup-qemu-action@49b3bc8e6bdd4a60e6116a5414239cba5943d3cf # v3.2.0 - - name: Set up Docker Buildx uses: docker/setup-buildx-action@c47758b77c9736f4b2ef4073d4d51994fabfe349 # v3.7.1 - - name: Docker meta for iota-graphql-rpc - id: meta-tools + - name: Docker meta + id: meta uses: docker/metadata-action@8e5442c4ef9f78752691e2d8f8d19755c6f78e81 # v5.5.1 with: - images: iotaledger/iota-graphql-rpc + images: ${{ env.DOCKER_IMAGE }} # mapping semver tags to networks # v{MAJOR}.{MINOR}.{PATCH}-alpha -> alphanet # v{MAJOR}.{MINOR}.{PATCH}-beta -> devnet @@ -269,36 +205,15 @@ jobs: # v{MAJOR}.{MINOR}.{PATCH} -> mainnet tags: | type=raw,value={{sha}},enable=${{ github.event_name == 'workflow_dispatch' }} - type=raw,value=latest,enable=${{ github.event_name == 'workflow_dispatch' }} type=raw,value={{tag}},enable=${{ github.event_name == 'release' }} type=raw,value=alphanet,enable=${{ github.event_name == 'release' && contains(github.ref, '-alpha') }} type=raw,value=devnet,enable=${{ github.event_name == 'release' && contains(github.ref, '-beta') }} type=raw,value=testnet,enable=${{ github.event_name == 'release' && contains(github.ref, '-rc') }} type=raw,value=mainnet,enable=${{ github.event_name == 'release' && !contains(github.ref, '-alpha') && !contains(github.ref, '-beta') && !contains(github.ref, '-rc') }} + type=raw,value=latest,enable=${{ github.event_name == 'release' && !contains(github.ref, '-alpha') && !contains(github.ref, '-beta') && !contains(github.ref, '-rc') }} - - name: Login to Docker Registry - uses: docker/login-action@9780b0c442fbb1117ed29e0efdff1e18412f7567 # v3.3.0 - with: - username: ${{ secrets.DOCKER_REGISTRY_USERNAME }} - password: ${{ secrets.DOCKER_REGISTRY_PASSWORD }} - registry: ${{ secrets.DOCKER_REGISTRY_URL }} - - - name: Get git revision and build date - id: git-info + - name: Create manifest list and push + working-directory: ${{ runner.temp }}/digests run: | - echo "GIT_REVISION=$(git describe --always --abbrev=12 --dirty --exclude '*')" >> $GITHUB_ENV - echo "BUILD_DATE=$(date -u +'%Y-%m-%d')" >> $GITHUB_ENV - - - name: Build and push Docker image for iota-graphql-rpc - uses: docker/build-push-action@4f58ea79222b3b9dc2c8bbdd6debcef730109a75 # v6.9.0 - with: - context: . - file: docker/iota-graphql-rpc/Dockerfile - platforms: linux/amd64,linux/arm64 - tags: ${{ steps.meta-tools.outputs.tags }} - push: true - pull: true - build-args: | - GIT_REVISION=${{ env.GIT_REVISION }} - BUILD_DATE=${{ env.BUILD_DATE }} - RUST_IMAGE_VERSION=${{ env.TOOLCHAIN_VERSION }}-bookworm + docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \ + $(printf '${{ env.DOCKER_IMAGE }}@sha256:%s ' *) From 06f604a1fa0d8c100f887e373badab5de13020b1 Mon Sep 17 00:00:00 2001 From: Thibault Martinez Date: Thu, 30 Jan 2025 11:56:20 +0100 Subject: [PATCH 34/51] fix(ci): call correct split cluster workflow file (#5094) --- .github/workflows/nightly.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index 2fcbcddd583..0e6a1e95d5a 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -96,7 +96,7 @@ jobs: uses: ./.github/workflows/_execution_cut.yml split-cluster: - uses: ./.github/workflows/split_cluster.yml + uses: ./.github/workflows/_split_cluster.yml simtest: timeout-minutes: 240 From 5a2573acc4b062995c792ec924a2754bff476156 Mon Sep 17 00:00:00 2001 From: Marc Espin Date: Thu, 30 Jan 2025 12:51:43 +0100 Subject: [PATCH 35/51] refactor(wallet-dashboard): Clean up some code here and there (#5038) * refactor(wallet-dashboard): Clean up some code here and there * fmt --------- Co-authored-by: evavirseda --- .../migration/createMigrationTransaction.ts | 4 +-- .../components/dialogs/TransactionDialog.tsx | 7 ++--- .../dialogs/migration/MigrationDialog.tsx | 2 +- .../dialogs/staking/StakeDialog.tsx | 2 +- .../views/EnterTimelockedAmountView.tsx | 27 +++++++------------ .../dialogs/unstake/UnstakeDialog.tsx | 2 +- .../dialogs/unstake/hooks/useUnstakeDialog.ts | 2 +- .../hooks/useMigrationTransaction.ts | 9 ++++--- 8 files changed, 23 insertions(+), 32 deletions(-) diff --git a/apps/core/src/utils/migration/createMigrationTransaction.ts b/apps/core/src/utils/migration/createMigrationTransaction.ts index c5ac17fa556..c3c9ffda8ee 100644 --- a/apps/core/src/utils/migration/createMigrationTransaction.ts +++ b/apps/core/src/utils/migration/createMigrationTransaction.ts @@ -64,8 +64,8 @@ export function validateNftOutputObject(outputObject: IotaObjectData): NftOutput export async function createMigrationTransaction( client: IotaClient, address: string, - basicOutputs: IotaObjectData[] = [], - nftOutputs: IotaObjectData[] = [], + basicOutputs: IotaObjectData[], + nftOutputs: IotaObjectData[], ): Promise { const ptb = new Transaction(); diff --git a/apps/wallet-dashboard/components/dialogs/TransactionDialog.tsx b/apps/wallet-dashboard/components/dialogs/TransactionDialog.tsx index 71418f1b673..7c2ff666fc8 100644 --- a/apps/wallet-dashboard/components/dialogs/TransactionDialog.tsx +++ b/apps/wallet-dashboard/components/dialogs/TransactionDialog.tsx @@ -12,13 +12,10 @@ import { } from '@iota/core'; import { useCurrentAccount } from '@iota/dapp-kit'; -interface SharedProps { - txDigest?: string | null; -} - -interface TransactionViewProps extends SharedProps { +interface TransactionViewProps { onClose: () => void; onBack?: () => void; + txDigest: string | null; } export function TransactionDialogView({ diff --git a/apps/wallet-dashboard/components/dialogs/migration/MigrationDialog.tsx b/apps/wallet-dashboard/components/dialogs/migration/MigrationDialog.tsx index e3e9cd19541..63aa8e052cb 100644 --- a/apps/wallet-dashboard/components/dialogs/migration/MigrationDialog.tsx +++ b/apps/wallet-dashboard/components/dialogs/migration/MigrationDialog.tsx @@ -31,7 +31,7 @@ export function MigrationDialog({ isTimelocked, }: MigrationDialogProps): JSX.Element { const account = useCurrentAccount(); - const [txDigest, setTxDigest] = useState(''); + const [txDigest, setTxDigest] = useState(null); const [view, setView] = useState(MigrationDialogView.Confirmation); const { diff --git a/apps/wallet-dashboard/components/dialogs/staking/StakeDialog.tsx b/apps/wallet-dashboard/components/dialogs/staking/StakeDialog.tsx index 66ded41a559..69fa3e8d41a 100644 --- a/apps/wallet-dashboard/components/dialogs/staking/StakeDialog.tsx +++ b/apps/wallet-dashboard/components/dialogs/staking/StakeDialog.tsx @@ -53,7 +53,7 @@ export function StakeDialog({ const senderAddress = account?.address ?? ''; const { data: iotaBalance } = useBalance(senderAddress!); const coinBalance = BigInt(iotaBalance?.totalBalance || 0); - const [txDigest, setTxDigest] = useState(''); + const [txDigest, setTxDigest] = useState(null); const { data: metadata } = useCoinMetadata(IOTA_TYPE_ARG); const coinDecimals = metadata?.decimals ?? 0; diff --git a/apps/wallet-dashboard/components/dialogs/staking/views/EnterTimelockedAmountView.tsx b/apps/wallet-dashboard/components/dialogs/staking/views/EnterTimelockedAmountView.tsx index 9ef12ac726d..543bf815a2f 100644 --- a/apps/wallet-dashboard/components/dialogs/staking/views/EnterTimelockedAmountView.tsx +++ b/apps/wallet-dashboard/components/dialogs/staking/views/EnterTimelockedAmountView.tsx @@ -1,14 +1,8 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { useEffect, useState } from 'react'; -import { - useFormatCoin, - CoinFormat, - GroupedTimelockObject, - useGetAllOwnedObjects, - TIMELOCK_IOTA_TYPE, -} from '@iota/core'; +import { useMemo } from 'react'; +import { useFormatCoin, CoinFormat, useGetAllOwnedObjects, TIMELOCK_IOTA_TYPE } from '@iota/core'; import { IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; import { useFormikContext } from 'formik'; import { useSignAndExecuteTransaction } from '@iota/dapp-kit'; @@ -47,24 +41,21 @@ export function EnterTimelockedAmountView({ const { data: timelockedObjects } = useGetAllOwnedObjects(senderAddress, { StructType: TIMELOCK_IOTA_TYPE, }); - const [groupedTimelockObjects, setGroupedTimelockObjects] = useState( - [], - ); - - const { data: newStakeData, isLoading: isTransactionLoading } = - useNewStakeTimelockedTransaction(selectedValidator, senderAddress, groupedTimelockObjects); - - useEffect(() => { + const groupedTimelockObjects = useMemo(() => { if (timelockedObjects && currentEpochMs) { - const groupedTimelockObjects = prepareObjectsForTimelockedStakingTransaction( + return prepareObjectsForTimelockedStakingTransaction( timelockedObjects, amountWithoutDecimals, currentEpochMs, ); - setGroupedTimelockObjects(groupedTimelockObjects); + } else { + return []; } }, [timelockedObjects, currentEpochMs, amountWithoutDecimals]); + const { data: newStakeData, isLoading: isTransactionLoading } = + useNewStakeTimelockedTransaction(selectedValidator, senderAddress, groupedTimelockObjects); + const hasGroupedTimelockObjects = groupedTimelockObjects.length > 0; const [maxTokenFormatted, maxTokenFormattedSymbol] = useFormatCoin( diff --git a/apps/wallet-dashboard/components/dialogs/unstake/UnstakeDialog.tsx b/apps/wallet-dashboard/components/dialogs/unstake/UnstakeDialog.tsx index 16ef52b41bb..009f460ceb3 100644 --- a/apps/wallet-dashboard/components/dialogs/unstake/UnstakeDialog.tsx +++ b/apps/wallet-dashboard/components/dialogs/unstake/UnstakeDialog.tsx @@ -16,7 +16,7 @@ interface UnstakeDialogProps { onBack?: (view: UnstakeDialogView) => (() => void) | undefined; groupedTimelockedObjects?: TimelockedStakedObjectsGrouped; extendedStake?: ExtendedDelegatedStake; - txDigest?: string; + txDigest: string | null; } export function UnstakeDialog({ diff --git a/apps/wallet-dashboard/components/dialogs/unstake/hooks/useUnstakeDialog.ts b/apps/wallet-dashboard/components/dialogs/unstake/hooks/useUnstakeDialog.ts index 88de6c40f25..80726c30f17 100644 --- a/apps/wallet-dashboard/components/dialogs/unstake/hooks/useUnstakeDialog.ts +++ b/apps/wallet-dashboard/components/dialogs/unstake/hooks/useUnstakeDialog.ts @@ -8,7 +8,7 @@ import type { UnstakeDialog } from '../UnstakeDialog'; export function useUnstakeDialog() { const [isOpen, setIsOpen] = useState(false); const [view, setView] = useState(UnstakeDialogView.Unstake); - const [txDigest, setTxDigest] = useState(); + const [txDigest, setTxDigest] = useState(null); function openUnstakeDialog(view?: UnstakeDialogView) { setIsOpen(true); diff --git a/apps/wallet-dashboard/hooks/useMigrationTransaction.ts b/apps/wallet-dashboard/hooks/useMigrationTransaction.ts index b36c5b991fb..2eeec00a640 100644 --- a/apps/wallet-dashboard/hooks/useMigrationTransaction.ts +++ b/apps/wallet-dashboard/hooks/useMigrationTransaction.ts @@ -8,13 +8,16 @@ import { createMigrationTransaction } from '@iota/core'; export function useMigrationTransaction( address: string, - basicOutputObjects?: IotaObjectData[], - nftOutputObjects?: IotaObjectData[], + basicOutputObjects: IotaObjectData[], + nftOutputObjects: IotaObjectData[], ) { const client = useIotaClient(); + const basicOutputObjectsIds = basicOutputObjects.map(({ objectId }) => objectId); + const nftOutputObjectsIds = nftOutputObjects.map(({ objectId }) => objectId); + return useQuery({ // eslint-disable-next-line @tanstack/query/exhaustive-deps - queryKey: ['migration-transaction', address], + queryKey: ['migration-transaction', address, basicOutputObjectsIds, nftOutputObjectsIds], queryFn: async () => { const transaction = await createMigrationTransaction( client, From dd0aa576d1907ab00d92e44d8bc1d4af408b1c79 Mon Sep 17 00:00:00 2001 From: evavirseda Date: Thu, 30 Jan 2025 12:55:32 +0100 Subject: [PATCH 36/51] feat(wallet): hint user about migration in homepage (#5041) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat(core): add StardustIndexerClient * feat(dashboard): add stardust objects from indexer. * feat(core): enhance StardustIndexerClient with basic output mapping and new types * feat(dashboard): add NFT resolved outputs retrieval and mapping functions * refactor(core, dashboard): unify output types and enhance mapping functions * feat(wallet-dashboard, core): enhance Stardust output handling and add pagination support * fix(core, dashboard): pr fixes * feat: add migration popup * feat(sdk): add metadata configuration for stardustIndexer in .env.defaults * refactor(core): rename limit parameter to page_size in StardustIndexerClient * refactor(core): update PageParams interface and adjust pagination parameters in StardustIndexerClient * refactor(core): update return_amount * refactor(core): update StardustIndexerClient methods and rename hook for clarity * refactor(dashboard): remove unused variables in useGetAllStardustSharedObjects hook * fix: add missing 0x to stardust package id * refactor(core, dashboard): update Stardust package ID format, improve metadata handling in hooks, rename variables. * feat: rename constants * feat: add useGetStardustSharedObjects hook and move to core * refactor: split shared object hooks * refactor: simplify code * fix build * fix: react query crash * fix: dashboard crash * chore: remove debris --------- Co-authored-by: Panteleymonchuk Co-authored-by: cpl121 <100352899+cpl121@users.noreply.github.com> Co-authored-by: Begoña Alvarez --- apps/core/src/api/StardustIndexerClient.ts | 2 +- .../StardustIndexerClientProvider.tsx | 5 +- apps/core/src/contexts/index.ts | 1 + apps/core/src/hooks/index.ts | 3 + .../hooks/useGetAllStardustSharedObjects.ts | 65 +++++++++ .../hooks/useGetStardustSharedBasicObjects.ts | 36 +++++ .../hooks/useGetStardustSharedNftObjects.ts | 32 +++++ .../hooks/useGetAllStardustSharedObjects.ts | 77 ----------- .../hooks/useGetStardustMigratableObjects.ts | 6 +- .../providers/AppProviders.tsx | 3 +- .../app/pages/home/tokens/MigrationDialog.tsx | 46 +++++++ .../app/pages/home/tokens/TokensDetails.tsx | 124 +++++++++++++----- .../src/ui/assets/images/migration_dialog.png | Bin 0 -> 129961 bytes .../images/migration_dialog_darkmode.png | Bin 0 -> 134003 bytes apps/wallet/src/ui/index.tsx | 44 ++++--- 15 files changed, 303 insertions(+), 141 deletions(-) rename apps/{wallet-dashboard/providers => core/src/contexts}/StardustIndexerClientProvider.tsx (82%) create mode 100644 apps/core/src/hooks/useGetAllStardustSharedObjects.ts create mode 100644 apps/core/src/hooks/useGetStardustSharedBasicObjects.ts create mode 100644 apps/core/src/hooks/useGetStardustSharedNftObjects.ts delete mode 100644 apps/wallet-dashboard/hooks/useGetAllStardustSharedObjects.ts create mode 100644 apps/wallet/src/ui/app/pages/home/tokens/MigrationDialog.tsx create mode 100644 apps/wallet/src/ui/assets/images/migration_dialog.png create mode 100644 apps/wallet/src/ui/assets/images/migration_dialog_darkmode.png diff --git a/apps/core/src/api/StardustIndexerClient.ts b/apps/core/src/api/StardustIndexerClient.ts index 69238ed403f..d5fe4c41a89 100644 --- a/apps/core/src/api/StardustIndexerClient.ts +++ b/apps/core/src/api/StardustIndexerClient.ts @@ -9,7 +9,7 @@ export interface PageParams { } export class StardustIndexerClient { - private baseUrl: string; + public baseUrl: string; constructor(baseUrl?: string) { if (!baseUrl) { diff --git a/apps/wallet-dashboard/providers/StardustIndexerClientProvider.tsx b/apps/core/src/contexts/StardustIndexerClientProvider.tsx similarity index 82% rename from apps/wallet-dashboard/providers/StardustIndexerClientProvider.tsx rename to apps/core/src/contexts/StardustIndexerClientProvider.tsx index e1e85e5bf81..ebd8087ecc1 100644 --- a/apps/wallet-dashboard/providers/StardustIndexerClientProvider.tsx +++ b/apps/core/src/contexts/StardustIndexerClientProvider.tsx @@ -4,7 +4,10 @@ 'use client'; import { useIotaClientContext } from '@iota/dapp-kit'; -import { StardustIndexerClientContext, useStardustIndexerClient } from '@iota/core'; +import { + StardustIndexerClientContext, + useStardustIndexerClient, +} from './StardustIndexerClientContext'; export const StardustIndexerClientProvider: React.FC = ({ children }) => { const { network } = useIotaClientContext(); diff --git a/apps/core/src/contexts/index.ts b/apps/core/src/contexts/index.ts index b1090f621f4..ee36ad0abff 100644 --- a/apps/core/src/contexts/index.ts +++ b/apps/core/src/contexts/index.ts @@ -4,3 +4,4 @@ export * from './ThemeContext'; export * from './HiddenAssetsProvider'; export * from './StardustIndexerClientContext'; +export * from './StardustIndexerClientProvider'; diff --git a/apps/core/src/hooks/index.ts b/apps/core/src/hooks/index.ts index 5541dbbfb47..bfa63a73173 100644 --- a/apps/core/src/hooks/index.ts +++ b/apps/core/src/hooks/index.ts @@ -52,6 +52,9 @@ export * from './useGetNFTs'; export * from './useRecognizedPackages'; export * from './useTransferAsset'; export * from './useFeatureEnabledByNetwork'; +export * from './useGetAllStardustSharedObjects'; +export * from './useGetStardustSharedBasicObjects'; +export * from './useGetStardustSharedNftObjects'; export * from './stake'; export * from './ui'; diff --git a/apps/core/src/hooks/useGetAllStardustSharedObjects.ts b/apps/core/src/hooks/useGetAllStardustSharedObjects.ts new file mode 100644 index 00000000000..444ee1a73c4 --- /dev/null +++ b/apps/core/src/hooks/useGetAllStardustSharedObjects.ts @@ -0,0 +1,65 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 +import { useQuery } from '@tanstack/react-query'; +import { IotaObjectData } from '@iota/iota-sdk/client'; +import { useGetStardustSharedBasicObjects } from './useGetStardustSharedBasicObjects'; +import { useGetStardustSharedNftObjects } from './useGetStardustSharedNftObjects'; + +const LIMIT_PER_REQ = 50; + +export function useGetAllStardustSharedObjects(address: string) { + const fetchPaginatedData = async () => { + let allBasicOutputs: IotaObjectData[] = []; + let allNftOutputs: IotaObjectData[] = []; + + let basicOutputPage = 1; + do { + const { data: basicObjects } = await useGetStardustSharedBasicObjects( + address, + LIMIT_PER_REQ, + basicOutputPage, + ); + + if (!basicObjects || !basicObjects?.length) { + break; + } + + allBasicOutputs = [ + ...allBasicOutputs, + ...(basicObjects as unknown as IotaObjectData[]), + ]; + + basicOutputPage = basicObjects.length < LIMIT_PER_REQ ? 0 : basicOutputPage + 1; + } while (basicOutputPage > 0); + + let nftOutputPage = 1; + do { + const { data: nftObjects } = await useGetStardustSharedNftObjects( + address, + LIMIT_PER_REQ, + nftOutputPage, + ); + + if (!nftObjects || !nftObjects?.length) { + break; + } + + allNftOutputs = [...allNftOutputs, ...(nftObjects as unknown as IotaObjectData[])]; + + nftOutputPage = nftObjects.length < LIMIT_PER_REQ ? 0 : nftOutputPage + 1; + } while (nftOutputPage > 0); + + return { + basic: allBasicOutputs, + nfts: allNftOutputs, + }; + }; + + return useQuery({ + queryKey: ['stardust-all-shared-objects', address], + queryFn: fetchPaginatedData, + enabled: !!address, + staleTime: 1000 * 60 * 5, + placeholderData: { basic: [], nfts: [] }, + }); +} diff --git a/apps/core/src/hooks/useGetStardustSharedBasicObjects.ts b/apps/core/src/hooks/useGetStardustSharedBasicObjects.ts new file mode 100644 index 00000000000..6d76c11d3dd --- /dev/null +++ b/apps/core/src/hooks/useGetStardustSharedBasicObjects.ts @@ -0,0 +1,36 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +import { useQuery } from '@tanstack/react-query'; +import { useStardustIndexerClientContext } from '../contexts'; + +export function useGetStardustSharedBasicObjects( + address: string, + pageSize?: number, + page?: number, +) { + const { stardustIndexerClient } = useStardustIndexerClientContext(); + + return useQuery({ + queryKey: [ + 'stardust-shared-basic-objects', + address, + pageSize, + page, + stardustIndexerClient?.baseUrl, + ], + queryFn: async () => { + if (!stardustIndexerClient?.baseUrl) return []; + + const basicOutputs = await stardustIndexerClient.getBasicResolvedOutputs(address, { + page, + pageSize, + }); + + return basicOutputs || []; + }, + enabled: !!address, + staleTime: 1000 * 60 * 5, + placeholderData: [], + }); +} diff --git a/apps/core/src/hooks/useGetStardustSharedNftObjects.ts b/apps/core/src/hooks/useGetStardustSharedNftObjects.ts new file mode 100644 index 00000000000..7d6ece19c70 --- /dev/null +++ b/apps/core/src/hooks/useGetStardustSharedNftObjects.ts @@ -0,0 +1,32 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +import { useQuery } from '@tanstack/react-query'; +import { useStardustIndexerClientContext } from '../contexts'; + +export function useGetStardustSharedNftObjects(address: string, pageSize?: number, page?: number) { + const { stardustIndexerClient } = useStardustIndexerClientContext(); + + return useQuery({ + queryKey: [ + 'stardust-shared-nft-objects', + address, + pageSize, + page, + stardustIndexerClient?.baseUrl, + ], + queryFn: async () => { + if (!stardustIndexerClient?.baseUrl) return []; + + const nftOutputs = await stardustIndexerClient.getNftResolvedOutputs(address, { + page, + pageSize, + }); + + return nftOutputs || []; + }, + enabled: !!address, + staleTime: 1000 * 60 * 5, + placeholderData: [], + }); +} diff --git a/apps/wallet-dashboard/hooks/useGetAllStardustSharedObjects.ts b/apps/wallet-dashboard/hooks/useGetAllStardustSharedObjects.ts deleted file mode 100644 index 1e15fe9e510..00000000000 --- a/apps/wallet-dashboard/hooks/useGetAllStardustSharedObjects.ts +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright (c) 2024 IOTA Stiftung -// SPDX-License-Identifier: Apache-2.0 - -import { useQuery } from '@tanstack/react-query'; -import { - mapStardustBasicOutputs, - mapStardustNftOutputs, - PageParams, - StardustIndexerOutput, - TimeUnit, - useStardustIndexerClientContext, -} from '@iota/core'; -import { IotaObjectData } from '@iota/iota-sdk/client'; - -const LIMIT_PER_REQ = 50; - -export function useGetAllStardustSharedObjects(address: string) { - const { stardustIndexerClient } = useStardustIndexerClientContext(); - - const fetchPaginatedStardustSharedObjects = async ( - mapFn: (output: StardustIndexerOutput) => IotaObjectData, - fetchFn: (address: string, params: PageParams) => Promise, - ) => { - const allData: StardustIndexerOutput[] = []; - let page = 1; - - try { - do { - const data = await fetchFn(address, { page, pageSize: LIMIT_PER_REQ }); - - if (!data || !data.length) { - break; - } - - allData.push(...data); - page++; - } while (page); - } catch (e) { - console.error(e); - } - - return allData.map(mapFn); - }; - - return useQuery({ - queryKey: ['stardust-shared-objects', address, stardustIndexerClient], - queryFn: async () => { - if (!stardustIndexerClient) { - return { - basic: [], - nfts: [], - }; - } - - const basicOutputs = await fetchPaginatedStardustSharedObjects( - mapStardustBasicOutputs, - stardustIndexerClient.getBasicResolvedOutputs, - ); - - const nftOutputs = await fetchPaginatedStardustSharedObjects( - mapStardustNftOutputs, - stardustIndexerClient.getNftResolvedOutputs, - ); - - return { - basic: basicOutputs, - nfts: nftOutputs, - }; - }, - enabled: !!address, - staleTime: TimeUnit.ONE_SECOND * TimeUnit.ONE_MINUTE * 5, - placeholderData: { - basic: [], - nfts: [], - }, - }); -} diff --git a/apps/wallet-dashboard/hooks/useGetStardustMigratableObjects.ts b/apps/wallet-dashboard/hooks/useGetStardustMigratableObjects.ts index cbbbeb1d6a8..fc24e062b15 100644 --- a/apps/wallet-dashboard/hooks/useGetStardustMigratableObjects.ts +++ b/apps/wallet-dashboard/hooks/useGetStardustMigratableObjects.ts @@ -9,8 +9,8 @@ import { STARDUST_NFT_OUTPUT_TYPE, TimeUnit, useGetAllOwnedObjects, + useGetAllStardustSharedObjects, } from '@iota/core'; -import { useGetAllStardustSharedObjects } from './useGetAllStardustSharedObjects'; export function useGetStardustMigratableObjects(address: string) { const { data: currentEpochMs } = useGetCurrentEpochStartTimestamp(); @@ -23,8 +23,8 @@ export function useGetStardustMigratableObjects(address: string) { StructType: STARDUST_NFT_OUTPUT_TYPE, }); - const sharedBasicOutputObjects = stardustSharedObjectsData!.basic; - const sharedNftOutputObjects = stardustSharedObjectsData!.nfts; + const sharedBasicOutputObjects = stardustSharedObjectsData?.basic ?? []; + const sharedNftOutputObjects = stardustSharedObjectsData?.nfts ?? []; return useQuery({ queryKey: [ diff --git a/apps/wallet-dashboard/providers/AppProviders.tsx b/apps/wallet-dashboard/providers/AppProviders.tsx index 867d195dd08..549c2d3908c 100644 --- a/apps/wallet-dashboard/providers/AppProviders.tsx +++ b/apps/wallet-dashboard/providers/AppProviders.tsx @@ -10,10 +10,9 @@ import { getAllNetworks, getDefaultNetwork } from '@iota/iota-sdk/client'; import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import { ReactQueryDevtools } from '@tanstack/react-query-devtools'; import { useState } from 'react'; -import { KioskClientProvider, useLocalStorage } from '@iota/core'; +import { KioskClientProvider, StardustIndexerClientProvider, useLocalStorage } from '@iota/core'; import { growthbook } from '@/lib/utils'; import { ThemeProvider } from '@iota/core'; -import { StardustIndexerClientProvider } from './StardustIndexerClientProvider'; import { createIotaClient } from '@/lib/utils/defaultRpcClient'; growthbook.init(); diff --git a/apps/wallet/src/ui/app/pages/home/tokens/MigrationDialog.tsx b/apps/wallet/src/ui/app/pages/home/tokens/MigrationDialog.tsx new file mode 100644 index 00000000000..67f06454dee --- /dev/null +++ b/apps/wallet/src/ui/app/pages/home/tokens/MigrationDialog.tsx @@ -0,0 +1,46 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +import { Button, Dialog, DialogContent, DialogBody, Header } from '@iota/apps-ui-kit'; +import { Theme, useTheme } from '@iota/core'; +import MigrationImage from '_assets/images/migration_dialog.png'; +import MigrationDarkImage from '_assets/images/migration_dialog_darkmode.png'; +import { WALLET_DASHBOARD_URL } from '_src/shared/constants'; + +interface MigrationDialogProps { + open: boolean; + setOpen: (isOpen: boolean) => void; +} + +export function MigrationDialog({ open, setOpen }: MigrationDialogProps) { + const { theme } = useTheme(); + + const imgSrc = theme === Theme.Dark ? MigrationDarkImage : MigrationImage; + + function navigateToDashboard() { + window.open(WALLET_DASHBOARD_URL, '_blank'); + } + return ( +