diff --git a/.changeset/config.json b/.changeset/config.json index edba6eadd51..e17c1ce1245 100644 --- a/.changeset/config.json +++ b/.changeset/config.json @@ -14,7 +14,6 @@ "wallet-dashboard", "apps-backend", "@iota/core", - "@iota/apps-ui-kit", "sponsored-transactions", "kiosk-demo", "kiosk-cli" diff --git a/.changeset/mighty-pans-suffer.md b/.changeset/mighty-pans-suffer.md new file mode 100644 index 00000000000..d58fe1593a3 --- /dev/null +++ b/.changeset/mighty-pans-suffer.md @@ -0,0 +1,5 @@ +--- +'@iota/dapp-kit': minor +--- + +Improved the connect-modal style so its easier to read and interact in small screens diff --git a/.dockerignore b/.dockerignore index ca5560030b7..06c579451f0 100644 --- a/.dockerignore +++ b/.dockerignore @@ -7,3 +7,5 @@ target/ build/ storage/ docker/ +dev-tools/ +setups/ \ No newline at end of file diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 38bb6687fd2..cb5faa2324d 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -4,41 +4,90 @@ # Everything within the SDK folder /sdk/ @iotaledger/tooling -# Changes to the genesis builder should be approved by Konstantinos or Mirko at least -/crates/iota-genesis-builder/ @kodemartin @miker83z +/consensus/ @iotaledger/consensus -# infrastructure team -/docker/ @iotaledger/infrastructure @iotaledger/node @iotaledger/devops-admin -/crates/iota-json-rpc*/ @iotaledger/infrastructure -/crates/iota-graphql*/ @iotaledger/infrastructure -/crates/iota-indexer*/ @iotaledger/infrastructure -/crates/iota-data-ingestion*/ @iotaledger/infrastructure +# Crates +/crates/bin-version/ @iotaledger/dev-tools +/crates/iota/ @iotaledger/dev-tools +/crates/iota-adapter-transactional-tests/ @iotaledger/vm-language /crates/iota-analytics-indexer/ @iotaledger/infrastructure - -# node team +/crates/iota-analytics-indexer-derive/ @iotaledger/infrastructure /crates/iota-archival/ @iotaledger/node /crates/iota-authority-aggregation/ @iotaledger/node @iotaledger/consensus +/crates/iota-aws-orchestrator/ @iotaledger/consensus +/crates/iota-benchmark/ @iotaledger/node +/crates/iota-cluster-test/ @iotaledger/infrastructure +/crates/iota-common/ @iotaledger/core-protocol /crates/iota-config/ @iotaledger/node /crates/iota-core/ @iotaledger/node @iotaledger/consensus +/crates/iota-cost/ @iotaledger/vm-language +/crates/iota-data-ingestion*/ @iotaledger/infrastructure +/crates/iota-e2e-tests/ @iotaledger/node @iotaledger/vm-language +/crates/iota-enum-compat-util/ @iotaledger/vm-language +/crates/iota-faucet/ @iotaledger/infrastructure +/crates/iota-framework/ @iotaledger/vm-language +/crates/iota-framework-snapshot/ @iotaledger/vm-language +/crates/iota-framework-tests/ @iotaledger/vm-language +/crates/iota-genesis-builder/ @iotaledger/vm-language +/crates/iota-genesis-common/ @iotaledger/vm-language +/crates/iota-graphql*/ @iotaledger/infrastructure +/crates/iota-indexer*/ @iotaledger/infrastructure +/crates/iota-json/ @iotaledger/infrastructure +/crates/iota-json-rpc*/ @iotaledger/infrastructure +/crates/iota-keys/ @iotaledger/dev-tools +/crates/iota-light-client/ @iotaledger/dev-tools +/crates/iota-macros/ @iotaledger/dev-tools +/crates/iota-metric-checker/ @iotaledger/node +/crates/iota-metrics/ @iotaledger/core-protocol +/crates/iota-move/ @iotaledger/vm-language +/crates/iota-move-build/ @iotaledger/vm-language +/crates/iota-move-lsp/ @iotaledger/vm-language /crates/iota-network/ @iotaledger/node /crates/iota-network-stack/ @iotaledger/node /crates/iota-node/ @iotaledger/node -/crates/iota-types/ @iotaledger/node @iotaledger/sc-platform +/crates/iota-open-rpc/ @iotaledger/dev-tools +/crates/iota-open-rpc-macros/ @iotaledger/dev-tools +/crates/iota-package-dump/ @iotaledger/infrastructure +/crates/iota-package-management/ @iotaledger/vm-language +/crates/iota-package-resolver/ @iotaledger/vm-language +/crates/iota-proc-macros/ @iotaledger/dev-tools /crates/iota-protocol-config/ @iotaledger/node @iotaledger/sc-platform /crates/iota-protocol-config-macros/ @iotaledger/node @iotaledger/sc-platform +/crates/iota-proxy/ @iotaledger/node +/crates/iota-replay/ @iotaledger/node /crates/iota-rest-api/ @iotaledger/node @iotaledger/infrastructure +/crates/iota-rpc-loadgen/ @iotaledger/infrastructure +/crates/iota-sdk/ @iotaledger/dev-tools +/crates/iota-simulator/ @iotaledger/core-protocol +/crates/iota-single-node-benchmark/ @iotaledger/node /crates/iota-snapshot/ @iotaledger/node +/crates/iota-source-validation/ @iotaledger/vm-language /crates/iota-storage/ @iotaledger/node - -# consensus team -/consensus/ @iotaledger/consensus - -# dev-tools team -/crates/iota/ @iotaledger/dev-tools -/crates/iota-open-rpc/ @iotaledger/dev-tools -/crates/iota-open-rpc-macros/ @iotaledger/dev-tools -/crates/iota-sdk/ @iotaledger/dev-tools +/crates/iota-swarm/ @iotaledger/node +/crates/iota-swarm-config/ @iotaledger/node +/crates/iota-test-transaction-builder/ @iotaledger/dev-tools +/crates/iota-tls/ @iotaledger/core-protocol +/crates/iota-tool/ @iotaledger/node /crates/iota-transaction-builder/ @iotaledger/dev-tools +/crates/iota-transaction-checks/ @iotaledger/core-protocol +/crates/iota-transactional-test-runner/ @iotaledger/vm-language +/crates/iota-types/ @iotaledger/core-protocol @iotaledger/sc-platform +/crates/iota-upgrade-compatibility-transactional-tests/ @iotaledger/vm-language +/crates/iota-verifier-transactional-tests/ @iotaledger/vm-language +/crates/prometheus-closure-metric/ @iotaledger/node +/crates/shared-crypto/ @iotaledger/core-protocol +/crates/simulacrum/ @iotaledger/vm-language +/crates/telemetry-subscribers/ @iotaledger/core-protocol +/crates/test-cluster/ @iotaledger/infrastructure +/crates/typed-store/ @iotaledger/core-protocol +/crates/typed-store-derive/ @iotaledger/core-protocol +/crates/typed-store-error/ @iotaledger/core-protocol +/crates/typed-store-workspace-hack/ @iotaledger/core-protocol + +# Docker +/docker/ @iotaledger/infrastructure @iotaledger/node @iotaledger/devops-admin +/dev-tools/ @iotaledger/infrastructure @iotaledger/node @iotaledger/devops-admin +/setups/ @iotaledger/infrastructure @iotaledger/node @iotaledger/devops-admin # Frontend apps to be looked after by Boxfish Studio or the tooling team /apps/ @iotaledger/tooling @@ -57,7 +106,6 @@ prettier.config.js @iotaledger/tooling turbo.json @iotaledger/tooling vercel.json @iotaledger/tooling -# vm-language team # Needs to be after package.json ownership definition to override it /iota-execution/ @iotaledger/vm-language /external-crates/ @iotaledger/vm-language @@ -83,7 +131,23 @@ vercel.json @iotaledger/tooling /scripts/generate_files/ @muXxer /scripts/codesearch/ @muXxer /scripts/slipstream/ @muXxer +/scripts/tooling/ @iotaledger/tooling + +/kiosk/ @iotaledger/vm-language +/nre/ @iotaledger/node # Disable code ownership for these auto-generated files /Cargo.lock /pnpm-lock.yaml + +# TODO +# /crates/iota-bridge/ +# /crates/iota-bridge-cli/ +# /crates/iota-bridge-indexer/ +# /crates/iota-rosetta/ +# /crates/iota-source-validation-service/ +# /crates/iota-surfer/ +# /crates/iota-util-mem/ +# /crates/iota-util-mem-derive/ +# /crates/transaction-fuzzer/ +# /bridge/ \ No newline at end of file diff --git a/.github/actions/diffs/action.yml b/.github/actions/diffs/action.yml index f940c9b26d9..adc302f6e60 100644 --- a/.github/actions/diffs/action.yml +++ b/.github/actions/diffs/action.yml @@ -70,6 +70,8 @@ runs: - "dashboards/**" - "doc/**" - "docker/**" + - "dev-tools/**" + - "setups/**" - "external-crates/**" - "kiosk/**" - "nre/**" diff --git a/.github/crates-filters.yml b/.github/crates-filters.yml index 57a47dd7a25..d4afd5812bd 100644 --- a/.github/crates-filters.yml +++ b/.github/crates-filters.yml @@ -112,6 +112,8 @@ iota-protocol-config: - "crates/iota-protocol-config/**" iota-protocol-config-macros: - "crates/iota-protocol-config-macros/**" +iota-proxy: + - "crates/iota-proxy/**" iota-replay: - "crates/iota-replay/**" iota-rest-api: diff --git a/.github/labeler.yml b/.github/labeler.yml index 9c85e15b9f1..8617b1f2474 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -4,3 +4,37 @@ documentation: explorer: - changed-files: - any-glob-to-any-file: apps/explorer/**/* +wallet: + - changed-files: + - any-glob-to-any-file: apps/wallet/**/* +wallet-dashboard: + - changed-files: + - any-glob-to-any-file: apps/wallet-dashboard/**/* +ts-sdk: + - changed-files: + - any-glob-to-any-file: sdk/**/* +apps-ui-kit: + - changed-files: + - any-glob-to-any-file: apps/ui-kit/**/* +apps-backend: + - changed-files: + - any-glob-to-any-file: apps/apps-backend/**/* +tooling: + - changed-files: + - any-glob-to-any-file: | + sdk/** + apps/** + dapps/** + linting/** + .husky/** + .changeset/** + .eslintrc.js + .lintstagedrc.json + .npmrc + .prettierignore + graphql.config.ts + package.json + pnpm-workspace.yaml + prettier.config.js + turbo.json + vercel.json diff --git a/.github/scripts/rosetta/setup.sh b/.github/scripts/rosetta/setup.sh index b85acf125eb..b763b79e952 100755 --- a/.github/scripts/rosetta/setup.sh +++ b/.github/scripts/rosetta/setup.sh @@ -8,10 +8,7 @@ cargo install --locked --bin iota --path crates/iota cargo install --locked --bin iota-rosetta --path crates/iota-rosetta echo "run IOTA genesis" -CONFIG_DIR=~/.iota/iota_config -if ! [ -d "$CONFIG_DIR" ]; then - iota genesis -fi +iota genesis --force echo "generate rosetta configuration" iota-rosetta generate-rosetta-cli-config --online-url http://127.0.0.1:9002 --offline-url http://127.0.0.1:9003 diff --git a/.github/workflows/_e2e.yml b/.github/workflows/_e2e.yml index c40ca8da2de..973ccc0eea4 100644 --- a/.github/workflows/_e2e.yml +++ b/.github/workflows/_e2e.yml @@ -1,6 +1,7 @@ name: TS End-to-end Tests on: + workflow_dispatch: workflow_call: inputs: isRust: @@ -79,7 +80,7 @@ jobs: - name: Build apps-backend if: inputs.isAppsBackend || github.ref_name == 'develop' - run: pnpm --filter apps-backend build + run: pnpm turbo --filter apps-backend build - name: Run apps-backend e2e tests if: inputs.isAppsBackend || github.ref_name == 'develop' diff --git a/.github/workflows/_execution_cut.yml b/.github/workflows/_execution_cut.yml index 9c231940a39..b746b5895d9 100644 --- a/.github/workflows/_execution_cut.yml +++ b/.github/workflows/_execution_cut.yml @@ -12,11 +12,6 @@ jobs: runs-on: [self-hosted] steps: - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 - - name: Install cargo-hakari, and cache the binary - uses: baptiste0928/cargo-install@904927dbe77864e0f2281519fe9d5bd097a220b3 # v3.1.1 - with: - crate: cargo-hakari - locked: true - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 - name: Make cut run: ./scripts/execution_layer.py cut for_ci_test diff --git a/.github/workflows/_external_rust_tests.yml b/.github/workflows/_external_rust_tests.yml index cbb6ff968d0..be98867b4c4 100644 --- a/.github/workflows/_external_rust_tests.yml +++ b/.github/workflows/_external_rust_tests.yml @@ -27,9 +27,6 @@ jobs: runs-on: [self-hosted] steps: - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 - - uses: taiki-e/install-action@375e0c7f08a66b8c2ba7e7eef31a6f91043a81b0 # v2.44.38 - with: - tool: nextest - name: Install python dependencies run: pip install pyopenssl --upgrade --break-system-packages - name: cargo test diff --git a/.github/workflows/_move_tests.yml b/.github/workflows/_move_tests.yml index 54c8b002f08..11d685434bd 100644 --- a/.github/workflows/_move_tests.yml +++ b/.github/workflows/_move_tests.yml @@ -17,31 +17,23 @@ jobs: # to Move code but not Rust code (If there are Rust changes, they # will be run as part of a larger test suite). move-test: - timeout-minutes: 10 runs-on: [self-hosted] steps: - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 - - uses: taiki-e/install-action@375e0c7f08a66b8c2ba7e7eef31a6f91043a81b0 # v2.44.38 - with: - tool: nextest - name: Run move tests - run: | - cargo nextest run -E + run: > + cargo nextest run --profile ci -E 'package(iota-framework-tests) or (package(iota-core) and test(quorum_driver::)) or package(iota-benchmark) or test(move_tests::)' move-simtest: - timeout-minutes: 10 runs-on: [self-hosted] steps: - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 - - uses: taiki-e/install-action@375e0c7f08a66b8c2ba7e7eef31a6f91043a81b0 # v2.44.38 - with: - tool: nextest - name: Run move tests - run: | + run: > scripts/simtest/cargo-simtest simtest --profile ci -E 'package(iota-framework-tests) or (package(iota-core) and test(quorum_driver::)) diff --git a/.github/workflows/_rust_tests.yml b/.github/workflows/_rust_tests.yml index e781ff2ea97..84667b5fa68 100644 --- a/.github/workflows/_rust_tests.yml +++ b/.github/workflows/_rust_tests.yml @@ -39,10 +39,7 @@ jobs: runs-on: [self-hosted] steps: - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 - - uses: taiki-e/install-action@375e0c7f08a66b8c2ba7e7eef31a6f91043a81b0 # v2.44.38 - with: - tool: nextest - - name: cargo test + - name: cargo nextest run: | array=(${{ inputs.changedCrates }}) @@ -91,9 +88,6 @@ jobs: fail-fast: false steps: - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 - - uses: taiki-e/install-action@375e0c7f08a66b8c2ba7e7eef31a6f91043a81b0 # v2.44.38 - with: - tool: nextest - name: benchmark (smoke) run: | cargo run --package iota-benchmark --bin stress -- --log-path /tmp/stress.log --num-client-threads 10 --num-server-threads 24 --num-transfer-accounts 2 bench --target-qps 100 --num-workers 10 --transfer-object 50 --shared-counter 50 --run-duration 10s --stress-stat-collection @@ -103,11 +97,6 @@ jobs: - name: rustdoc run: | cargo doc --all-features --workspace --no-deps - - name: Install cargo-hakari, and cache the binary - uses: baptiste0928/cargo-install@904927dbe77864e0f2281519fe9d5bd097a220b3 # v3.1.1 - with: - crate: cargo-hakari - locked: true - name: Install nightly rustfmt run: rustup toolchain install nightly --component rustfmt --allow-downgrade - name: iota-execution @@ -126,9 +115,6 @@ jobs: MSIM_WATCHDOG_TIMEOUT_MS: 60000 steps: - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 - - uses: taiki-e/install-action@375e0c7f08a66b8c2ba7e7eef31a6f91043a81b0 # v2.44.38 - with: - tool: nextest - name: setup filter run: | array=(${{ inputs.changedCrates }}) @@ -185,9 +171,6 @@ jobs: - 5432:5432 steps: - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 - - uses: taiki-e/install-action@375e0c7f08a66b8c2ba7e7eef31a6f91043a81b0 # v2.44.38 - with: - tool: nextest - name: Install postgresql-client run: sudo apt-get install -y postgresql-client - name: Setup db @@ -202,6 +185,6 @@ jobs: cargo nextest run --no-fail-fast --test-threads 8 --package iota-graphql-e2e-tests --features pg_integration cargo nextest run --no-fail-fast --test-threads 1 --package iota-cluster-test --test local_cluster_test --features pg_integration cargo nextest run --no-fail-fast --test-threads 1 --package iota-indexer --test ingestion_tests --features pg_integration - # Iota-indexer's RPC tests, which depend on a shared runtime, are incompatible with nextest due to its process-per-test execution model. + # iota-indexer's RPC tests, which depend on a shared runtime, are incompatible with nextest due to its process-per-test execution model. # cargo test, on the other hand, allows tests to share state and resources by default. cargo test --profile simulator --package iota-indexer --test rpc-tests --features shared_test_runtime diff --git a/.github/workflows/_vercel_deploy.yml b/.github/workflows/_vercel_deploy.yml deleted file mode 100644 index ffdb8fda37f..00000000000 --- a/.github/workflows/_vercel_deploy.yml +++ /dev/null @@ -1,96 +0,0 @@ -name: Vercel Deploys - -on: - workflow_call: - inputs: - isExplorer: - type: boolean - required: true - isTypescriptSDK: - type: boolean - required: true - isAppsBackend: - type: boolean - required: true - isAppsUiKit: - type: boolean - required: true - isWalletDashboard: - type: boolean - required: true - shouldDeployPreview: - type: boolean - required: true - -concurrency: - group: vercel-deploy-${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} - cancel-in-progress: true - -jobs: - explorer-preview: - name: Vercel Explorer Preview - if: inputs.shouldDeployPreview && inputs.isExplorer - uses: ./.github/workflows/apps_explorer_deploy.yml - secrets: inherit - with: - isProd: false - isStaging: false - - explorer-staging: - name: Vercel Explorer Staging - if: github.ref_name == 'develop' - uses: ./.github/workflows/apps_explorer_deploy.yml - secrets: inherit - with: - isProd: false - isStaging: true - - ui-kit-preview: - name: Vercel UI Kit Preview - if: inputs.shouldDeployPreview && inputs.isAppsUiKit - uses: ./.github/workflows/apps_ui_kit_deploy.yml - secrets: inherit - with: - isProd: false - - ui-kit-prod: - name: Vercel UI Kit Production - if: github.ref_name == 'develop' - uses: ./.github/workflows/apps_ui_kit_deploy.yml - secrets: inherit - with: - isProd: true - - wallet-dashboard-preview: - name: Vercel Wallet Dashboard Preview - if: inputs.shouldDeployPreview && inputs.isWalletDashboard - uses: ./.github/workflows/apps_wallet_dashboard_deploy.yml - secrets: inherit - with: - isProd: false - isStaging: false - - wallet-dashboard-staging: - name: Vercel Wallet Dashboard Staging - if: github.ref_name == 'develop' - uses: ./.github/workflows/apps_wallet_dashboard_deploy.yml - secrets: inherit - with: - isProd: false - isStaging: true - - apps-backend-preview: - name: Vercel apps-backend Preview - if: inputs.shouldDeployPreview && inputs.isAppsBackend - uses: ./.github/workflows/apps_backend_deploy.yml - secrets: inherit - with: - isProd: false - - apps-backend-prod: - name: Vercel apps-backend Production - if: github.ref_name == 'develop' - uses: ./.github/workflows/apps_backend_deploy.yml - secrets: inherit - with: - isProd: true diff --git a/.github/workflows/apps_backend_deploy.yml b/.github/workflows/apps_backend_deploy.yml deleted file mode 100644 index 63c5b01a9e6..00000000000 --- a/.github/workflows/apps_backend_deploy.yml +++ /dev/null @@ -1,78 +0,0 @@ -name: Deploy for Apps Backend - -env: - VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }} - VERCEL_PROJECT_ID: ${{ secrets.APPS_BACKEND_VERCEL_PROJECT_ID }} - -on: - workflow_dispatch: - workflow_call: - inputs: - isProd: - type: boolean - required: true - -jobs: - deploy: - permissions: - contents: read - pull-requests: write - runs-on: [self-hosted] - steps: - - 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" - cache: "pnpm" - - name: Install dependencies - run: pnpm install --frozen-lockfile - - name: Setup Prod Flag - id: setup_prod_flags - run: | - if [[ "${{ inputs.isProd }}" = "true" ]]; then - echo "PROD_FLAG=--prod" >> $GITHUB_OUTPUT - echo "ENVIRONMENT=production" >> $GITHUB_OUTPUT - echo "VERCEL_OUTPUT=" >> $GITHUB_OUTPUT - else - echo "PROD_FLAG=" >> $GITHUB_OUTPUT - echo "ENVIRONMENT=preview" >> $GITHUB_OUTPUT - echo "VERCEL_OUTPUT=> vercel_output.txt" >> $GITHUB_OUTPUT - fi - - name: Turbo Cache - id: turbo-cache - uses: actions/cache@3624ceb22c1c5a301c8db4169662070a689d9ea8 # v4.1.1 - with: - path: node_modules/.cache/turbo - key: turbo-${{ runner.os }}-${{ github.sha }} - restore-keys: | - turbo-${{ runner.os }}- - - name: Install Vercel CLI - run: pnpm add --global vercel@canary - - name: Pull Vercel Env variables (network configs) - run: vercel pull --yes --environment=${{steps.setup_prod_flags.outputs.ENVIRONMENT}} --token=${{ secrets.VERCEL_TOKEN }} - - name: Build the Apps Backend - run: pnpm apps-backend build - - name: Build Vercel Project Artifacts - run: vercel build ${{steps.setup_prod_flags.outputs.PROD_FLAG}} --token=${{ secrets.VERCEL_TOKEN }} - - name: Deploy Project Artifacts to Vercel - run: vercel deploy ${{steps.setup_prod_flags.outputs.PROD_FLAG}} --prebuilt --token=${{ secrets.VERCEL_TOKEN }} ${{ steps.setup_prod_flags.outputs.VERCEL_OUTPUT }} - - name: Extract Deploy URL - id: deploy_url - if: ${{ inputs.isProd == false }} - run: echo "DEPLOY_URL=$(cat vercel_output.txt | awk 'END{print}')" >> $GITHUB_OUTPUT - - name: Comment on pull request - if: ${{ inputs.isProd == false }} - uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 - with: - github-token: ${{ secrets.GITHUB_TOKEN }} - script: | - const DEPLOY_URL = '${{ steps.deploy_url.outputs.DEPLOY_URL }}' - const COMMIT_SHA = '${{ github.event.pull_request.head.sha }}' - github.rest.issues.createComment({ - issue_number: context.issue.number, - owner: context.repo.owner, - repo: context.repo.repo, - body: `This pull request has been deployed to Vercel.\n\n\nLatest commit: ${COMMIT_SHA}\n\n:white_check_mark: Preview: ${DEPLOY_URL}` - }) diff --git a/.github/workflows/apps_explorer_deploy.yml b/.github/workflows/apps_explorer_deploy.yml deleted file mode 100644 index 0b57bb6b97c..00000000000 --- a/.github/workflows/apps_explorer_deploy.yml +++ /dev/null @@ -1,94 +0,0 @@ -name: Deploy for Explorer - -env: - VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }} - VERCEL_PROJECT_ID: ${{ secrets.EXPLORER_VERCEL_PROJECT_ID }} - EXPLORER_VERCEL_PROJECT_STAGING_URL: ${{ secrets.EXPLORER_VERCEL_PROJECT_STAGING_URL }} - -on: - workflow_dispatch: - inputs: - isProd: - type: boolean - required: true - isStaging: - type: boolean - required: true - workflow_call: - inputs: - isProd: - type: boolean - required: true - isStaging: - type: boolean - required: true - -jobs: - deploy: - permissions: - contents: read - pull-requests: write - runs-on: [self-hosted] - steps: - - 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" - cache: "pnpm" - - name: Install dependencies - run: pnpm install --frozen-lockfile - - name: Setup Prod Flag - id: setup_prod_flags - run: | - if [[ "${{ inputs.isProd }}" = "true" ]]; then - echo "PROD_FLAG=--prod" >> $GITHUB_OUTPUT - echo "ENVIRONMENT=production" >> $GITHUB_OUTPUT - echo "VERCEL_OUTPUT=" >> $GITHUB_OUTPUT - else - echo "PROD_FLAG=" >> $GITHUB_OUTPUT - echo "ENVIRONMENT=preview" >> $GITHUB_OUTPUT - echo "VERCEL_OUTPUT=> vercel_output.txt" >> $GITHUB_OUTPUT - fi - - name: Turbo Cache - id: turbo-cache - uses: actions/cache@3624ceb22c1c5a301c8db4169662070a689d9ea8 # v4.1.1 - with: - path: node_modules/.cache/turbo - key: turbo-${{ runner.os }}-${{ github.sha }} - restore-keys: | - turbo-${{ runner.os }}- - - name: Install Vercel CLI - run: pnpm add --global vercel@canary - - name: Pull Vercel Env variables (network configs) - run: vercel pull --yes --environment=${{steps.setup_prod_flags.outputs.ENVIRONMENT}} --token=${{ secrets.VERCEL_TOKEN }} - - name: Copy the .env file - run: cp ./.vercel/.env.${{steps.setup_prod_flags.outputs.ENVIRONMENT}}.local ./sdk/.env - - name: Build Explorer - run: pnpm explorer build - - name: Build Vercel Project Artifacts - run: vercel build ${{steps.setup_prod_flags.outputs.PROD_FLAG}} --token=${{ secrets.VERCEL_TOKEN }} - - name: Deploy Project Artifacts to Vercel - run: vercel deploy ${{steps.setup_prod_flags.outputs.PROD_FLAG}} --prebuilt --token=${{ secrets.VERCEL_TOKEN }} ${{ steps.setup_prod_flags.outputs.VERCEL_OUTPUT }} - - name: Extract Deploy URL - id: deploy_url - if: ${{ inputs.isProd == false }} - run: echo "DEPLOY_URL=$(cat vercel_output.txt | awk 'END{print}')" >> $GITHUB_OUTPUT - - name: Alias Staging deploy - if: ${{ inputs.isStaging }} - run: vercel alias ${{ steps.deploy_url.outputs.DEPLOY_URL }} $EXPLORER_VERCEL_PROJECT_STAGING_URL --token=${{ secrets.VERCEL_TOKEN }} --scope=${{ secrets.VERCEL_SCOPE }} - - name: Comment on pull request - if: ${{ inputs.isProd == false && inputs.isStaging == false }} - uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 - with: - github-token: ${{ secrets.GITHUB_TOKEN }} - script: | - const DEPLOY_URL = '${{ steps.deploy_url.outputs.DEPLOY_URL }}' - const COMMIT_SHA = '${{ github.event.pull_request.head.sha }}' - github.rest.issues.createComment({ - issue_number: context.issue.number, - owner: context.repo.owner, - repo: context.repo.repo, - body: `This pull request has been deployed to Vercel.\n\n\nLatest commit: ${COMMIT_SHA}\n\n:white_check_mark: Preview: ${DEPLOY_URL}` - }) diff --git a/.github/workflows/apps_explorer_prod_deploy.yml b/.github/workflows/apps_explorer_prod_deploy.yml new file mode 100644 index 00000000000..a47ed8bf829 --- /dev/null +++ b/.github/workflows/apps_explorer_prod_deploy.yml @@ -0,0 +1,44 @@ +name: Production Deploy for Explorer + +env: + VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }} + VERCEL_PROJECT_ID: ${{ secrets.EXPLORER_VERCEL_PROJECT_ID }} + +on: workflow_dispatch + +jobs: + deploy: + permissions: + contents: read + pull-requests: write + runs-on: [self-hosted] + steps: + - 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" + cache: "pnpm" + - name: Install dependencies + run: pnpm install --frozen-lockfile + - name: Turbo Cache + id: turbo-cache + uses: actions/cache@3624ceb22c1c5a301c8db4169662070a689d9ea8 # v4.1.1 + with: + path: node_modules/.cache/turbo + key: turbo-${{ runner.os }}-${{ github.sha }} + restore-keys: | + turbo-${{ runner.os }}- + - name: Install Vercel CLI + run: pnpm add --global vercel@canary + - name: Pull Vercel Env variables (network configs) + run: vercel pull --yes --environment=production --token=${{ secrets.VERCEL_TOKEN }} + - name: Copy the .env file + run: cp ./.vercel/.env.production.local ./sdk/.env + - name: Build Explorer + run: pnpm explorer build + - name: Build Vercel Project Artifacts + run: vercel build --prod --token=${{ secrets.VERCEL_TOKEN }} + - name: Deploy Project Artifacts to Vercel + run: vercel deploy --prod --prebuilt --token=${{ secrets.VERCEL_TOKEN }} diff --git a/.github/workflows/apps_ui_kit_deploy.yml b/.github/workflows/apps_ui_kit_deploy.yml deleted file mode 100644 index 3c2f4e753f5..00000000000 --- a/.github/workflows/apps_ui_kit_deploy.yml +++ /dev/null @@ -1,68 +0,0 @@ -name: Deploy for Apps UI Kit Storybook - -env: - VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }} - VERCEL_PROJECT_ID: ${{ secrets.APPS_UI_KIT_VERCEL_PROJECT_ID }} - -on: - workflow_dispatch: - workflow_call: - inputs: - isProd: - type: boolean - required: true - -jobs: - deploy: - permissions: - contents: read - pull-requests: write - runs-on: [self-hosted] - steps: - - 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" - cache: "pnpm" - - name: Install dependencies - run: pnpm install --frozen-lockfile - - name: Setup Prod Flag - id: setup_prod_flags - run: | - if [[ "${{ inputs.isProd }}" = "true" ]]; then - echo "PROD_FLAG=--prod" >> $GITHUB_OUTPUT - echo "ENVIRONMENT=production" >> $GITHUB_OUTPUT - echo "VERCEL_OUTPUT=" >> $GITHUB_OUTPUT - else - echo "PROD_FLAG=" >> $GITHUB_OUTPUT - echo "ENVIRONMENT=preview" >> $GITHUB_OUTPUT - echo "VERCEL_OUTPUT=> vercel_output.txt" >> $GITHUB_OUTPUT - fi - - name: Install Vercel CLI - run: pnpm add --global vercel@canary - - name: Pull Vercel Environment Information - run: vercel pull --cwd ./apps/ui-kit --yes --environment=${{steps.setup_prod_flags.outputs.ENVIRONMENT}} --token=${{ secrets.VERCEL_TOKEN }} - - name: Build Project Artifacts - run: vercel build ${{steps.setup_prod_flags.outputs.PROD_FLAG}} --cwd ./apps/ui-kit --token=${{ secrets.VERCEL_TOKEN }} - - name: Deploy Project Artifacts to Vercel - run: vercel deploy --cwd ./apps/ui-kit ${{steps.setup_prod_flags.outputs.PROD_FLAG}} --prebuilt --token=${{ secrets.VERCEL_TOKEN }} ${{ steps.setup_prod_flags.outputs.VERCEL_OUTPUT }} - - name: Extract Deploy URL - id: deploy_url - if: ${{ inputs.isProd == false }} - run: echo "DEPLOY_URL=$(cat vercel_output.txt | awk 'END{print}')" >> $GITHUB_OUTPUT - - name: Comment on pull request - if: ${{ inputs.isProd == false }} - uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 - with: - github-token: ${{ secrets.GITHUB_TOKEN }} - script: | - const DEPLOY_URL = '${{ steps.deploy_url.outputs.DEPLOY_URL }}' - const COMMIT_SHA = '${{ github.event.pull_request.head.sha }}' - github.rest.issues.createComment({ - issue_number: context.issue.number, - owner: context.repo.owner, - repo: context.repo.repo, - body: `This pull request has been deployed to Vercel.\n\n\nLatest commit: ${COMMIT_SHA}\n\n:white_check_mark: Preview: ${DEPLOY_URL}` - }) diff --git a/.github/workflows/apps_wallet_dashboard_deploy.yml b/.github/workflows/apps_wallet_dashboard_deploy.yml deleted file mode 100644 index f533776b7bb..00000000000 --- a/.github/workflows/apps_wallet_dashboard_deploy.yml +++ /dev/null @@ -1,94 +0,0 @@ -name: Deploy for Wallet Dashboard - -env: - VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }} - VERCEL_PROJECT_ID: ${{ secrets.WALLET_DASHBOARD_VERCEL_PROJECT_ID }} - WALLET_DASHBOARD_VERCEL_PROJECT_STAGING_URL: ${{ secrets.WALLET_DASHBOARD_VERCEL_PROJECT_STAGING_URL }} - -on: - workflow_dispatch: - inputs: - isProd: - type: boolean - required: true - isStaging: - type: boolean - required: true - workflow_call: - inputs: - isProd: - type: boolean - required: true - isStaging: - type: boolean - required: true - -jobs: - deploy: - permissions: - contents: read - pull-requests: write - runs-on: [self-hosted] - steps: - - 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" - cache: "pnpm" - - name: Install dependencies - run: pnpm install --frozen-lockfile - - name: Setup Prod Flag - id: setup_prod_flags - run: | - if [[ "${{ inputs.isProd }}" = "true" ]]; then - echo "PROD_FLAG=--prod" >> $GITHUB_OUTPUT - echo "ENVIRONMENT=production" >> $GITHUB_OUTPUT - echo "VERCEL_OUTPUT=" >> $GITHUB_OUTPUT - else - echo "PROD_FLAG=" >> $GITHUB_OUTPUT - echo "ENVIRONMENT=preview" >> $GITHUB_OUTPUT - echo "VERCEL_OUTPUT=> vercel_output.txt" >> $GITHUB_OUTPUT - fi - - name: Turbo Cache - id: turbo-cache - uses: actions/cache@3624ceb22c1c5a301c8db4169662070a689d9ea8 # v4.1.1 - with: - path: node_modules/.cache/turbo - key: turbo-${{ runner.os }}-${{ github.sha }} - restore-keys: | - turbo-${{ runner.os }}- - - name: Install Vercel CLI - run: pnpm add --global vercel@canary - - name: Pull Vercel Env variables (network configs) - run: vercel pull --yes --environment=${{steps.setup_prod_flags.outputs.ENVIRONMENT}} --token=${{ secrets.VERCEL_TOKEN }} - - name: Copy the .env file - run: cp ./.vercel/.env.${{steps.setup_prod_flags.outputs.ENVIRONMENT}}.local ./sdk/.env - - name: Build Wallet Dashboard - run: pnpm wallet-dashboard build - - name: Build Vercel Project Artifacts - run: vercel build ${{steps.setup_prod_flags.outputs.PROD_FLAG}} --token=${{ secrets.VERCEL_TOKEN }} - - name: Deploy Project Artifacts to Vercel - run: vercel deploy ${{steps.setup_prod_flags.outputs.PROD_FLAG}} --prebuilt --token=${{ secrets.VERCEL_TOKEN }} ${{ steps.setup_prod_flags.outputs.VERCEL_OUTPUT }} - - name: Extract Deploy URL - id: deploy_url - if: ${{ inputs.isProd == false }} - run: echo "DEPLOY_URL=$(cat vercel_output.txt | awk 'END{print}')" >> $GITHUB_OUTPUT - - name: Alias Staging deploy - if: ${{ inputs.isStaging }} - run: vercel alias ${{ steps.deploy_url.outputs.DEPLOY_URL }} $WALLET_DASHBOARD_VERCEL_PROJECT_STAGING_URL --token=${{ secrets.VERCEL_TOKEN }} --scope=${{ secrets.VERCEL_SCOPE }} - - name: Comment on pull request - if: ${{ inputs.isProd == false && inputs.isStaging == false }} - uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 - with: - github-token: ${{ secrets.GITHUB_TOKEN }} - script: | - const DEPLOY_URL = '${{ steps.deploy_url.outputs.DEPLOY_URL }}' - const COMMIT_SHA = '${{ github.event.pull_request.head.sha }}' - github.rest.issues.createComment({ - issue_number: context.issue.number, - owner: context.repo.owner, - repo: context.repo.repo, - body: `This pull request has been deployed to Vercel.\n\n\nLatest commit: ${COMMIT_SHA}\n\n:white_check_mark: Preview: ${DEPLOY_URL}` - }) diff --git a/.github/workflows/apps_wallet_dashboard_prod_deploy.yml b/.github/workflows/apps_wallet_dashboard_prod_deploy.yml new file mode 100644 index 00000000000..8662082ab5e --- /dev/null +++ b/.github/workflows/apps_wallet_dashboard_prod_deploy.yml @@ -0,0 +1,44 @@ +name: Production Deploy for Wallet Dashboard + +env: + VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }} + VERCEL_PROJECT_ID: ${{ secrets.WALLET_DASHBOARD_VERCEL_PROJECT_ID }} + +on: workflow_dispatch + +jobs: + deploy: + permissions: + contents: read + pull-requests: write + runs-on: [self-hosted] + steps: + - 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" + cache: "pnpm" + - name: Install dependencies + run: pnpm install --frozen-lockfile + - name: Turbo Cache + id: turbo-cache + uses: actions/cache@3624ceb22c1c5a301c8db4169662070a689d9ea8 # v4.1.1 + with: + path: node_modules/.cache/turbo + key: turbo-${{ runner.os }}-${{ github.sha }} + restore-keys: | + turbo-${{ runner.os }}- + - name: Install Vercel CLI + run: pnpm add --global vercel@canary + - name: Pull Vercel Env variables (network configs) + run: vercel pull --yes --environment=production --token=${{ secrets.VERCEL_TOKEN }} + - name: Copy the .env file + run: cp ./.vercel/.env.production.local ./sdk/.env + - name: Build Wallet Dashboard + run: pnpm wallet-dashboard build + - name: Build Vercel Project Artifacts + run: vercel build --prod --token=${{ secrets.VERCEL_TOKEN }} + - name: Deploy Project Artifacts to Vercel + run: vercel deploy --prod --prebuilt --token=${{ secrets.VERCEL_TOKEN }} diff --git a/.github/workflows/apps_wallet_prod_build.yml b/.github/workflows/apps_wallet_prod_build.yml index f4714cd53e1..9a8052331d8 100644 --- a/.github/workflows/apps_wallet_prod_build.yml +++ b/.github/workflows/apps_wallet_prod_build.yml @@ -20,6 +20,11 @@ jobs: steps: - name: Checking out the repository uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3.6.0 + with: + # Number of commits to fetch. 0 indicates all history for all branches and tags. Default: 1 + fetch-depth: 0 + # Whether to fetch tags, even if fetch-depth > 0. + fetch-tags: "true" - uses: pnpm/action-setup@fe02b34f77f8bc703788d5817da081398fad5dd2 # v4.0.0 - name: Install Nodejs uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2 @@ -61,8 +66,9 @@ jobs: echo "No previous tag found. Skipping changelog generation." echo "changelog=No previous tag found. Changelog generation skipped." >> $GITHUB_OUTPUT else - echo "## Changelog" >> CHANGELOG.md - git log ${{ env.PREV_TAG }}..${{ env.CURRENT_TAG }} --pretty=format:"- %s in #%h" -- ./apps/wallet > CHANGELOG.md + echo "## Changelog" > CHANGELOG.md + git log ${{ env.PREV_TAG }}..${{ env.CURRENT_TAG }} --pretty=format:"- %s in #%h" -- ./apps/wallet >> CHANGELOG.md + cat CHANGELOG.md fi - name: Get version from tag diff --git a/.github/workflows/cargo_llvm_cov.yml b/.github/workflows/cargo_llvm_cov.yml index 15000ad8e5b..fb9c241060c 100644 --- a/.github/workflows/cargo_llvm_cov.yml +++ b/.github/workflows/cargo_llvm_cov.yml @@ -42,11 +42,6 @@ jobs: - uses: bmwill/rust-cache@cb2cf0cc7c5198d3364b9630e2c3d457f160790c # v1.4.0 - - name: Install nextest and cargo-llvm-cov - uses: taiki-e/install-action@375e0c7f08a66b8c2ba7e7eef31a6f91043a81b0 # v2.44.38 - with: - tool: nextest,cargo-llvm-cov - - name: Set Swap Space uses: actionhippie/swap-space@73376950a0019f8e1f6a3d3d2673fe2aed74ae17 # v1.0.2 with: @@ -139,8 +134,7 @@ jobs: echo "Creating report (lcov.info)." LLVM_PROFILE_FILE="merged.profdata" cargo llvm-cov report \ --lcov \ - --output-path lcov.info \ - --ignore-filename-regex 'external-crates/.*' + --output-path lcov.info echo "Removing absolute path prefix: ${{ github.workspace }} from report." sed --in-place "s#${{ github.workspace }}#.#g" lcov.info diff --git a/.github/workflows/develop_ci_slack_report.yml b/.github/workflows/develop_ci_slack_report.yml index 1dc6c0561e1..0dce4cca323 100644 --- a/.github/workflows/develop_ci_slack_report.yml +++ b/.github/workflows/develop_ci_slack_report.yml @@ -18,4 +18,4 @@ jobs: message_format: ":fire: *${{github.event.workflow_run.name}}* ${{github.event.workflow_run.conclusion}} <${{github.server_url}}/${{github.repository}}/actions/runs/${{github.event.workflow_run.id}}|View Failure> author: ${{ github.event.workflow_run.head_commit.author.name }}" footer: "${{ github.event.workflow_run.display_title }} \n<${{github.server_url}}/${{github.repository}}/commit/${{github.event.workflow_run.head_commit.id}}>" env: - SLACK_WEBHOOK_URL: ${{ secrets.DEV_BROKEN_CI_SLACK_WEBHOOK }} + SLACK_WEBHOOK_URL: ${{ github.event.workflow_run.name == 'Nightly checks' && secrets.NIGHTLY_BROKEN_CI_SLACK_WEBHOOK || secrets.DEV_BROKEN_CI_SLACK_WEBHOOK }} diff --git a/.github/workflows/hierarchy.yml b/.github/workflows/hierarchy.yml index 45efa02e7ca..49658f11787 100644 --- a/.github/workflows/hierarchy.yml +++ b/.github/workflows/hierarchy.yml @@ -29,7 +29,6 @@ jobs: 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')) }} - isWalletDashboard: ${{ (steps.turbo.outputs.packages && contains(fromJson(steps.turbo.outputs.packages), 'wallet-dashboard')) }} 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: @@ -108,15 +107,12 @@ jobs: needs: - diff - dprint-format - - license-check - typos - if: | - !cancelled() && !failure() && - (needs.diff.outputs.isRosetta == 'true' || needs.diff.outputs.isRust == 'true') + if: needs.diff.outputs.isRosetta == 'true' || needs.diff.outputs.isRust == 'true' uses: ./.github/workflows/_rosetta.yml e2e: - if: (!github.event.pull_request.draft || github.ref_name == 'develop') + if: (!github.event.pull_request.draft && github.ref_name != 'develop') needs: - diff - dprint-format @@ -131,22 +127,6 @@ jobs: isTypescriptSDK: ${{ needs.diff.outputs.isTypescriptSDK == 'true' }} isGraphQlTransport: ${{ needs.diff.outputs.isGraphQlTransport == 'true' }} - vercel-deploy: - needs: - - diff - - dprint-format - - license-check - - typos - uses: ./.github/workflows/_vercel_deploy.yml - secrets: inherit - with: - shouldDeployPreview: ${{ github.event_name == 'pull_request' && github.event.pull_request.draft == false }} - isExplorer: ${{ needs.diff.outputs.isExplorer == 'true' }} - isTypescriptSDK: ${{ needs.diff.outputs.isTypescriptSDK == 'true' }} - isAppsBackend: ${{ needs.diff.outputs.isAppsBackend == 'true' }} - isAppsUiKit: ${{ needs.diff.outputs.isAppsUiKit == 'true' }} - isWalletDashboard: ${{ needs.diff.outputs.isWalletDashboard == 'true' }} - ledgernano: if: needs.diff.outputs.isLedgerjs == 'true' && github.event.pull_request.draft == false needs: @@ -172,15 +152,15 @@ jobs: needs: - diff - dprint-format - - license-check - typos + - license-check - docusaurus - docs-lint - turborepo - move-tests - rust + - rosetta - e2e - - vercel-deploy - ledgernano - move-ide steps: diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index 3e02cfc233f..2fcbcddd583 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -81,9 +81,6 @@ jobs: external-tests: uses: ./.github/workflows/_external_rust_tests.yml - move-tests: - uses: ./.github/workflows/_move_tests.yml - deny: uses: ./.github/workflows/_cargo_deny.yml @@ -109,8 +106,5 @@ jobs: - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 with: ref: ${{ env.IOTA_REF }} - - uses: taiki-e/install-action@375e0c7f08a66b8c2ba7e7eef31a6f91043a81b0 # v2.44.38 - with: - tool: nextest - name: Run simtest run: scripts/simtest/simtest-run.sh diff --git a/.github/workflows/release_docker.yml b/.github/workflows/release_docker.yml index 9acbe8dcc40..5f8ef7568de 100644 --- a/.github/workflows/release_docker.yml +++ b/.github/workflows/release_docker.yml @@ -87,7 +87,7 @@ jobs: with: context: . file: docker/iota-node/Dockerfile - platforms: linux/amd64 + platforms: linux/amd64,linux/arm64 tags: ${{ steps.meta-node.outputs.tags }} push: true pull: true @@ -156,7 +156,7 @@ jobs: with: context: . file: docker/iota-indexer/Dockerfile - platforms: linux/amd64 + platforms: linux/amd64,linux/arm64 tags: ${{ steps.meta-indexer.outputs.tags }} push: true pull: true @@ -225,7 +225,7 @@ jobs: with: context: . file: docker/iota-tools/Dockerfile - platforms: linux/amd64 + platforms: linux/amd64,linux/arm64 tags: ${{ steps.meta-tools.outputs.tags }} push: true pull: true @@ -294,7 +294,7 @@ jobs: with: context: . file: docker/iota-graphql-rpc/Dockerfile - platforms: linux/amd64 + platforms: linux/amd64,linux/arm64 tags: ${{ steps.meta-tools.outputs.tags }} push: true pull: true diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index f0c82a67fa7..878a13f48e2 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -14,11 +14,13 @@ jobs: - uses: actions/stale@28ca1036281a5e5922ead5184a1bbf96e5fc984e # v9.0.0 with: repo-token: ${{ secrets.GITHUB_TOKEN }} - days-before-stale: 60 - days-before-close: -1 + days-before-issue-stale: 180 + days-before-pr-stale: 60 + days-before-issue-close: 14 + days-before-pr-close: 14 + stale-issue-message: "This issue is stale because it has been open 180 days with no activity. Remove stale label or comment or this will be closed in 14 days." + stale-pr-message: "This PR is stale because it has been open 60 days with no activity. Remove stale label or comment or this will be closed in 14 days." + close-issue-message: "This issue was closed because it has been stalled for 14 days with no activity." + close-pr-message: "This PR was closed because it has been stalled for 14 days with no activity." exempt-all-milestones: true exempt-all-assignees: true - stale-issue-message: "This issue is stale because it has been open 60 days with no activity. Remove stale label or comment or this will be closed in 7 days." - stale-pr-message: "This PR is stale because it has been open 60 days with no activity. Remove stale label or comment or this will be closed in 7 days." - close-issue-message: "This issue was closed because it has been stalled for 7 days with no activity." - close-pr-message: "This PR was closed because it has been stalled for 7 days with no activity." diff --git a/.gitignore b/.gitignore index 642158476ae..e58897c6432 100644 --- a/.gitignore +++ b/.gitignore @@ -79,6 +79,6 @@ lcov.info *storybook.log # iota-private-network -docker/iota-private-network/data -docker/iota-private-network/configs/validators/validator* -docker/iota-private-network/configs/genesis/genesis.blob +dev-tools/iota-private-network/data +dev-tools/iota-private-network/configs/validators/validator* +dev-tools/iota-private-network/configs/genesis/genesis.blob diff --git a/.vscode/extensions.json b/.vscode/extensions.json index f29818dd52d..f9b31562ae4 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -1,6 +1,6 @@ { "recommendations": [ - "move.move-analyzer", + "iotaledger.iota-move", "rust-lang.rust-analyzer", "esbenp.prettier-vscode", "ms-playwright.playwright", diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 2b5e2c8a2b8..89198dfb4f9 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -4,7 +4,7 @@ Thanks for considering making a contribution to the IOTA network or its document ## Contribute to IOTA -See [IOTA Environment Setup](https://github.com/iotaledger/iota/blob/main/docs/content/guides/developer/getting-started/iota-environment.mdx) for approach to submitting code fixes and enhancements. +See [IOTA Environment Setup](https://github.com/iotaledger/iota/blob/develop/docs/content/developer/getting-started/iota-environment.mdx) for approach to submitting code fixes and enhancements. Found a bug or security vulnerability? Create a [GitHub issue](https://github.com/iotaledger/iota/issues/new/choose). diff --git a/Cargo.lock b/Cargo.lock index 550aa462be0..16c2287d34b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -173,7 +173,7 @@ dependencies = [ [[package]] name = "anemo" version = "0.0.0" -source = "git+https://github.com/mystenlabs/anemo.git?rev=dbb5a074c2d25660525ab5d36d65ff0cb8051949#dbb5a074c2d25660525ab5d36d65ff0cb8051949" +source = "git+https://github.com/mystenlabs/anemo.git?rev=e609f7697ed6169bf0760882a0b6c032a57e4f3b#e609f7697ed6169bf0760882a0b6c032a57e4f3b" dependencies = [ "anyhow", "async-trait", @@ -208,18 +208,18 @@ dependencies = [ [[package]] name = "anemo-build" version = "0.0.0" -source = "git+https://github.com/mystenlabs/anemo.git?rev=dbb5a074c2d25660525ab5d36d65ff0cb8051949#dbb5a074c2d25660525ab5d36d65ff0cb8051949" +source = "git+https://github.com/mystenlabs/anemo.git?rev=e609f7697ed6169bf0760882a0b6c032a57e4f3b#e609f7697ed6169bf0760882a0b6c032a57e4f3b" dependencies = [ "prettyplease", - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 2.0.77", ] [[package]] name = "anemo-cli" version = "0.0.0" -source = "git+https://github.com/mystenlabs/anemo.git?rev=dbb5a074c2d25660525ab5d36d65ff0cb8051949#dbb5a074c2d25660525ab5d36d65ff0cb8051949" +source = "git+https://github.com/mystenlabs/anemo.git?rev=e609f7697ed6169bf0760882a0b6c032a57e4f3b#e609f7697ed6169bf0760882a0b6c032a57e4f3b" dependencies = [ "anemo", "anemo-tower", @@ -235,7 +235,7 @@ dependencies = [ [[package]] name = "anemo-tower" version = "0.0.0" -source = "git+https://github.com/mystenlabs/anemo.git?rev=dbb5a074c2d25660525ab5d36d65ff0cb8051949#dbb5a074c2d25660525ab5d36d65ff0cb8051949" +source = "git+https://github.com/mystenlabs/anemo.git?rev=e609f7697ed6169bf0760882a0b6c032a57e4f3b#e609f7697ed6169bf0760882a0b6c032a57e4f3b" dependencies = [ "anemo", "bytes", @@ -425,7 +425,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" dependencies = [ - "quote 1.0.37", + "quote", "syn 1.0.109", ] @@ -437,8 +437,8 @@ checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" dependencies = [ "num-bigint 0.4.6", "num-traits", - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 1.0.109", ] @@ -510,8 +510,8 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ae3281bc6d0fd7e549af32b52511e1302185bd688fd3359fa36423346ff682ea" dependencies = [ - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 1.0.109", ] @@ -800,8 +800,8 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "726535892e8eae7e70657b4c8ea93d26b8553afb1ce617caee529ef96d7dee6c" dependencies = [ - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 1.0.109", "synstructure 0.12.6", ] @@ -812,8 +812,8 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2777730b2039ac0f95f093556e61b6d26cebed5393ca6f152717777cec3a42ed" dependencies = [ - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 1.0.109", ] @@ -917,8 +917,8 @@ dependencies = [ "async-graphql-parser", "darling 0.20.10", "proc-macro-crate 1.3.1", - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "strum 0.25.0", "syn 2.0.77", "thiserror", @@ -954,8 +954,8 @@ version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 2.0.77", ] @@ -976,8 +976,8 @@ version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 2.0.77", ] @@ -993,8 +993,8 @@ version = "0.1.83" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 2.0.77", ] @@ -1042,8 +1042,8 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c87f3f15e7794432337fc718554eaa4dc8f04c9677a950ffe366f20a162ae42" dependencies = [ - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 2.0.77", ] @@ -1805,8 +1805,8 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3deeecb812ca5300b7d3f66f730cc2ebd3511c3d36c691dd79c165d5b19a26e3" dependencies = [ - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 1.0.109", ] @@ -1831,7 +1831,7 @@ checksum = "230c5f1ca6a325a32553f8640d31ac9b49f2411e901e427570154868b46da4f7" [[package]] name = "bin-version" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "const-str", "git-version", @@ -1859,8 +1859,8 @@ dependencies = [ "lazycell", "peeking_take_while", "prettyplease", - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "regex", "rustc-hash 1.1.0", "shlex", @@ -1881,8 +1881,8 @@ dependencies = [ "lazycell", "log", "prettyplease", - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "regex", "rustc-hash 1.1.0", "shlex", @@ -2249,8 +2249,8 @@ checksum = "e10ca87c81aaa3a949dbbe2b5e6c2c45dbc94ba4897e45ea31ff9ec5087be3dc" dependencies = [ "cached_proc_macro_types", "darling 0.14.4", - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 1.0.109", ] @@ -2461,9 +2461,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.18" +version = "4.5.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0956a43b323ac1afaffc053ed5c4b7c1f1800bacd1683c353aabbb752515dd3" +checksum = "3135e7ec2ef7b10c6ed8950f0f792ed96ee093fa088608f1c76e569722700c84" dependencies = [ "clap_builder", "clap_derive", @@ -2471,15 +2471,24 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.18" +version = "4.5.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d72166dd41634086d5803a47eb71ae740e61d84709c36f3c34110173db3961b" +checksum = "30582fc632330df2bd26877bde0c1f4470d57c582bbc070376afcd04d8cb4838" dependencies = [ "anstream", "anstyle", "clap_lex", "strsim 0.11.1", - "terminal_size", + "terminal_size 0.4.1", +] + +[[package]] +name = "clap_complete" +version = "4.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac2e663e3e3bed2d32d065a8404024dad306e699a04263ec59919529f803aee9" +dependencies = [ + "clap", ] [[package]] @@ -2489,16 +2498,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab" dependencies = [ "heck 0.5.0", - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 2.0.77", ] [[package]] name = "clap_lex" -version = "0.7.2" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" +checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" [[package]] name = "clipboard-win" @@ -2666,7 +2675,7 @@ dependencies = [ name = "consensus-config" version = "0.1.0" dependencies = [ - "fastcrypto", + "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", "insta", "iota-network-stack", "rand 0.8.5", @@ -2688,7 +2697,7 @@ dependencies = [ "consensus-config", "dashmap", "enum_dispatch", - "fastcrypto", + "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", "futures", "http 1.1.0", "hyper 1.4.1", @@ -2843,6 +2852,15 @@ 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" @@ -3161,8 +3179,8 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 2.0.77", ] @@ -3179,6 +3197,19 @@ 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" @@ -3205,8 +3236,8 @@ dependencies = [ "darling 0.20.10", "once_cell", "ouroboros 0.18.4", - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "strsim 0.10.0", "syn 2.0.77", "thiserror", @@ -3231,7 +3262,7 @@ checksum = "25a69ecdf4aa110fed1c0c8de290bc8ccb2835388733cf2f418f0abdf6ff3899" dependencies = [ "cynic-codegen", "darling 0.20.10", - "quote 1.0.37", + "quote", "syn 2.0.77", ] @@ -3263,8 +3294,8 @@ checksum = "109c1ca6e6b7f82cc233a97004ea8ed7ca123a9af07a8230878fcfda9b158bf0" dependencies = [ "fnv", "ident_case", - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "strsim 0.10.0", "syn 1.0.109", ] @@ -3277,8 +3308,8 @@ checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" dependencies = [ "fnv", "ident_case", - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "strsim 0.11.1", "syn 2.0.77", ] @@ -3290,7 +3321,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4aab4dbc9f7611d8b55048a3a16d2d010c2c8334e46304b40ac1cc14bf3b48e" dependencies = [ "darling_core 0.14.4", - "quote 1.0.37", + "quote", "syn 1.0.109", ] @@ -3301,7 +3332,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core 0.20.10", - "quote 1.0.37", + "quote", "syn 2.0.77", ] @@ -3421,8 +3452,8 @@ version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" dependencies = [ - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 1.0.109", ] @@ -3432,8 +3463,8 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e79116f119dd1dba1abf1f3405f03b9b0e79a27a3883864bfebded8a3dc768cd" dependencies = [ - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 1.0.109", ] @@ -3443,8 +3474,8 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611" dependencies = [ - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 2.0.77", ] @@ -3454,9 +3485,9 @@ version = "0.99.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce" dependencies = [ - "convert_case", - "proc-macro2 1.0.86", - "quote 1.0.37", + "convert_case 0.4.0", + "proc-macro2", + "quote", "rustc_version", "syn 2.0.77", ] @@ -3476,10 +3507,10 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" dependencies = [ - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 2.0.77", - "unicode-xid 0.2.6", + "unicode-xid", ] [[package]] @@ -3509,8 +3540,8 @@ checksum = "e7f2c3de51e2ba6bf2a648285696137aaf0f5f487bcbea93972fe8a364e131a4" dependencies = [ "diesel_table_macro_syntax", "dsl_auto_type", - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 2.0.77", ] @@ -3650,8 +3681,8 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 2.0.77", ] @@ -3669,14 +3700,14 @@ checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" [[package]] name = "docs-examples" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "anyhow", "bcs", "bip32", "iota-keys", "iota-move-build", - "iota-sdk 0.8.0-alpha", + "iota-sdk 0.9.0-alpha", "move-binary-format", "move-core-types", "serde_json", @@ -3705,8 +3736,8 @@ dependencies = [ "darling 0.20.10", "either", "heck 0.5.0", - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 2.0.77", ] @@ -3943,8 +3974,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1e6a265c649f3f5979b601d26f1d05ada116434c87741c9493cb56218f76cbc" dependencies = [ "heck 0.5.0", - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 2.0.77", ] @@ -3962,8 +3993,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aa18ce2bc66555b3218614519ac839ddb759a7d6720732f979ef8d13be147ecd" dependencies = [ "once_cell", - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 2.0.77", ] @@ -3982,8 +4013,8 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3bf679796c0322556351f287a51b49e48f7c4986e727b5dd78c972d30e2e16cc" dependencies = [ - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 2.0.77", ] @@ -4149,8 +4180,8 @@ dependencies = [ "ethers-etherscan", "eyre", "prettyplease", - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "regex", "reqwest 0.11.27", "serde", @@ -4170,8 +4201,8 @@ dependencies = [ "const-hex", "ethers-contract-abigen", "ethers-core", - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "serde_json", "syn 2.0.77", ] @@ -4203,7 +4234,7 @@ dependencies = [ "tempfile", "thiserror", "tiny-keccak", - "unicode-xid 0.2.6", + "unicode-xid", ] [[package]] @@ -4384,6 +4415,58 @@ 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" @@ -4410,7 +4493,7 @@ dependencies = [ "ecdsa 0.16.9", "ed25519-consensus", "elliptic-curve 0.13.8", - "fastcrypto-derive", + "fastcrypto-derive 0.1.3 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", "generic-array", "hex", "hex-literal 0.4.1", @@ -4427,7 +4510,7 @@ dependencies = [ "secp256k1", "serde", "serde_json", - "serde_with", + "serde_with 3.9.0", "sha2 0.10.8", "sha3 0.10.8", "signature 2.2.0", @@ -4438,12 +4521,24 @@ 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" source = "git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597#5f2c63266a065996d53f98156f0412782b468597" dependencies = [ - "quote 1.0.37", + "quote", "syn 1.0.109", ] @@ -4454,7 +4549,7 @@ source = "git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f9 dependencies = [ "bcs", "digest 0.10.7", - "fastcrypto", + "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", "hex", "itertools 0.10.5", "rand 0.8.5", @@ -4472,7 +4567,7 @@ version = "0.1.0" source = "git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597#5f2c63266a065996d53f98156f0412782b468597" dependencies = [ "bcs", - "fastcrypto", + "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", "lazy_static", "num-bigint 0.4.6", "num-integer", @@ -4499,7 +4594,7 @@ dependencies = [ "blst", "byte-slice-cast", "derive_more 0.99.18", - "fastcrypto", + "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", "ff 0.13.0", "im", "itertools 0.12.1", @@ -4575,8 +4670,8 @@ dependencies = [ "num-bigint 0.3.3", "num-integer", "num-traits", - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 1.0.109", ] @@ -4798,8 +4893,8 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 2.0.77", ] @@ -4918,8 +5013,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f636605b743120a8d32ed92fc27b6cde1a769f8f936c065151eb66f88ded513c" dependencies = [ "proc-macro-error2", - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 2.0.77", ] @@ -4954,8 +5049,8 @@ version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53010ccb100b96a67bc32c0175f0ed1426b31b655d562898e57325f81c023ac0" dependencies = [ - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 2.0.77", ] @@ -5613,8 +5708,8 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 2.0.77", ] @@ -5716,8 +5811,8 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "11d7a9f6330b71fea57921c9b61c47ee6e84f72d394754eff6163ae67e7395eb" dependencies = [ - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 1.0.109", ] @@ -5843,7 +5938,7 @@ checksum = "8bb03732005da905c88227371639bf1ad885cc712789c011c31c5fb3ab3ccf02" [[package]] name = "iota" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "anemo", "anyhow", @@ -5858,12 +5953,13 @@ dependencies = [ "bip32", "camino", "clap", + "clap_complete", "colored", "csv", "datatest-stable", "diesel", "expect-test", - "fastcrypto", + "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", "fastcrypto-zkp", "fs_extra", "futures", @@ -5888,7 +5984,7 @@ dependencies = [ "iota-package-management", "iota-protocol-config", "iota-replay", - "iota-sdk 0.8.0-alpha", + "iota-sdk 0.9.0-alpha", "iota-simulator", "iota-source-validation", "iota-swarm", @@ -5967,7 +6063,7 @@ dependencies = [ [[package]] name = "iota-adapter-transactional-tests" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "datatest-stable", "iota-transactional-test-runner", @@ -5975,7 +6071,7 @@ dependencies = [ [[package]] name = "iota-analytics-indexer" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "anyhow", "arrow", @@ -5989,7 +6085,7 @@ dependencies = [ "clap", "csv", "eyre", - "fastcrypto", + "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", "gcp-bigquery-client", "iota-analytics-indexer-derive", "iota-config", @@ -6026,22 +6122,22 @@ dependencies = [ [[package]] name = "iota-analytics-indexer-derive" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 1.0.109", ] [[package]] name = "iota-archival" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "anyhow", "byteorder", "bytes", "ed25519-consensus", - "fastcrypto", + "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", "futures", "indicatif", "iota-config", @@ -6067,7 +6163,7 @@ dependencies = [ [[package]] name = "iota-authority-aggregation" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "futures", "iota-metrics", @@ -6078,7 +6174,7 @@ dependencies = [ [[package]] name = "iota-aws-orchestrator" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "async-trait", "aws-config", @@ -6109,7 +6205,7 @@ dependencies = [ [[package]] name = "iota-benchmark" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "anyhow", "async-trait", @@ -6131,7 +6227,7 @@ dependencies = [ "iota-metrics", "iota-network", "iota-protocol-config", - "iota-sdk 0.8.0-alpha", + "iota-sdk 0.9.0-alpha", "iota-simulator", "iota-storage", "iota-surfer", @@ -6159,7 +6255,7 @@ dependencies = [ [[package]] name = "iota-bridge" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "anyhow", "arc-swap", @@ -6172,7 +6268,7 @@ dependencies = [ "enum_dispatch", "ethers", "eyre", - "fastcrypto", + "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", "futures", "hex-literal 0.3.4", "iota-authority-aggregation", @@ -6181,7 +6277,7 @@ dependencies = [ "iota-json-rpc-types", "iota-keys", "iota-metrics", - "iota-sdk 0.8.0-alpha", + "iota-sdk 0.9.0-alpha", "iota-test-transaction-builder", "iota-types", "lru 0.12.4", @@ -6194,7 +6290,7 @@ dependencies = [ "reqwest 0.12.7", "serde", "serde_json", - "serde_with", + "serde_with 3.9.0", "shared-crypto", "tap", "telemetry-subscribers", @@ -6208,24 +6304,24 @@ dependencies = [ [[package]] name = "iota-bridge-cli" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "anyhow", "clap", "ethers", - "fastcrypto", + "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", "futures", "iota-bridge", "iota-config", "iota-json-rpc-types", "iota-keys", - "iota-sdk 0.8.0-alpha", + "iota-sdk 0.9.0-alpha", "iota-types", "move-core-types", "reqwest 0.12.7", "serde", "serde_json", - "serde_with", + "serde_with 3.9.0", "shared-crypto", "telemetry-subscribers", "tokio", @@ -6234,7 +6330,7 @@ dependencies = [ [[package]] name = "iota-bridge-indexer" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "anyhow", "async-trait", @@ -6250,7 +6346,7 @@ dependencies = [ "iota-indexer-builder", "iota-json-rpc-types", "iota-metrics", - "iota-sdk 0.8.0-alpha", + "iota-sdk 0.9.0-alpha", "iota-test-transaction-builder", "iota-types", "prometheus", @@ -6264,14 +6360,14 @@ dependencies = [ [[package]] name = "iota-cluster-test" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "anyhow", "async-trait", "clap", "derive_more 1.0.0", "diesel", - "fastcrypto", + "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", "futures", "iota-config", "iota-core", @@ -6282,7 +6378,7 @@ dependencies = [ "iota-json", "iota-json-rpc-types", "iota-keys", - "iota-sdk 0.8.0-alpha", + "iota-sdk 0.9.0-alpha", "iota-swarm", "iota-swarm-config", "iota-test-transaction-builder", @@ -6304,7 +6400,7 @@ dependencies = [ [[package]] name = "iota-common" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "futures", "parking_lot 0.12.3", @@ -6313,7 +6409,7 @@ dependencies = [ [[package]] name = "iota-config" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "anemo", "anyhow", @@ -6322,7 +6418,7 @@ dependencies = [ "consensus-config", "csv", "dirs 5.0.1", - "fastcrypto", + "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", "iota-genesis-common", "iota-keys", "iota-protocol-config", @@ -6333,14 +6429,14 @@ dependencies = [ "rand 0.8.5", "reqwest 0.12.7", "serde", - "serde_with", + "serde_with 3.9.0", "serde_yaml", "tracing", ] [[package]] name = "iota-core" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "anemo", "anyhow", @@ -6361,7 +6457,7 @@ dependencies = [ "enum_dispatch", "expect-test", "eyre", - "fastcrypto", + "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", "fastcrypto-tbls", "fastcrypto-zkp", "fs_extra", @@ -6419,7 +6515,7 @@ dependencies = [ "serde", "serde-reflection", "serde_json", - "serde_with", + "serde_with 3.9.0", "serde_yaml", "shared-crypto", "signature 1.6.4", @@ -6442,7 +6538,7 @@ dependencies = [ [[package]] name = "iota-cost" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "anyhow", "bcs", @@ -6497,7 +6593,7 @@ dependencies = [ [[package]] name = "iota-data-ingestion" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "anyhow", "async-trait", @@ -6525,13 +6621,14 @@ dependencies = [ "telemetry-subscribers", "tempfile", "tokio", + "tokio-util 0.7.12", "tracing", "url", ] [[package]] name = "iota-data-ingestion-core" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "anyhow", "async-trait", @@ -6552,13 +6649,14 @@ dependencies = [ "tap", "tempfile", "tokio", + "tokio-util 0.7.12", "tracing", "url", ] [[package]] name = "iota-e2e-tests" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "anyhow", "async-trait", @@ -6566,7 +6664,7 @@ dependencies = [ "bip32", "clap", "coset", - "fastcrypto", + "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", "fastcrypto-zkp", "fs_extra", "futures", @@ -6589,7 +6687,7 @@ dependencies = [ "iota-node", "iota-protocol-config", "iota-rest-api", - "iota-sdk 0.8.0-alpha", + "iota-sdk 0.9.0-alpha", "iota-simulator", "iota-storage", "iota-swarm", @@ -6620,7 +6718,7 @@ dependencies = [ [[package]] name = "iota-enum-compat-util" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "serde_yaml", ] @@ -6658,7 +6756,7 @@ dependencies = [ [[package]] name = "iota-faucet" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "anyhow", "async-recursion", @@ -6672,7 +6770,7 @@ dependencies = [ "iota-json-rpc-types", "iota-keys", "iota-metrics", - "iota-sdk 0.8.0-alpha", + "iota-sdk 0.9.0-alpha", "iota-types", "parking_lot 0.12.3", "prometheus", @@ -6696,7 +6794,7 @@ dependencies = [ [[package]] name = "iota-framework" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "anyhow", "bcs", @@ -6717,7 +6815,7 @@ dependencies = [ [[package]] name = "iota-framework-snapshot" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "anyhow", "bcs", @@ -6732,7 +6830,7 @@ dependencies = [ [[package]] name = "iota-framework-tests" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "datatest-stable", "iota-adapter-latest", @@ -6752,7 +6850,7 @@ dependencies = [ [[package]] name = "iota-genesis-builder" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "anyhow", "bcs", @@ -6760,7 +6858,7 @@ dependencies = [ "camino", "clap", "csv", - "fastcrypto", + "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", "flate2", "fs_extra", "iota-adapter-latest", @@ -6793,7 +6891,7 @@ dependencies = [ "schemars", "serde", "serde_json", - "serde_with", + "serde_with 3.9.0", "serde_yaml", "shared-crypto", "tempfile", @@ -6805,7 +6903,7 @@ dependencies = [ [[package]] name = "iota-genesis-common" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "iota-execution", "iota-protocol-config", @@ -6815,15 +6913,15 @@ dependencies = [ [[package]] name = "iota-graphql-config" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ - "quote 1.0.37", + "quote", "syn 1.0.109", ] [[package]] name = "iota-graphql-e2e-tests" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "datatest-stable", "iota-graphql-rpc", @@ -6834,7 +6932,7 @@ dependencies = [ [[package]] name = "iota-graphql-rpc" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "anyhow", "async-graphql", @@ -6852,7 +6950,7 @@ dependencies = [ "downcast", "either", "expect-test", - "fastcrypto", + "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", "fastcrypto-zkp", "futures", "hex", @@ -6873,7 +6971,7 @@ dependencies = [ "iota-package-resolver", "iota-protocol-config", "iota-rest-api", - "iota-sdk 0.8.0-alpha", + "iota-sdk 0.9.0-alpha", "iota-swarm-config", "iota-test-transaction-builder", "iota-types", @@ -6891,7 +6989,7 @@ dependencies = [ "reqwest 0.12.7", "serde", "serde_json", - "serde_with", + "serde_with 3.9.0", "serde_yaml", "serial_test", "shared-crypto", @@ -6913,7 +7011,7 @@ dependencies = [ [[package]] name = "iota-graphql-rpc-client" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "anyhow", "async-graphql", @@ -6928,14 +7026,14 @@ dependencies = [ [[package]] name = "iota-graphql-rpc-headers" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "axum", ] [[package]] name = "iota-indexer" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "anyhow", "async-trait", @@ -6948,7 +7046,7 @@ dependencies = [ "diesel", "diesel_migrations", "downcast", - "fastcrypto", + "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", "futures", "iota-config", "iota-data-ingestion-core", @@ -6964,7 +7062,7 @@ dependencies = [ "iota-package-resolver", "iota-protocol-config", "iota-rest-api", - "iota-sdk 0.8.0-alpha", + "iota-sdk 0.9.0-alpha", "iota-swarm-config", "iota-test-transaction-builder", "iota-transaction-builder", @@ -6982,7 +7080,7 @@ dependencies = [ "secrecy", "serde", "serde_json", - "serde_with", + "serde_with 3.9.0", "simulacrum", "tap", "telemetry-subscribers", @@ -6997,7 +7095,7 @@ dependencies = [ [[package]] name = "iota-indexer-builder" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "anyhow", "async-trait", @@ -7007,16 +7105,17 @@ dependencies = [ "prometheus", "telemetry-subscribers", "tokio", + "tokio-util 0.7.12", "tracing", ] [[package]] name = "iota-json" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "anyhow", "bcs", - "fastcrypto", + "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", "iota-framework", "iota-move-build", "iota-types", @@ -7031,7 +7130,7 @@ dependencies = [ [[package]] name = "iota-json-rpc" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "anyhow", "arc-swap", @@ -7041,7 +7140,7 @@ dependencies = [ "cached", "expect-test", "eyre", - "fastcrypto", + "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", "futures", "http-body 1.0.1", "hyper 1.4.1", @@ -7085,10 +7184,10 @@ dependencies = [ [[package]] name = "iota-json-rpc-api" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "anyhow", - "fastcrypto", + "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", "iota-json", "iota-json-rpc-types", "iota-metrics", @@ -7104,7 +7203,7 @@ dependencies = [ [[package]] name = "iota-json-rpc-tests" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "anyhow", "async-trait", @@ -7123,7 +7222,7 @@ dependencies = [ "iota-open-rpc", "iota-open-rpc-macros", "iota-protocol-config", - "iota-sdk 0.8.0-alpha", + "iota-sdk 0.9.0-alpha", "iota-simulator", "iota-swarm-config", "iota-test-transaction-builder", @@ -7142,13 +7241,13 @@ dependencies = [ [[package]] name = "iota-json-rpc-types" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "anyhow", "bcs", "colored", "enum_dispatch", - "fastcrypto", + "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", "iota-enum-compat-util", "iota-json", "iota-macros", @@ -7164,18 +7263,18 @@ dependencies = [ "schemars", "serde", "serde_json", - "serde_with", + "serde_with 3.9.0", "tabled", "tracing", ] [[package]] name = "iota-keys" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "anyhow", "bip32", - "fastcrypto", + "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", "iota-types", "rand 0.8.5", "regex", @@ -7190,7 +7289,7 @@ dependencies = [ [[package]] name = "iota-light-client" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "anyhow", "async-trait", @@ -7202,7 +7301,7 @@ dependencies = [ "iota-json-rpc-types", "iota-package-resolver", "iota-rest-api", - "iota-sdk 0.8.0-alpha", + "iota-sdk 0.9.0-alpha", "iota-types", "move-binary-format", "move-core-types", @@ -7214,7 +7313,7 @@ dependencies = [ [[package]] name = "iota-macros" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "futures", "iota-proc-macros", @@ -7224,7 +7323,7 @@ dependencies = [ [[package]] name = "iota-metric-checker" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "anyhow", "backoff", @@ -7245,7 +7344,7 @@ dependencies = [ [[package]] name = "iota-metrics" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "anemo", "anemo-tower", @@ -7268,7 +7367,7 @@ dependencies = [ [[package]] name = "iota-move" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "anyhow", "better_any", @@ -7306,10 +7405,10 @@ dependencies = [ [[package]] name = "iota-move-build" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "anyhow", - "fastcrypto", + "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", "iota-package-management", "iota-protocol-config", "iota-types", @@ -7329,7 +7428,7 @@ dependencies = [ [[package]] name = "iota-move-lsp" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "bin-version", "clap", @@ -7342,7 +7441,7 @@ version = "0.1.0" dependencies = [ "bcs", "better_any", - "fastcrypto", + "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", "fastcrypto-vdf", "fastcrypto-zkp", "indexmap 2.5.0", @@ -7360,7 +7459,7 @@ dependencies = [ [[package]] name = "iota-network" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "anemo", "anemo-build", @@ -7371,7 +7470,7 @@ dependencies = [ "bytes", "dashmap", "ed25519-consensus", - "fastcrypto", + "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", "fastcrypto-tbls", "futures", "governor", @@ -7398,7 +7497,7 @@ dependencies = [ [[package]] name = "iota-network-stack" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "anemo", "bcs", @@ -7421,7 +7520,7 @@ dependencies = [ [[package]] name = "iota-node" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "anemo", "anemo-tower", @@ -7433,7 +7532,7 @@ dependencies = [ "bin-version", "clap", "const-str", - "fastcrypto", + "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", "fastcrypto-zkp", "futures", "git-version", @@ -7471,12 +7570,12 @@ dependencies = [ [[package]] name = "iota-open-rpc" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "anyhow", "bcs", "clap", - "fastcrypto", + "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", "iota-json", "iota-json-rpc", "iota-json-rpc-api", @@ -7495,25 +7594,25 @@ dependencies = [ [[package]] name = "iota-open-rpc-macros" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "derive-syn-parse", "itertools 0.13.0", - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 1.0.109", "unescape", ] [[package]] name = "iota-package-dump" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "anyhow", "bcs", "cynic", "cynic-codegen", - "fastcrypto", + "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", "iota-types", "move-core-types", "reqwest 0.12.7", @@ -7524,11 +7623,11 @@ dependencies = [ [[package]] name = "iota-package-management" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "anyhow", "iota-json-rpc-types", - "iota-sdk 0.8.0-alpha", + "iota-sdk 0.9.0-alpha", "iota-types", "move-core-types", "move-package", @@ -7539,7 +7638,7 @@ dependencies = [ [[package]] name = "iota-package-resolver" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "async-trait", "bcs", @@ -7562,17 +7661,17 @@ dependencies = [ [[package]] name = "iota-proc-macros" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "msim-macros", - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 2.0.77", ] [[package]] name = "iota-protocol-config" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "clap", "insta", @@ -7580,22 +7679,66 @@ dependencies = [ "move-vm-config", "schemars", "serde", - "serde_with", + "serde_with 3.9.0", "tracing", ] [[package]] name = "iota-protocol-config-macros" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 1.0.109", ] +[[package]] +name = "iota-proxy" +version = "0.9.0-alpha" +dependencies = [ + "anyhow", + "axum", + "axum-extra", + "axum-server", + "bytes", + "clap", + "const-str", + "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", + "futures", + "git-version", + "hex", + "hyper 1.4.1", + "iota-metrics", + "iota-tls", + "iota-types", + "itertools 0.13.0", + "mime", + "multiaddr", + "once_cell", + "prometheus", + "prost", + "prost-build", + "protobuf", + "rand 0.8.5", + "reqwest 0.12.7", + "rustls 0.23.18", + "rustls-pemfile 2.1.3", + "serde", + "serde_json", + "serde_with 3.9.0", + "serde_yaml", + "snap", + "telemetry-subscribers", + "tokio", + "tower 0.4.13", + "tower-http", + "tracing", + "url", +] + [[package]] name = "iota-replay" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "anyhow", "async-recursion", @@ -7611,7 +7754,7 @@ dependencies = [ "iota-json-rpc-api", "iota-json-rpc-types", "iota-protocol-config", - "iota-sdk 0.8.0-alpha", + "iota-sdk 0.9.0-alpha", "iota-storage", "iota-transaction-checks", "iota-types", @@ -7627,7 +7770,7 @@ dependencies = [ "regex", "serde", "serde_json", - "serde_with", + "serde_with 3.9.0", "serde_yaml", "shared-crypto", "shellexpand", @@ -7642,14 +7785,14 @@ dependencies = [ [[package]] name = "iota-rest-api" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "anyhow", "async-trait", "axum", "bcs", "diffy", - "fastcrypto", + "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", "iota-network-stack", "iota-protocol-config", "iota-rust-sdk", @@ -7663,7 +7806,7 @@ dependencies = [ "schemars", "serde", "serde_json", - "serde_with", + "serde_with 3.9.0", "serde_yaml", "tap", "thiserror", @@ -7673,7 +7816,7 @@ dependencies = [ [[package]] name = "iota-rosetta" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "anyhow", "async-trait", @@ -7682,7 +7825,7 @@ dependencies = [ "bcs", "clap", "eyre", - "fastcrypto", + "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", "futures", "hyper 1.4.1", "iota-config", @@ -7691,7 +7834,7 @@ dependencies = [ "iota-metrics", "iota-move-build", "iota-node", - "iota-sdk 0.8.0-alpha", + "iota-sdk 0.9.0-alpha", "iota-swarm-config", "iota-types", "move-core-types", @@ -7715,7 +7858,7 @@ dependencies = [ [[package]] name = "iota-rpc-loadgen" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "anyhow", "async-trait", @@ -7725,7 +7868,7 @@ dependencies = [ "futures", "iota-json-rpc-types", "iota-keys", - "iota-sdk 0.8.0-alpha", + "iota-sdk 0.9.0-alpha", "iota-types", "itertools 0.13.0", "serde", @@ -7741,7 +7884,7 @@ dependencies = [ [[package]] name = "iota-rust-sdk" version = "0.0.0" -source = "git+https://github.com/iotaledger/iota-rust-sdk.git?rev=d605da95029e74376f0f39a95526bb1a5c0ebd7a#d605da95029e74376f0f39a95526bb1a5c0ebd7a" +source = "git+https://github.com/iotaledger/iota-rust-sdk.git?rev=2ba6b293bdede769a1d9b4d1aecaede2ff7682dd#2ba6b293bdede769a1d9b4d1aecaede2ff7682dd" dependencies = [ "base64ct", "bcs", @@ -7754,13 +7897,13 @@ dependencies = [ "serde", "serde_derive", "serde_json", - "serde_with", + "serde_with 3.9.0", "winnow 0.6.20", ] [[package]] name = "iota-sdk" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "anyhow", "async-trait", @@ -7769,7 +7912,7 @@ dependencies = [ "clap", "colored", "dirs 5.0.1", - "fastcrypto", + "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", "futures", "futures-core", "getset", @@ -7788,7 +7931,7 @@ dependencies = [ "rustls 0.23.18", "serde", "serde_json", - "serde_with", + "serde_with 3.9.0", "shared-crypto", "tempfile", "thiserror", @@ -7838,12 +7981,12 @@ dependencies = [ [[package]] name = "iota-simulator" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "anemo", "anemo-tower", "bcs", - "fastcrypto", + "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", "iota-framework", "iota-move-build", "iota-types", @@ -7860,7 +8003,7 @@ dependencies = [ [[package]] name = "iota-single-node-benchmark" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "async-trait", "bcs", @@ -7895,13 +8038,13 @@ dependencies = [ [[package]] name = "iota-snapshot" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "anyhow", "bcs", "byteorder", "bytes", - "fastcrypto", + "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", "futures", "indicatif", "integer-encoding", @@ -7923,7 +8066,7 @@ dependencies = [ [[package]] name = "iota-source-validation" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "anyhow", "colored", @@ -7933,7 +8076,7 @@ dependencies = [ "iota-json-rpc-types", "iota-move-build", "iota-package-management", - "iota-sdk 0.8.0-alpha", + "iota-sdk 0.9.0-alpha", "iota-test-transaction-builder", "iota-types", "move-binary-format", @@ -7955,7 +8098,7 @@ dependencies = [ [[package]] name = "iota-source-validation-service" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "anyhow", "axum", @@ -7971,7 +8114,7 @@ dependencies = [ "iota-metrics", "iota-move", "iota-move-build", - "iota-sdk 0.8.0-alpha", + "iota-sdk 0.9.0-alpha", "iota-source-validation", "jsonrpsee", "move-compiler", @@ -7994,7 +8137,7 @@ dependencies = [ [[package]] name = "iota-storage" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "anyhow", "async-trait", @@ -8007,7 +8150,7 @@ dependencies = [ "chrono", "clap", "eyre", - "fastcrypto", + "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", "futures", "hyper 1.4.1", "hyper-rustls 0.27.3", @@ -8048,7 +8191,7 @@ dependencies = [ [[package]] name = "iota-surfer" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "async-trait", "bcs", @@ -8077,7 +8220,7 @@ dependencies = [ [[package]] name = "iota-swarm" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "anyhow", "futures", @@ -8102,12 +8245,12 @@ dependencies = [ [[package]] name = "iota-swarm-config" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "anemo", "anyhow", "bcs", - "fastcrypto", + "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", "insta", "iota-config", "iota-execution", @@ -8120,7 +8263,7 @@ dependencies = [ "prometheus", "rand 0.8.5", "serde", - "serde_with", + "serde_with 3.9.0", "serde_yaml", "shared-crypto", "tempfile", @@ -8129,12 +8272,12 @@ dependencies = [ [[package]] name = "iota-test-transaction-builder" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "bcs", "iota-genesis-builder", "iota-move-build", - "iota-sdk 0.8.0-alpha", + "iota-sdk 0.9.0-alpha", "iota-types", "move-core-types", "shared-crypto", @@ -8142,13 +8285,13 @@ dependencies = [ [[package]] name = "iota-tls" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "anyhow", "axum", "axum-server", "ed25519 2.2.3", - "fastcrypto", + "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", "pkcs8 0.10.2", "rand 0.8.5", "rcgen", @@ -8163,7 +8306,7 @@ dependencies = [ [[package]] name = "iota-tool" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "anemo", "anemo-cli", @@ -8174,7 +8317,7 @@ dependencies = [ "colored", "comfy-table", "eyre", - "fastcrypto", + "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", "futures", "hex", "indicatif", @@ -8185,7 +8328,7 @@ dependencies = [ "iota-package-dump", "iota-protocol-config", "iota-replay", - "iota-sdk 0.8.0-alpha", + "iota-sdk 0.9.0-alpha", "iota-snapshot", "iota-storage", "iota-types", @@ -8208,7 +8351,7 @@ dependencies = [ [[package]] name = "iota-transaction-builder" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "anyhow", "async-trait", @@ -8224,7 +8367,7 @@ dependencies = [ [[package]] name = "iota-transaction-checks" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "fastcrypto-zkp", "iota-config", @@ -8238,7 +8381,7 @@ dependencies = [ [[package]] name = "iota-transactional-test-runner" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "anyhow", "async-trait", @@ -8247,7 +8390,7 @@ dependencies = [ "clap", "criterion", "eyre", - "fastcrypto", + "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", "futures", "iota-config", "iota-core", @@ -8287,7 +8430,7 @@ dependencies = [ [[package]] name = "iota-types" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "anemo", "anyhow", @@ -8304,7 +8447,7 @@ dependencies = [ "enum_dispatch", "expect-test", "eyre", - "fastcrypto", + "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", "fastcrypto-tbls", "fastcrypto-zkp", "hex", @@ -8350,7 +8493,7 @@ dependencies = [ "serde", "serde-name", "serde_json", - "serde_with", + "serde_with 3.9.0", "serde_yaml", "shared-crypto", "signature 1.6.4", @@ -8368,7 +8511,7 @@ dependencies = [ [[package]] name = "iota-upgrade-compatibility-transactional-tests" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "anyhow", "datatest-stable", @@ -8382,11 +8525,11 @@ dependencies = [ [[package]] name = "iota-util-mem" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "cfg-if", "ed25519-consensus", - "fastcrypto", + "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", "fastcrypto-tbls", "hashbrown 0.12.3", "impl-trait-for-tuples", @@ -8400,9 +8543,9 @@ dependencies = [ [[package]] name = "iota-util-mem-derive" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ - "proc-macro2 1.0.86", + "proc-macro2", "syn 1.0.109", "synstructure 0.12.6", ] @@ -8424,7 +8567,7 @@ dependencies = [ [[package]] name = "iota-verifier-transactional-tests" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "datatest-stable", "iota-transactional-test-runner", @@ -8712,8 +8855,8 @@ checksum = "fc660a9389e2748e794a40673a4155d501f32db667757cdb80edeff0306b489b" dependencies = [ "heck 0.5.0", "proc-macro-crate 3.2.0", - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 2.0.77", ] @@ -8870,7 +9013,7 @@ dependencies = [ "string_cache", "term", "tiny-keccak", - "unicode-xid 0.2.6", + "unicode-xid", "walkdir", ] @@ -9005,7 +9148,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]] @@ -9150,8 +9293,8 @@ dependencies = [ "beef", "fnv", "lazy_static", - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "regex-syntax 0.8.4", "syn 2.0.77", ] @@ -9318,7 +9461,7 @@ dependencies = [ "supports-color", "supports-hyperlinks", "supports-unicode", - "terminal_size", + "terminal_size 0.3.0", "textwrap", "thiserror", "unicode-width", @@ -9330,8 +9473,8 @@ version = "7.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcf09caffaac8068c346b6df2a7fc27a177fd20b39421a39ce0a211bde679a6c" dependencies = [ - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 2.0.77", ] @@ -9352,8 +9495,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ffb161cc72176cb37aa47f1fc520d3ef02263d67d661f44f05d05a079e1237fd" dependencies = [ "migrations_internals", - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", ] [[package]] @@ -9454,8 +9597,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22ce75669015c4f47b289fd4d4f56e894e4c96003ffdf3ac51313126f94c6cbb" dependencies = [ "cfg-if", - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 1.0.109", ] @@ -9890,7 +10033,7 @@ dependencies = [ name = "move-proc-macros" version = "0.1.0" dependencies = [ - "quote 1.0.37", + "quote", "syn 2.0.77", ] @@ -10127,8 +10270,8 @@ version = "0.1.0" source = "git+https://github.com/iotaledger/iota-sim.git?rev=f16ef50ba7d874fe1f0960f248f6c651a634d6a5#f16ef50ba7d874fe1f0960f248f6c651a634d6a5" dependencies = [ "darling 0.14.4", - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 1.0.109", ] @@ -10198,8 +10341,8 @@ checksum = "fc076939022111618a5026d3be019fd8b366e76314538ff9a1b59ffbcbf98bcd" dependencies = [ "proc-macro-crate 1.3.1", "proc-macro-error", - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 1.0.109", "synstructure 0.12.6", ] @@ -10263,8 +10406,8 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "254a5372af8fc138e36684761d3c0cdb758a4410e938babcff1c860ce14ddbfc" dependencies = [ - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 2.0.77", ] @@ -10594,8 +10737,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" dependencies = [ "proc-macro-crate 3.2.0", - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 2.0.77", ] @@ -10731,8 +10874,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "003b2be5c6c53c1cfeb0a238b8a1c3915cd410feb684457a36c10038f764bb1c" dependencies = [ "bytes", - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 1.0.109", ] @@ -10903,8 +11046,8 @@ checksum = "ec4c6225c69b4ca778c0aea097321a64c421cf4577b331c61b229267edabb6f8" dependencies = [ "heck 0.4.1", "proc-macro-error", - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 2.0.77", ] @@ -10916,9 +11059,9 @@ checksum = "39b0deead1528fd0e5947a8546a9642a9777c25f6e1e26f34c97b204bbb465bd" dependencies = [ "heck 0.4.1", "itertools 0.12.1", - "proc-macro2 1.0.86", + "proc-macro2", "proc-macro2-diagnostics", - "quote 1.0.37", + "quote", "syn 2.0.77", ] @@ -11015,8 +11158,8 @@ checksum = "e9567693dd2f9a4339cb0a54adfcc0cb431c0ac88b2e46c6ddfb5f5d11a1cc4f" dependencies = [ "proc-macro-crate 1.3.1", "proc-macro-error", - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 1.0.109", ] @@ -11075,8 +11218,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1557010476e0595c9b568d16dcfb81b93cdeb157612726f5170d31aa707bed27" dependencies = [ "proc-macro-crate 1.3.1", - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 1.0.109", ] @@ -11087,8 +11230,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d830939c76d294956402033aee57a6da7b438f2294eb94864c37b0569053a42c" dependencies = [ "proc-macro-crate 3.2.0", - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 1.0.109", ] @@ -11367,8 +11510,8 @@ checksum = "94429506bde1ca69d1b5601962c73f4172ab4726571a59ea95931218cb0e930e" dependencies = [ "pest", "pest_meta", - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 2.0.77", ] @@ -11441,8 +11584,8 @@ checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b" dependencies = [ "phf_generator", "phf_shared 0.11.2", - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 2.0.77", ] @@ -11479,8 +11622,8 @@ version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 2.0.77", ] @@ -11738,7 +11881,7 @@ version = "0.2.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "479cf940fbbb3426c32c5d5176f62ad57549a0bb84773423ba8be9d089f5faba" dependencies = [ - "proc-macro2 1.0.86", + "proc-macro2", "syn 2.0.77", ] @@ -11817,8 +11960,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" dependencies = [ "proc-macro-error-attr", - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 1.0.109", "version_check", ] @@ -11829,8 +11972,8 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" dependencies = [ - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "version_check", ] @@ -11840,8 +11983,8 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" dependencies = [ - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", ] [[package]] @@ -11851,20 +11994,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" dependencies = [ "proc-macro-error-attr2", - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 2.0.77", ] -[[package]] -name = "proc-macro2" -version = "0.4.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" -dependencies = [ - "unicode-xid 0.1.0", -] - [[package]] name = "proc-macro2" version = "1.0.86" @@ -11880,8 +12014,8 @@ version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" dependencies = [ - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 2.0.77", "version_check", "yansi 1.0.1", @@ -11904,7 +12038,7 @@ dependencies = [ [[package]] name = "prometheus-closure-metric" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "anyhow", "prometheus", @@ -11959,13 +12093,13 @@ dependencies = [ [[package]] name = "proptest-derive" -version = "0.3.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90b46295382dc76166cb7cf2bb4a97952464e4b7ed5a43e6cd34e1fec3349ddc" +checksum = "4ee1c9ac207483d5e7db4940700de86a9aae46ef90c48b57f99fe7edb8345e49" dependencies = [ - "proc-macro2 0.4.30", - "quote 0.6.13", - "syn 0.15.44", + "proc-macro2", + "quote", + "syn 2.0.77", ] [[package]] @@ -12007,8 +12141,8 @@ checksum = "e9552f850d5f0964a4e4d0bf306459ac29323ddfbae05e35a7c0d35cb0803cc5" dependencies = [ "anyhow", "itertools 0.13.0", - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 2.0.77", ] @@ -12125,22 +12259,13 @@ dependencies = [ "windows-sys 0.59.0", ] -[[package]] -name = "quote" -version = "0.6.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce23b6b870e8f94f81fb0a363d65d86675884b34a09043c81e5562f11c1f8e1" -dependencies = [ - "proc-macro2 0.4.30", -] - [[package]] name = "quote" version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" dependencies = [ - "proc-macro2 1.0.86", + "proc-macro2", ] [[package]] @@ -12347,8 +12472,8 @@ version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a25d631e41bfb5fdcde1d4e2215f62f7f0afa3ff11e26563765bd6ea1d229aeb" dependencies = [ - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 2.0.77", ] @@ -12413,8 +12538,8 @@ version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bcc303e793d3734489387d205e9b186fac9c6cfacedd98cbb2e8a5943595f3e6" dependencies = [ - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 2.0.77", ] @@ -12685,8 +12810,8 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e33d7b2abe0c340d8797fe2907d3f20d3b5ea5908683618bfe80df7f621f672a" dependencies = [ - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 1.0.109", ] @@ -12789,8 +12914,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7229b505ae0706e64f37ffc54a9c163e11022a6636d58fe1f3f52018257ff9f7" dependencies = [ "cfg-if", - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "rustc_version", "syn 1.0.109", "unicode-ident", @@ -13176,8 +13301,8 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5af959c8bf6af1aff6d2b463a57f71aae53d1332da58419e30ad8dc7011d951" dependencies = [ - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 2.0.77", ] @@ -13233,8 +13358,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2d35494501194174bda522a32605929eefc9ecf7e0a326c26db1fdd85881eb62" dependencies = [ "proc-macro-crate 3.2.0", - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 1.0.109", ] @@ -13275,8 +13400,8 @@ version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b1eee588578aff73f856ab961cd2f79e36bc45d7ded33a7562adba4667aecc0e" dependencies = [ - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "serde_derive_internals", "syn 2.0.77", ] @@ -13480,8 +13605,8 @@ version = "1.0.210" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" dependencies = [ - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 2.0.77", ] @@ -13491,8 +13616,8 @@ version = "0.29.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 2.0.77", ] @@ -13525,8 +13650,8 @@ version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 2.0.77", ] @@ -13551,6 +13676,22 @@ 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" @@ -13565,10 +13706,22 @@ dependencies = [ "serde", "serde_derive", "serde_json", - "serde_with_macros", + "serde_with_macros 3.9.0", "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" @@ -13576,8 +13729,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8fee4991ef4f274617a51ad4af30519438dacb2f56ac773b08a1922ff743350" dependencies = [ "darling 0.20.10", - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 2.0.77", ] @@ -13623,8 +13776,8 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "91d129178576168c589c9ec973feedf7d3126c01ac2bf08795109aa35b69fb8f" dependencies = [ - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 2.0.77", ] @@ -13707,11 +13860,11 @@ dependencies = [ [[package]] name = "shared-crypto" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "bcs", "eyre", - "fastcrypto", + "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", "serde", "serde_repr", ] @@ -13843,12 +13996,12 @@ dependencies = [ [[package]] name = "simulacrum" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "anyhow", "async-trait", "bcs", - "fastcrypto", + "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", "futures", "iota-config", "iota-execution", @@ -13943,8 +14096,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "990079665f075b699031e9c08fd3ab99be5029b96f3b78dc0709e8f77e4efebf" dependencies = [ "heck 0.4.1", - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 1.0.109", ] @@ -13955,8 +14108,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "03c3c6b7927ffe7ecaa769ee0e3994da3b8cafc8f444578982c83ecb161af917" dependencies = [ "heck 0.5.0", - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 2.0.77", ] @@ -14045,7 +14198,7 @@ dependencies = [ "lalrpop-util", "phf", "thiserror", - "unicode-xid 0.2.6", + "unicode-xid", ] [[package]] @@ -14202,8 +14355,8 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2835db23c4724c05a2f85b81c4681f4aa8ea158edc8a7f4ad791c916fb766c2e" dependencies = [ - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 1.0.109", ] @@ -14297,8 +14450,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59" dependencies = [ "heck 0.4.1", - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "rustversion", "syn 1.0.109", ] @@ -14310,8 +14463,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0" dependencies = [ "heck 0.4.1", - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "rustversion", "syn 2.0.77", ] @@ -14323,8 +14476,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" dependencies = [ "heck 0.5.0", - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "rustversion", "syn 2.0.77", ] @@ -14415,25 +14568,14 @@ dependencies = [ "symbolic-common", ] -[[package]] -name = "syn" -version = "0.15.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ca4b3b69a77cbe1ffc9e198781b7acb0c7365a883670e8f1c1bc66fba79a5c5" -dependencies = [ - "proc-macro2 0.4.30", - "quote 0.6.13", - "unicode-xid 0.1.0", -] - [[package]] name = "syn" version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "unicode-ident", ] @@ -14443,8 +14585,8 @@ version = "2.0.77" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9f35bcdf61fd8e7be6caf75f429fdca8beb3ed76584befb503b1569faee373ed" dependencies = [ - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "unicode-ident", ] @@ -14469,10 +14611,10 @@ version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" dependencies = [ - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 1.0.109", - "unicode-xid 0.2.6", + "unicode-xid", ] [[package]] @@ -14481,8 +14623,8 @@ version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 2.0.77", ] @@ -14540,8 +14682,8 @@ checksum = "99f688a08b54f4f02f0a3c382aefdb7884d3d69609f785bd253dc033243e3fe4" dependencies = [ "heck 0.4.1", "proc-macro-error", - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 1.0.109", ] @@ -14570,7 +14712,7 @@ dependencies = [ [[package]] name = "telemetry-subscribers" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "atomic_float", "bytes", @@ -14638,6 +14780,16 @@ dependencies = [ "windows-sys 0.48.0", ] +[[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 = "termtree" version = "0.4.1" @@ -14646,11 +14798,11 @@ checksum = "3369f5ac52d5eb6ab48c6b4ffdc8efbcad6b89c765749064ba298f2c68a16a76" [[package]] name = "test-cluster" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "anyhow", "bcs", - "fastcrypto", + "fastcrypto 0.1.8 (git+https://github.com/MystenLabs/fastcrypto?rev=5f2c63266a065996d53f98156f0412782b468597)", "fastcrypto-zkp", "futures", "iota-bridge", @@ -14666,7 +14818,7 @@ dependencies = [ "iota-metrics", "iota-node", "iota-protocol-config", - "iota-sdk 0.8.0-alpha", + "iota-sdk 0.9.0-alpha", "iota-simulator", "iota-swarm", "iota-swarm-config", @@ -14699,8 +14851,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48db3bbc562408b2111f3a0c96ec416ffa3ab66f8a6ab42579b608b9f74744e1" dependencies = [ "cargo_metadata 0.15.4", - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "serde", "strum_macros 0.24.3", ] @@ -14715,8 +14867,8 @@ dependencies = [ "if_chain", "itertools 0.10.5", "lazy_static", - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "subprocess", "syn 2.0.77", "test-fuzz-internal", @@ -14763,8 +14915,8 @@ version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3" dependencies = [ - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 2.0.77", ] @@ -14798,6 +14950,24 @@ 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" @@ -14919,8 +15089,8 @@ version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 2.0.77", ] @@ -14929,8 +15099,8 @@ name = "tokio-macros" version = "2.4.0" source = "git+https://github.com/iotaledger/tokio-madsim-fork.git?branch=main#e34a35287024b341db16139a402508aaea8ec955" dependencies = [ - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 2.0.77", ] @@ -15144,9 +15314,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fe4ee8877250136bd7e3d2331632810a4df4ea5e004656990d8d66d2f5ee8a67" dependencies = [ "prettyplease", - "proc-macro2 1.0.86", + "proc-macro2", "prost-build", - "quote 1.0.37", + "quote", "syn 2.0.77", ] @@ -15286,8 +15456,8 @@ version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 2.0.77", ] @@ -15390,14 +15560,14 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b79e2e9c9ab44c6d7c20d5976961b47e8f49ac199154daa514b77cd1ab536625" dependencies = [ - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 1.0.109", ] [[package]] name = "transaction-fuzzer" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "iota-core", "iota-move-build", @@ -15497,13 +15667,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675" dependencies = [ "cfg-if", - "rand 0.7.3", + "rand 0.8.5", "static_assertions", ] [[package]] name = "typed-store" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "async-trait", "bcs", @@ -15534,17 +15704,17 @@ dependencies = [ [[package]] name = "typed-store-derive" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "itertools 0.13.0", - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 1.0.109", ] [[package]] name = "typed-store-error" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "serde", "thiserror", @@ -15552,7 +15722,7 @@ dependencies = [ [[package]] name = "typed-store-workspace-hack" -version = "0.8.0-alpha" +version = "0.9.0-alpha" dependencies = [ "libc", "memchr", @@ -15582,7 +15752,7 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a615d6c2764852a2e88a4f16e9ce1ea49bb776b5872956309e170d63a042a34f" dependencies = [ - "quote 1.0.37", + "quote", "syn 2.0.77", ] @@ -15658,12 +15828,6 @@ version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" -[[package]] -name = "unicode-xid" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" - [[package]] name = "unicode-xid" version = "0.2.6" @@ -15788,7 +15952,7 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aae2faf80ac463422992abf4de234731279c058aaf33171ca70277c98406b124" dependencies = [ - "quote 1.0.37", + "quote", "syn 1.0.109", ] @@ -15892,8 +16056,8 @@ dependencies = [ "bumpalo", "log", "once_cell", - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 2.0.77", "wasm-bindgen-shared", ] @@ -15916,7 +16080,7 @@ version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" dependencies = [ - "quote 1.0.37", + "quote", "wasm-bindgen-macro-support", ] @@ -15926,8 +16090,8 @@ version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" dependencies = [ - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 2.0.77", "wasm-bindgen-backend", "wasm-bindgen-shared", @@ -16122,8 +16286,8 @@ version = "0.57.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9107ddc059d5b6fbfbffdfa7a7fe3e22a226def0b2608f72e9d552763d3e1ad7" dependencies = [ - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 2.0.77", ] @@ -16133,8 +16297,8 @@ version = "0.57.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "29bee4b38ea3cde66011baa44dba677c432a78593e202392d1e9070cf2a7fca7" dependencies = [ - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 2.0.77", ] @@ -16523,8 +16687,8 @@ version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" dependencies = [ - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 2.0.77", "synstructure 0.13.1", ] @@ -16572,8 +16736,8 @@ version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 2.0.77", ] @@ -16592,8 +16756,8 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" dependencies = [ - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 2.0.77", "synstructure 0.13.1", ] @@ -16614,8 +16778,8 @@ version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 2.0.77", ] @@ -16636,8 +16800,8 @@ version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ - "proc-macro2 1.0.86", - "quote 1.0.37", + "proc-macro2", + "quote", "syn 2.0.77", ] diff --git a/Cargo.toml b/Cargo.toml index 9dbfc1385f2..be2b62e55c7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -116,6 +116,7 @@ members = [ "crates/iota-proc-macros", "crates/iota-protocol-config", "crates/iota-protocol-config-macros", + "crates/iota-proxy", "crates/iota-replay", "crates/iota-rest-api", "crates/iota-rosetta", @@ -152,6 +153,8 @@ members = [ "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", @@ -161,7 +164,7 @@ members = [ [workspace.package] # This version string will be inherited by iota-core, iota-faucet, iota-node, iota-tools, iota-sdk, iota-move-build, and iota crates. -version = "0.8.0-alpha" +version = "0.9.0-alpha" [profile.release] # debug = 1 means line charts only, which is minimum needed for good stack traces @@ -204,9 +207,9 @@ unexpected_cfgs = { level = "warn", check-cfg = ['cfg(msim)', 'cfg(fail_points)' [workspace.dependencies] # external dependencies # anemo dependencies -anemo = { git = "https://github.com/mystenlabs/anemo.git", rev = "dbb5a074c2d25660525ab5d36d65ff0cb8051949" } -anemo-build = { git = "https://github.com/mystenlabs/anemo.git", rev = "dbb5a074c2d25660525ab5d36d65ff0cb8051949" } -anemo-tower = { git = "https://github.com/mystenlabs/anemo.git", rev = "dbb5a074c2d25660525ab5d36d65ff0cb8051949" } +anemo = { git = "https://github.com/mystenlabs/anemo.git", rev = "e609f7697ed6169bf0760882a0b6c032a57e4f3b" } +anemo-build = { git = "https://github.com/mystenlabs/anemo.git", rev = "e609f7697ed6169bf0760882a0b6c032a57e4f3b" } +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" @@ -215,6 +218,7 @@ async-trait = "0.1.61" aws-config = "0.56" axum = { version = "0.7", default-features = false, features = ["tokio", "http1", "http2", "json", "matched-path", "original-uri", "form", "query", "ws"] } axum-extra = { version = "0.9", features = ["typed-header"] } +axum-server = { git = "https://github.com/bmwill/axum-server.git", rev = "f44323e271afdd1365fd0c8b0a4c0bbdf4956cb7", version = "0.6", default-features = false, features = ["tls-rustls"] } backoff = { version = "0.4.0", features = ["futures", "futures-core", "pin-project-lite", "tokio", "tokio_1"] } base64 = "0.21.2" base64-url = "2" @@ -291,8 +295,9 @@ pretty_assertions = "1.3.0" proc-macro2 = "1.0.47" prometheus = "0.13.3" proptest = "1.1.0" -proptest-derive = "0.3.0" +proptest-derive = "0.5.1" prost = "0.13" +protobuf = { version = "2.28", features = ["with-bytes"] } quinn-proto = "0.11.6" quote = "1.0.23" rand = "0.8.5" @@ -409,7 +414,7 @@ iota-rosetta = { path = "crates/iota-rosetta" } iota-rpc-loadgen = { path = "crates/iota-rpc-loadgen" } iota-sdk = { path = "crates/iota-sdk" } # core-types with json format for REST API -iota-sdk2 = { package = "iota-rust-sdk", git = "https://github.com/iotaledger/iota-rust-sdk.git", rev = "d605da95029e74376f0f39a95526bb1a5c0ebd7a", features = ["hash", "serde", "schemars"] } +iota-sdk2 = { package = "iota-rust-sdk", git = "https://github.com/iotaledger/iota-rust-sdk.git", rev = "2ba6b293bdede769a1d9b4d1aecaede2ff7682dd", features = ["hash", "serde", "schemars"] } iota-simulator = { path = "crates/iota-simulator" } iota-snapshot = { path = "crates/iota-snapshot" } iota-source-validation = { path = "crates/iota-source-validation" } diff --git a/apps/apps-backend/jest-e2e.json b/apps/apps-backend/jest-e2e.json index 8a02f0e8a41..a3ce13344dd 100644 --- a/apps/apps-backend/jest-e2e.json +++ b/apps/apps-backend/jest-e2e.json @@ -1,13 +1,13 @@ { - "moduleFileExtensions": ["js", "json", "ts"], - "rootDir": "./", - "testRegex": ".e2e-spec.ts$", - "transform": { - "^.+\\.(t|j)s$": "ts-jest" - }, - "testEnvironment": "node", - "moduleNameMapper": { - "^src/(.*)$": "/dist/$1", - "^@iota/core/(.*)$": "/dist/core/src/$1" - } + "moduleFileExtensions": ["js", "json", "ts"], + "rootDir": "./", + "testRegex": ".e2e-spec.ts$", + "transform": { + "^.+\\.(t|j)s$": "ts-jest" + }, + "testEnvironment": "node", + "moduleNameMapper": { + "^src/(.*)$": "/dist/$1", + "^@iota/core/(.*)$": "/dist/core/src/$1" + } } diff --git a/apps/apps-backend/src/app.module.ts b/apps/apps-backend/src/app.module.ts index b7fd88272e7..d9272d12ba0 100644 --- a/apps/apps-backend/src/app.module.ts +++ b/apps/apps-backend/src/app.module.ts @@ -8,7 +8,7 @@ import { ConfigModule } from '@nestjs/config'; import { AnalyticsModule } from './analytics/analytics.module'; import { FeaturesModule } from './features/features.module'; -import { MonitorNetworkModule } from './monitor-network/monitor-network.module'; +import { MonitorNetworkModule } from './monitor-network/monitorNetwork.module'; import { PricesModule } from './prices/prices.module'; import { RestrictedModule } from './restricted/restricted.module'; import { HealthModule } from './health/health.module'; diff --git a/apps/apps-backend/src/features/features.controller.ts b/apps/apps-backend/src/features/features.controller.ts index a3f3dbbdd3f..ce0e127c6ba 100644 --- a/apps/apps-backend/src/features/features.controller.ts +++ b/apps/apps-backend/src/features/features.controller.ts @@ -2,7 +2,8 @@ // SPDX-License-Identifier: Apache-2.0 import { Controller, Get } from '@nestjs/common'; -import { Feature } from '@iota/core/constants/features.enum'; +import { Feature } from '@iota/core/enums/features.enums'; +import { Network } from '@iota/iota-sdk/client'; @Controller('/api/features') export class FeaturesController { @@ -62,7 +63,7 @@ export class FeaturesController { defaultValue: true, }, [Feature.AccountFinder]: { - defaultValue: false, + defaultValue: true, }, [Feature.StardustMigration]: { defaultValue: true, @@ -70,6 +71,15 @@ export class FeaturesController { [Feature.SupplyIncreaseVesting]: { defaultValue: true, }, + [Feature.BurntAndMintedTokensInEndedEpochs]: { + defaultValue: { + [Network.Mainnet]: false, + [Network.Devnet]: true, + [Network.Testnet]: false, + [Network.Localnet]: false, + [Network.Custom]: false, + }, + }, }, dateUpdated: new Date().toISOString(), }; @@ -139,6 +149,15 @@ export class FeaturesController { [Feature.SupplyIncreaseVesting]: { defaultValue: true, }, + [Feature.BurntAndMintedTokensInEndedEpochs]: { + defaultValue: { + [Network.Mainnet]: false, + [Network.Devnet]: true, + [Network.Testnet]: false, + [Network.Localnet]: false, + [Network.Custom]: false, + }, + }, }, dateUpdated: new Date().toISOString(), }; diff --git a/apps/apps-backend/src/monitor-network/monitor-network.controller.ts b/apps/apps-backend/src/monitor-network/monitorNetwork.controller.ts similarity index 100% rename from apps/apps-backend/src/monitor-network/monitor-network.controller.ts rename to apps/apps-backend/src/monitor-network/monitorNetwork.controller.ts diff --git a/apps/apps-backend/src/monitor-network/monitor-network.module.ts b/apps/apps-backend/src/monitor-network/monitorNetwork.module.ts similarity index 74% rename from apps/apps-backend/src/monitor-network/monitor-network.module.ts rename to apps/apps-backend/src/monitor-network/monitorNetwork.module.ts index 0273c17be8b..9897c7598b5 100644 --- a/apps/apps-backend/src/monitor-network/monitor-network.module.ts +++ b/apps/apps-backend/src/monitor-network/monitorNetwork.module.ts @@ -3,7 +3,7 @@ import { Module } from '@nestjs/common'; -import { MonitorNetworkController } from './monitor-network.controller'; +import { MonitorNetworkController } from './monitorNetwork.controller'; @Module({ controllers: [MonitorNetworkController], diff --git a/apps/apps-backend/tsconfig.json b/apps/apps-backend/tsconfig.json index 11f5788c888..1ee903b9da4 100644 --- a/apps/apps-backend/tsconfig.json +++ b/apps/apps-backend/tsconfig.json @@ -18,7 +18,7 @@ "forceConsistentCasingInFileNames": false, "noFallthroughCasesInSwitch": false, "paths": { - "@iota/core/constants/*": ["./../core/src/constants/*"] + "@iota/core/enums/*": ["./../core/src/enums/*"], } - }, + } } diff --git a/apps/apps-backend/types/iota-core.d.ts b/apps/apps-backend/types/iota-core.d.ts index e51933507ea..b5ad75d0244 100644 --- a/apps/apps-backend/types/iota-core.d.ts +++ b/apps/apps-backend/types/iota-core.d.ts @@ -1,4 +1,4 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -declare module '@iota/core/constants/features.enum'; +declare module '@iota/core/enums/features.enums'; diff --git a/apps/core/package.json b/apps/core/package.json index 0a8cd7acfeb..ab6b447365d 100644 --- a/apps/core/package.json +++ b/apps/core/package.json @@ -26,16 +26,17 @@ "@amplitude/analytics-types": "^0.20.0", "@growthbook/growthbook-react": "^1.0.0", "@hookform/resolvers": "^3.9.0", + "@iota/apps-ui-icons": "workspace:*", "@iota/apps-ui-kit": "workspace:*", "@iota/dapp-kit": "workspace:*", "@iota/iota-sdk": "workspace:*", "@iota/kiosk": "workspace:*", - "@iota/ui-icons": "workspace:*", "@sentry/react": "^7.59.2", "@tanstack/react-query": "^5.50.1", "bignumber.js": "^9.1.1", "clsx": "^2.1.1", "formik": "^2.4.2", + "idb-keyval": "^6.2.1", "qrcode.react": "^4.0.1", "react": "^18.3.1", "react-dom": "^18.3.1", diff --git a/apps/core/src/api/SentryHttpTransport.ts b/apps/core/src/api/SentryHttpTransport.ts index 66fa4756c94..913debac24f 100644 --- a/apps/core/src/api/SentryHttpTransport.ts +++ b/apps/core/src/api/SentryHttpTransport.ts @@ -15,27 +15,30 @@ export class SentryHttpTransport extends IotaHTTPTransport { } async withRequest(input: { method: string; params: unknown[] }, handler: () => Promise) { - const transaction = Sentry.startTransaction({ - name: input.method, - op: 'http.rpc-request', - data: input.params, - tags: { - url: this.url, + return Sentry.startSpan( + { + name: input.method, + op: 'http.rpc-request', + data: input.params, + tags: { + url: this.url, + }, }, - }); - - try { - const res = await handler(); - const status: Sentry.SpanStatusType = 'ok'; - transaction.setStatus(status); - return res; - } catch (e) { - const status: Sentry.SpanStatusType = 'internal_error'; - transaction.setStatus(status); - throw e; - } finally { - transaction.finish(); - } + async (span) => { + try { + const res = await handler(); + const status: Sentry.SpanStatusType = 'ok'; + span?.setStatus(status); + return res; + } catch (e) { + const status: Sentry.SpanStatusType = 'internal_error'; + span?.setStatus(status); + throw e; + } finally { + span?.end(); + } + }, + ); } override async request(input: { method: string; params: unknown[] }) { diff --git a/apps/core/src/components/QR.tsx b/apps/core/src/components/QR.tsx index 7ab47b246e3..2c4b806b161 100644 --- a/apps/core/src/components/QR.tsx +++ b/apps/core/src/components/QR.tsx @@ -1,7 +1,6 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import React from 'react'; import { QRCodeSVG } from 'qrcode.react'; export enum QRLevel { diff --git a/apps/wallet-dashboard/components/Dialogs/Staking/views/Validator.tsx b/apps/core/src/components/Validator.tsx similarity index 63% rename from apps/wallet-dashboard/components/Dialogs/Staking/views/Validator.tsx rename to apps/core/src/components/Validator.tsx index a76ed05db57..3161fe8a812 100644 --- a/apps/wallet-dashboard/components/Dialogs/Staking/views/Validator.tsx +++ b/apps/core/src/components/Validator.tsx @@ -1,6 +1,7 @@ -// Copyright (c) 2024 IOTA Stiftung +// Copyright (c) Mysten Labs, Inc. +// Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { ImageIcon, ImageIconSize, formatPercentageDisplay, useValidatorInfo } from '@iota/core'; +import { ImageIcon, ImageIconSize, formatPercentageDisplay, useValidatorInfo } from '../'; import { Card, CardBody, @@ -10,24 +11,28 @@ import { CardType, Badge, BadgeType, + ImageShape, + Skeleton, } from '@iota/apps-ui-kit'; import { formatAddress } from '@iota/iota-sdk/utils'; interface ValidatorProps { - isSelected: boolean; + isSelected?: boolean; address: string; + type?: CardType; showActiveStatus?: boolean; - onClick?: (address: string) => void; - showAction?: boolean; - activeEpoch?: string; + onClick?: () => void; + showApy?: boolean; + activeEpoch?: number; } export function Validator({ address, - showActiveStatus, + type, + showActiveStatus = false, onClick, isSelected, - showAction = true, + showApy = true, activeEpoch, }: ValidatorProps) { const { @@ -38,10 +43,27 @@ export function Validator({ isApyApproxZero, validatorSummary, system, + isPendingValidators, } = useValidatorInfo({ validatorAddress: address, }); + if (isPendingValidators) { + return ( + + + + +
+ + +
+
+ +
+
+ ); + } // for inactive validators, show the epoch number const fallBackText = activeEpoch ? `Staked ${Number(system?.epoch) - Number(activeEpoch)} epochs ago` @@ -58,11 +80,8 @@ export function Validator({ ) : ( formatAddress(address) ); - - const handleClick = onClick ? () => onClick(address) : undefined; - return ( - + - {showAction && ( + {showApy && ( void; } -export function Kiosk({ object }: KioskProps) { - const address = useActiveAddress(); +export function KioskTile({ object, address, onClick }: KioskTileProps) { const { data: kioskData, isPending } = useGetKioskContents(address); const kioskId = getKioskIdFromOwnerCap(object); @@ -25,10 +31,18 @@ export function Kiosk({ object }: KioskProps) { ? null : itemsWithDisplay[0].data?.display?.data?.image_url || null; - if (isPending) return null; + if (isPending) + return ( +
+ +
+ ); return ( -
+
+
{isHoverable && (
)} diff --git a/apps/wallet-dashboard/components/Buttons/index.ts b/apps/core/src/components/nft/index.ts similarity index 62% rename from apps/wallet-dashboard/components/Buttons/index.ts rename to apps/core/src/components/nft/index.ts index ecd1cf7a7ce..ffc837bd846 100644 --- a/apps/wallet-dashboard/components/Buttons/index.ts +++ b/apps/core/src/components/nft/index.ts @@ -1,4 +1,4 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -export { default as Button } from './Button'; +export * from './NftImage'; diff --git a/apps/core/src/components/stake/StakedCard.tsx b/apps/core/src/components/stake/StakedCard.tsx index 92f6b0e8184..22d4997f6b5 100644 --- a/apps/core/src/components/stake/StakedCard.tsx +++ b/apps/core/src/components/stake/StakedCard.tsx @@ -9,7 +9,6 @@ import { useIotaClientQuery } from '@iota/dapp-kit'; import { ImageIcon } from '../icon'; import { ExtendedDelegatedStake } from '../../utils'; import { useFormatCoin, useStakeRewardStatus } from '../../hooks'; -import React from 'react'; interface StakedCardProps { extendedStake: ExtendedDelegatedStake; @@ -61,7 +60,10 @@ export function StakedCard({ fallback={validatorMeta?.name || ''} /> - + ); diff --git a/apps/core/src/components/transaction/TransactionIcon.tsx b/apps/core/src/components/transaction/TransactionIcon.tsx new file mode 100644 index 00000000000..416a0cac65a --- /dev/null +++ b/apps/core/src/components/transaction/TransactionIcon.tsx @@ -0,0 +1,48 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +import { + ArrowBottomLeft, + ArrowTopRight, + Info, + IotaLogoMark, + Migration, + Person, + Stake, + Unstake, + Vesting, +} from '@iota/apps-ui-icons'; +import { TransactionAction } from '../../interfaces'; + +const ICON_COLORS = { + primary: 'text-primary-30', + error: 'text-error-30', +}; + +const icons = { + [TransactionAction.Send]: , + [TransactionAction.Receive]: , + [TransactionAction.Transaction]: , + [TransactionAction.Staked]: , + [TransactionAction.Unstaked]: , + [TransactionAction.Rewards]: , + [TransactionAction.Failed]: , + [TransactionAction.PersonalMessage]: , + [TransactionAction.TimelockedStaked]: , + [TransactionAction.TimelockedUnstaked]: , + [TransactionAction.Migration]: , + [TransactionAction.TimelockedCollect]: , +}; + +interface TransactionIconProps { + txnFailed?: boolean; + variant: TransactionAction; +} + +export function TransactionIcon({ txnFailed, variant }: TransactionIconProps) { + return ( +
+ {icons[txnFailed ? TransactionAction.Failed : variant]} +
+ ); +} diff --git a/apps/core/src/components/transaction/TransactionReceipt.tsx b/apps/core/src/components/transaction/TransactionReceipt.tsx index 99cac6112af..82326d56a30 100644 --- a/apps/core/src/components/transaction/TransactionReceipt.tsx +++ b/apps/core/src/components/transaction/TransactionReceipt.tsx @@ -1,23 +1,22 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import React from 'react'; import { InfoBox, InfoBoxStyle, InfoBoxType } from '@iota/apps-ui-kit'; -import { formatDate, type useTransactionSummary } from '../../hooks'; -import { CheckmarkFilled } from '@iota/ui-icons'; +import type { useTransactionSummary } from '../../hooks'; +import { CheckmarkFilled } from '@iota/apps-ui-icons'; import { IotaTransactionBlockResponse } from '@iota/iota-sdk/client'; import { STAKING_REQUEST_EVENT, UNSTAKING_REQUEST_EVENT } from '../../constants'; import { StakeTransactionDetails } from './details'; import { UnstakeTransactionInfo } from './info'; import { TransactionSummary } from './summary'; -import { RenderExplorerLink, RenderValidatorLogo } from '../../types'; +import { RenderExplorerLink } from '../../types'; import { GasFees } from '../gas'; +import { formatDate } from '../../utils'; interface TransactionReceiptProps { txn: IotaTransactionBlockResponse; activeAddress: string | null; summary: Exclude, null>; - renderValidatorLogo: RenderValidatorLogo; renderExplorerLink: RenderExplorerLink; } @@ -25,7 +24,6 @@ export function TransactionReceipt({ txn, activeAddress, summary, - renderValidatorLogo, renderExplorerLink, }: TransactionReceiptProps) { const { events } = txn; @@ -49,7 +47,6 @@ export function TransactionReceipt({ activeAddress={activeAddress} event={stakeTypeTransaction} gasSummary={summary?.gas} - renderValidatorLogo={renderValidatorLogo} renderExplorerLink={renderExplorerLink} /> ) : null} @@ -60,7 +57,6 @@ export function TransactionReceipt({ event={unstakeTypeTransaction} gasSummary={summary?.gas} renderExplorerLink={renderExplorerLink} - renderValidatorLogo={renderValidatorLogo} /> ) : null} @@ -87,7 +83,9 @@ interface TransactionStatusProps { } function TransactionStatus({ success, timestamp, isIncoming }: TransactionStatusProps) { - const txnDate = timestamp ? formatDate(Number(timestamp)) : ''; + const txnDate = timestamp + ? formatDate(Number(timestamp), ['day', 'month', 'year', 'hour', 'minute']) + : ''; const successMessage = isIncoming ? 'Successfully received' : 'Successfully sent'; return ( {validatorAddress && ( - )} diff --git a/apps/core/src/components/transaction/index.ts b/apps/core/src/components/transaction/index.ts index bedefbc5d7e..e3b830d27d8 100644 --- a/apps/core/src/components/transaction/index.ts +++ b/apps/core/src/components/transaction/index.ts @@ -5,3 +5,4 @@ export * from './info'; export * from './summary'; export * from './TransactionReceipt'; +export * from './TransactionIcon'; diff --git a/apps/core/src/components/transaction/info/StakeTransactionInfo.tsx b/apps/core/src/components/transaction/info/StakeTransactionInfo.tsx index 47f00c48d4f..f2802ad809a 100644 --- a/apps/core/src/components/transaction/info/StakeTransactionInfo.tsx +++ b/apps/core/src/components/transaction/info/StakeTransactionInfo.tsx @@ -2,7 +2,6 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import React from 'react'; import { Divider, KeyValueInfo, Panel, TooltipPosition } from '@iota/apps-ui-kit'; import { type GasSummaryType, useStakeTxnInfo, GasSummary } from '../../../'; import { RenderExplorerLink } from '../../../types'; diff --git a/apps/core/src/components/transaction/info/UnstakeTransactionInfo.tsx b/apps/core/src/components/transaction/info/UnstakeTransactionInfo.tsx index 94e120821d3..932fa20d5fc 100644 --- a/apps/core/src/components/transaction/info/UnstakeTransactionInfo.tsx +++ b/apps/core/src/components/transaction/info/UnstakeTransactionInfo.tsx @@ -2,19 +2,17 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import React from 'react'; import { TransactionAmount } from '../amount'; import type { IotaEvent } from '@iota/iota-sdk/client'; import { IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; -import type { GasSummaryType, RenderExplorerLink, RenderValidatorLogo } from '../../../types'; +import type { GasSummaryType, RenderExplorerLink } from '../../../types'; import { useFormatCoin } from '../../../hooks'; -import { Divider, KeyValueInfo, Panel } from '@iota/apps-ui-kit'; -import { GasSummary } from '../../..'; +import { Divider, KeyValueInfo, Panel, CardType } from '@iota/apps-ui-kit'; +import { GasSummary, getUnstakeDetailsFromEvent, Validator } from '../../..'; interface UnstakeTransactionInfoProps { activeAddress: string | null; event: IotaEvent; - renderValidatorLogo: RenderValidatorLogo; renderExplorerLink: RenderExplorerLink; gasSummary?: GasSummaryType; } @@ -23,24 +21,17 @@ export function UnstakeTransactionInfo({ activeAddress, event, gasSummary, - renderValidatorLogo: ValidatorLogo, renderExplorerLink, }: UnstakeTransactionInfoProps) { - const json = event.parsedJson as { - principal_amount?: string; - reward_amount?: string; - validator_address?: string; - }; - const principalAmount = json?.principal_amount || '0'; - const rewardAmount = json?.reward_amount || '0'; - const validatorAddress = json?.validator_address; - const totalAmount = BigInt(principalAmount) + BigInt(rewardAmount); + const { principalAmount, rewardAmount, totalAmount, validatorAddress } = + getUnstakeDetailsFromEvent(event); + const [formatPrinciple, symbol] = useFormatCoin(principalAmount, IOTA_TYPE_ARG); const [formatRewards] = useFormatCoin(rewardAmount || 0, IOTA_TYPE_ARG); return (
- {validatorAddress && } + {validatorAddress && } {totalAmount !== 0n && ( )} diff --git a/apps/core/src/components/transaction/summary/TransactionSummary.tsx b/apps/core/src/components/transaction/summary/TransactionSummary.tsx index 090d84d8ece..cd669d6cc49 100644 --- a/apps/core/src/components/transaction/summary/TransactionSummary.tsx +++ b/apps/core/src/components/transaction/summary/TransactionSummary.tsx @@ -1,7 +1,7 @@ // Copyright (c) Mysten Labs, Inc. // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import React from 'react'; + import { type TransactionSummaryType } from '../../..'; import { BalanceChanges, ObjectChanges } from '../../cards'; import { LoadingIndicator, Title, TitleSize } from '@iota/apps-ui-kit'; diff --git a/apps/core/src/constants/coins.constants.ts b/apps/core/src/constants/coins.constants.ts index 11fba0c12a0..b0e38e586cd 100644 --- a/apps/core/src/constants/coins.constants.ts +++ b/apps/core/src/constants/coins.constants.ts @@ -3,3 +3,4 @@ export const COINS_QUERY_REFETCH_INTERVAL = 20_000; export const COINS_QUERY_STALE_TIME = 20_000; +export const COIN_TYPE = '0x2::coin::Coin'; diff --git a/apps/core/src/constants/index.ts b/apps/core/src/constants/index.ts index 834fd50145e..693b46c5973 100644 --- a/apps/core/src/constants/index.ts +++ b/apps/core/src/constants/index.ts @@ -6,6 +6,5 @@ export * from './recognizedPackages.constants'; export * from './coins.constants'; export * from './timelock.constants'; export * from './migration.constants'; -export * from './features.enum'; export * from './gas.constants'; export * from './time.constants'; diff --git a/apps/core/src/constants/timelock.constants.ts b/apps/core/src/constants/timelock.constants.ts index 6b9ab9c2627..21c7999aef0 100644 --- a/apps/core/src/constants/timelock.constants.ts +++ b/apps/core/src/constants/timelock.constants.ts @@ -1,5 +1,6 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -export const TIMELOCK_IOTA_TYPE = '0x2::timelock::TimeLock<0x2::balance::Balance<0x2::iota::IOTA>>'; -export const TIMELOCK_STAKED_TYPE = '0x3::timelocked_staking::TimelockedStakedIota'; +export const TIMELOCK_MODULE = 'timelock'; +export const TIMELOCK_IOTA_TYPE = `0x2::${TIMELOCK_MODULE}::TimeLock<0x2::balance::Balance<0x2::iota::IOTA>>`; +export const TIMELOCK_STAKED_TYPE = `0x3::timelocked_staking::TimelockedStakedIota`; diff --git a/apps/core/src/contexts/HiddenAssetsProvider.tsx b/apps/core/src/contexts/HiddenAssetsProvider.tsx new file mode 100644 index 00000000000..3d03e54669f --- /dev/null +++ b/apps/core/src/contexts/HiddenAssetsProvider.tsx @@ -0,0 +1,112 @@ +// Copyright (c) Mysten Labs, Inc. +// Modifications Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +import { get, set } from 'idb-keyval'; +import { + PropsWithChildren, + createContext, + useCallback, + useContext, + useEffect, + useState, + useRef, +} from 'react'; + +const HIDDEN_ASSET_IDS = 'hidden-asset-ids'; + +export type HiddenAssets = + | { + type: 'loading'; + } + | { + type: 'loaded'; + assetIds: string[]; + }; + +interface HiddenAssetContext { + hiddenAssets: HiddenAssets; + hideAsset: (assetId: string) => string | void; + showAsset: (assetId: string) => string | void; +} + +export const HiddenAssetsContext = createContext({ + hiddenAssets: { + type: 'loading', + }, + hideAsset: () => {}, + showAsset: () => {}, +}); + +export const HiddenAssetsProvider = ({ children }: PropsWithChildren) => { + const [hiddenAssets, setHiddenAssets] = useState({ + type: 'loading', + }); + const hiddenAssetIdsRef = useRef([]); + + useEffect(() => { + (async () => { + try { + const hiddenAssetsFromStorage = (await get(HIDDEN_ASSET_IDS)) ?? []; + hiddenAssetIdsRef.current = hiddenAssetsFromStorage; + setHiddenAssetIds(hiddenAssetsFromStorage); + } catch (error) { + console.error('Failed to load hidden assets from storage:', error); + setHiddenAssetIds([]); + } + })(); + }, []); + + function setHiddenAssetIds(hiddenAssetIds: string[]) { + hiddenAssetIdsRef.current = hiddenAssetIds; + setHiddenAssets({ + type: 'loaded', + assetIds: hiddenAssetIds, + }); + } + + const syncIdb = useCallback(async (nextState: string[], prevState: string[]) => { + try { + await set(HIDDEN_ASSET_IDS, nextState); + } catch (error) { + console.error('Error syncing with IndexedDB:', error); + // Revert to the previous state on failure + setHiddenAssetIds(prevState); + } + }, []); + + const hideAsset = useCallback((assetId: string) => { + const prevIds = [...hiddenAssetIdsRef.current]; + const newHiddenAssetIds = Array.from(new Set([...hiddenAssetIdsRef.current, assetId])); + setHiddenAssetIds(newHiddenAssetIds); + syncIdb(newHiddenAssetIds, prevIds); + return assetId; + }, []); + + const showAsset = useCallback((assetId: string) => { + // Ensure the asset exists in the hidden list + if (!hiddenAssetIdsRef.current.includes(assetId)) return; + + const prevIds = [...hiddenAssetIdsRef.current]; + // Compute the new list of hidden assets + const updatedHiddenAssetIds = hiddenAssetIdsRef.current.filter((id) => id !== assetId); + setHiddenAssetIds(updatedHiddenAssetIds); + syncIdb(updatedHiddenAssetIds, prevIds); + }, []); + + return ( + + {children} + + ); +}; + +export const useHiddenAssets = () => { + return useContext(HiddenAssetsContext); +}; diff --git a/apps/core/src/contexts/index.ts b/apps/core/src/contexts/index.ts index c592171afa8..fe492c59d09 100644 --- a/apps/core/src/contexts/index.ts +++ b/apps/core/src/contexts/index.ts @@ -2,3 +2,4 @@ // SPDX-License-Identifier: Apache-2.0 export * from './ThemeContext'; +export * from './HiddenAssetsProvider'; diff --git a/apps/core/src/enums/explorer-link-type.enums.ts b/apps/core/src/enums/explorerLinkType.enums.ts similarity index 100% rename from apps/core/src/enums/explorer-link-type.enums.ts rename to apps/core/src/enums/explorerLinkType.enums.ts diff --git a/apps/core/src/constants/features.enum.ts b/apps/core/src/enums/features.enums.ts similarity index 92% rename from apps/core/src/constants/features.enum.ts rename to apps/core/src/enums/features.enums.ts index 3670db4edc1..5d260493c5f 100644 --- a/apps/core/src/constants/features.enum.ts +++ b/apps/core/src/enums/features.enums.ts @@ -20,4 +20,5 @@ export enum Feature { WalletEffectsOnlySharedTransaction = 'wallet-effects-only-shared-transaction', StardustMigration = 'migration', SupplyIncreaseVesting = 'supply-increase-vesting', + BurntAndMintedTokensInEndedEpochs = 'burnt-and-minted-tokens-in-ended-epochs', } diff --git a/apps/core/src/enums/index.ts b/apps/core/src/enums/index.ts index 7c01aed335d..e7bd792140c 100644 --- a/apps/core/src/enums/index.ts +++ b/apps/core/src/enums/index.ts @@ -2,4 +2,5 @@ // SPDX-License-Identifier: Apache-2.0 export * from './theme.enums'; -export * from './explorer-link-type.enums'; +export * from './explorerLinkType.enums'; +export * from './features.enums'; diff --git a/apps/core/src/hooks/__tests__/useFormatCoin.test.ts b/apps/core/src/hooks/__tests__/useFormatCoin.test.ts index c55d16574c5..a138a90a8ca 100644 --- a/apps/core/src/hooks/__tests__/useFormatCoin.test.ts +++ b/apps/core/src/hooks/__tests__/useFormatCoin.test.ts @@ -24,6 +24,21 @@ describe('formatBalance', () => { expect(formatBalance('0.000', IOTA_DECIMALS)).toEqual('0'); }); + it('formats decimal amounts with less than 4 leading zeroes, truncated with up to 4 decimals', () => { + expect(formatBalance('512345678', IOTA_DECIMALS)).toEqual('0.5'); + expect(formatBalance('51234567', IOTA_DECIMALS)).toEqual('0.05'); + expect(formatBalance('5123456', IOTA_DECIMALS)).toEqual('0.005'); + expect(formatBalance('523456', IOTA_DECIMALS)).toEqual('0.0005'); + }); + + it('formats decimal amounts with 4 or more leading zeroes (after decimal point) with subscripts', () => { + expect(formatBalance('19723', IOTA_DECIMALS)).toEqual('0.0₄19723'); + expect(formatBalance('1234', IOTA_DECIMALS)).toEqual('0.0₅1234'); + expect(formatBalance('123', IOTA_DECIMALS)).toEqual('0.0₆123'); + expect(formatBalance('12', IOTA_DECIMALS)).toEqual('0.0₇12'); + expect(formatBalance('1', IOTA_DECIMALS)).toEqual('0.0₈1'); + }); + it('formats integer amounts correctly', () => { expect(formatBalance(toNano('1'), IOTA_DECIMALS)).toEqual('1'); expect(formatBalance(toNano('1.0001'), IOTA_DECIMALS)).toEqual('1'); diff --git a/apps/core/src/hooks/index.ts b/apps/core/src/hooks/index.ts index 1602541e57b..aee1fb3e15e 100644 --- a/apps/core/src/hooks/index.ts +++ b/apps/core/src/hooks/index.ts @@ -47,6 +47,10 @@ export * from './useOwnedNFT'; export * from './useNftDetails'; export * from './useCountdownByTimestamp'; export * from './useStakeRewardStatus'; +export * from './useGetNFTs'; export * from './useRecognizedPackages'; +export * from './useTransferAsset'; +export * from './useFeatureEnabledByNetwork'; export * from './stake'; +export * from './ui'; diff --git a/apps/core/src/hooks/stake/useValidatorInfo.tsx b/apps/core/src/hooks/stake/useValidatorInfo.ts similarity index 97% rename from apps/core/src/hooks/stake/useValidatorInfo.tsx rename to apps/core/src/hooks/stake/useValidatorInfo.ts index f8d6dcd5a2f..b3d5b9833f9 100644 --- a/apps/core/src/hooks/stake/useValidatorInfo.tsx +++ b/apps/core/src/hooks/stake/useValidatorInfo.ts @@ -1,7 +1,7 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 import { useIotaClientQuery } from '@iota/dapp-kit'; -import { useGetValidatorsApy } from '../'; +import { useGetValidatorsApy } from '..'; export function useValidatorInfo({ validatorAddress }: { validatorAddress: string }) { const { diff --git a/apps/core/src/hooks/ui/index.ts b/apps/core/src/hooks/ui/index.ts new file mode 100644 index 00000000000..37bbc87557c --- /dev/null +++ b/apps/core/src/hooks/ui/index.ts @@ -0,0 +1,4 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +export * from './usePageAssets'; diff --git a/apps/core/src/hooks/ui/usePageAssets.ts b/apps/core/src/hooks/ui/usePageAssets.ts new file mode 100644 index 00000000000..6fbd8f35836 --- /dev/null +++ b/apps/core/src/hooks/ui/usePageAssets.ts @@ -0,0 +1,131 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 +import { useState, useMemo, useRef, useEffect } from 'react'; +import { useGetNFTs, HiddenAssets, useOnScreen } from '../..'; + +export enum AssetCategory { + Visual = 'Visual', + Other = 'Other', + Hidden = 'Hidden', +} + +export function usePageAssets(address: string | null, hiddenAssets?: HiddenAssets) { + const [selectedAssetCategory, setSelectedAssetCategory] = useState(null); + const observerElem = useRef(null); + const { isIntersecting } = useOnScreen(observerElem); + const { + data: ownedAssets, + hasNextPage, + isFetchingNextPage, + fetchNextPage, + error, + isPending, + isError, + isFetching, + refetch, + } = useGetNFTs(address, hiddenAssets); + + const isAssetsLoaded = !!ownedAssets; + const isSpinnerVisible = isFetchingNextPage && hasNextPage; + + const filteredAssets = (() => { + if (!ownedAssets) return []; + switch (selectedAssetCategory) { + case AssetCategory.Visual: + return ownedAssets.visual; + case AssetCategory.Other: + return ownedAssets.other; + default: + return []; + } + })(); + + const filteredHiddenAssets = useMemo(() => { + return ( + ownedAssets?.hidden + .flatMap((data) => { + return { + data: data, + display: data?.display?.data, + }; + }) + .sort((nftA, nftB) => { + const nameA = nftA.display?.name || ''; + const nameB = nftB.display?.name || ''; + + if (nameA < nameB) { + return -1; + } else if (nameA > nameB) { + return 1; + } + return 0; + }) ?? [] + ); + }, [ownedAssets]); + + // Fetch the next page if the user scrolls to the bottom of the page + useEffect(() => { + if (isIntersecting && hasNextPage && !isFetchingNextPage) { + fetchNextPage(); + } + }, [isIntersecting, fetchNextPage, hasNextPage, isFetchingNextPage]); + + // select the default category if no category is selected and assets are loaded + useEffect(() => { + let computeSelectedCategory = false; + if ( + (selectedAssetCategory === AssetCategory.Visual && ownedAssets?.visual.length === 0) || + (selectedAssetCategory === AssetCategory.Other && ownedAssets?.other.length === 0) || + (selectedAssetCategory === AssetCategory.Hidden && ownedAssets?.hidden.length === 0) || + !selectedAssetCategory + ) { + computeSelectedCategory = true; + } + if (computeSelectedCategory && ownedAssets) { + const defaultCategory = + ownedAssets.visual.length > 0 + ? AssetCategory.Visual + : ownedAssets.other.length > 0 + ? AssetCategory.Other + : ownedAssets.hidden.length > 0 + ? AssetCategory.Hidden + : null; + setSelectedAssetCategory(defaultCategory); + } + }, [ownedAssets]); + + // Fetch the next page if there are no visual assets, other + hidden assets are present in multiples of 50, and there are more pages to fetch + useEffect(() => { + if ( + hasNextPage && + ownedAssets?.visual.length === 0 && + ownedAssets?.other.length + ownedAssets?.hidden.length > 0 && + (ownedAssets.other.length + ownedAssets.hidden.length) % 50 === 0 && + !isFetchingNextPage + ) { + fetchNextPage(); + setSelectedAssetCategory(null); + } + }, [hasNextPage, ownedAssets, isFetchingNextPage]); + + return { + // reexport from useGetNFTs + ownedAssets, + hasNextPage, + isFetchingNextPage, + fetchNextPage, + error, + isPending, + isError, + isFetching, + refetch, + + isAssetsLoaded, + filteredAssets, + filteredHiddenAssets, + selectedAssetCategory, + setSelectedAssetCategory, + observerElem, + isSpinnerVisible, + }; +} diff --git a/apps/core/src/hooks/useFeatureEnabledByNetwork.ts b/apps/core/src/hooks/useFeatureEnabledByNetwork.ts new file mode 100644 index 00000000000..2f3c51761af --- /dev/null +++ b/apps/core/src/hooks/useFeatureEnabledByNetwork.ts @@ -0,0 +1,15 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +import { useFeature } from '@growthbook/growthbook-react'; +import type { Network } from '@iota/iota-sdk/client'; +import { Feature } from '../enums'; + +type NetworkBasedFeature = { + [key in Network]: boolean; +}; + +export function useFeatureEnabledByNetwork(feature: Feature, network: Network): boolean { + const featureFlag = useFeature(feature)?.value; + return featureFlag?.[network] ?? false; +} diff --git a/apps/core/src/hooks/useFileExtensionType.ts b/apps/core/src/hooks/useFileExtensionType.ts index 04a0ce3f604..e21274a22b7 100644 --- a/apps/core/src/hooks/useFileExtensionType.ts +++ b/apps/core/src/hooks/useFileExtensionType.ts @@ -98,7 +98,7 @@ export const extractFileType = async (imgUrl: string) => { }); }; */ -export default function useFileExtensionType(url: string) { +export function useFileExtensionType(url: string) { if (!url) return { name: '', type: '' }; const fileType = url.split('.').pop() || ''; return FILE_EXTENSION_TYPE_MAP[fileType] || { name: '', type: '' }; diff --git a/apps/wallet/src/ui/app/hooks/useGetNFTs.ts b/apps/core/src/hooks/useGetNFTs.ts similarity index 73% rename from apps/wallet/src/ui/app/hooks/useGetNFTs.ts rename to apps/core/src/hooks/useGetNFTs.ts index 8e891e129be..9fedb74b911 100644 --- a/apps/wallet/src/ui/app/hooks/useGetNFTs.ts +++ b/apps/core/src/hooks/useGetNFTs.ts @@ -2,10 +2,16 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { hasDisplayData, isKioskOwnerToken, useGetOwnedObjects, useKioskClient } from '@iota/core'; +import { + hasDisplayData, + isKioskOwnerToken, + useGetOwnedObjects, + useKioskClient, + HiddenAssets, + COIN_TYPE, +} from '../../'; import { type IotaObjectData } from '@iota/iota-sdk/client'; import { useMemo } from 'react'; -import { useHiddenAssets } from '../pages/home/assets/HiddenAssetsProvider'; type OwnedAssets = { visual: IotaObjectData[]; @@ -18,10 +24,13 @@ export enum AssetFilterTypes { Other = 'other', } -export function useGetNFTs(address?: string | null) { +const OBJECTS_PER_REQ = 50; + +export function useGetNFTs(address?: string | null, hiddenAssets?: HiddenAssets) { const kioskClient = useKioskClient(); const { data, + isFetching, isPending, error, isError, @@ -29,14 +38,14 @@ export function useGetNFTs(address?: string | null) { hasNextPage, fetchNextPage, isLoading, + refetch, } = useGetOwnedObjects( address, { - MatchNone: [{ StructType: '0x2::coin::Coin' }], + MatchNone: [{ StructType: COIN_TYPE }], }, - 50, + OBJECTS_PER_REQ, ); - const { hiddenAssets } = useHiddenAssets(); const assets = useMemo(() => { const ownedAssets: OwnedAssets = { @@ -45,13 +54,16 @@ export function useGetNFTs(address?: string | null) { hidden: [], }; - if (hiddenAssets.type === 'loading') { + if (hiddenAssets?.type === 'loading') { return ownedAssets; } else { const groupedAssets = data?.pages .flatMap((page) => page.data) .reduce((acc, curr) => { - if (curr.data?.objectId && hiddenAssets.assetIds.includes(curr.data?.objectId)) + if ( + curr.data?.objectId && + hiddenAssets?.assetIds?.includes(curr.data?.objectId) + ) acc.hidden.push(curr.data as IotaObjectData); else if (hasDisplayData(curr) || isKioskOwnerToken(kioskClient.network, curr)) acc.visual.push(curr.data as IotaObjectData); @@ -64,6 +76,7 @@ export function useGetNFTs(address?: string | null) { return { data: assets, + isFetching, isLoading, hasNextPage, isFetchingNextPage, @@ -71,5 +84,6 @@ export function useGetNFTs(address?: string | null) { isPending: isPending, isError: isError, error, + refetch, }; } diff --git a/apps/core/src/hooks/useLocalStorage.ts b/apps/core/src/hooks/useLocalStorage.ts index 7aa7276228e..5e610c8ceaa 100644 --- a/apps/core/src/hooks/useLocalStorage.ts +++ b/apps/core/src/hooks/useLocalStorage.ts @@ -9,6 +9,12 @@ type SetValue = Dispatch>; export function useLocalStorage(key: string, initialValue: T): [T, SetValue] { const getValue = useCallback(() => { try { + if (typeof window === 'undefined') { + console.warn( + `Tried reading localStorage key "${key}" even though window is not defined`, + ); + return initialValue; + } const item = window.localStorage.getItem(key); return item ? (JSON.parse(item) as T) : initialValue; } catch (error) { @@ -21,12 +27,6 @@ export function useLocalStorage(key: string, initialValue: T): [T, SetValue = useCallback( (value) => { - if (typeof window === 'undefined') { - console.warn( - `Tried setting localStorage key "${key}" even though window is not defined`, - ); - } - try { const newValue = value instanceof Function ? value(storedValue) : value; window.localStorage.setItem(key, JSON.stringify(newValue)); diff --git a/apps/core/src/hooks/useMediaUrl.ts b/apps/core/src/hooks/useMediaUrl.ts index bf4dc6cf4a6..e96c96124f3 100644 --- a/apps/core/src/hooks/useMediaUrl.ts +++ b/apps/core/src/hooks/useMediaUrl.ts @@ -7,7 +7,7 @@ import { useMemo } from 'react'; const parseIpfsUrl = (ipfsUrl: string) => ipfsUrl.replace(/^ipfs:\/\//, 'https://ipfs.io/ipfs/'); -export default function useMediaUrl(objData: IotaParsedData | null) { +export function useMediaUrl(objData: IotaParsedData | null) { const { fields } = ((objData?.dataType === 'moveObject' && objData) as { fields: { url?: string; metadata?: { fields: { url: string } } }; diff --git a/apps/core/src/hooks/useNFTBasicData.ts b/apps/core/src/hooks/useNFTBasicData.ts index 227a9707de1..4911a5594c2 100644 --- a/apps/core/src/hooks/useNFTBasicData.ts +++ b/apps/core/src/hooks/useNFTBasicData.ts @@ -3,9 +3,8 @@ // SPDX-License-Identifier: Apache-2.0 import type { IotaObjectData } from '@iota/iota-sdk/client'; - -import useFileExtensionType from './useFileExtensionType'; -import useMediaUrl from './useMediaUrl'; +import { useMediaUrl } from './useMediaUrl'; +import { useFileExtensionType } from './useFileExtensionType'; export function useNFTBasicData(nftObj: IotaObjectData | null) { const nftObjectID = nftObj?.objectId || null; diff --git a/apps/core/src/hooks/useNftDetails.ts b/apps/core/src/hooks/useNftDetails.ts index f76001b0273..dc65ab58a9a 100644 --- a/apps/core/src/hooks/useNftDetails.ts +++ b/apps/core/src/hooks/useNftDetails.ts @@ -8,7 +8,6 @@ import { useIsAssetTransferable, } from './'; import { formatAddress } from '@iota/iota-sdk/utils'; -import { truncateString } from '../utils'; type NftField = { keys: string[]; values: string[] }; @@ -35,7 +34,7 @@ export function useNftDetails(nftId: string, accountAddress: string | null) { // Extract either the attributes, or use the top-level NFT fields: const { keys: metaKeys, values: metaValues } = - (nftFields as NftFields)?.metadata?.fields?.attributes?.fields || + (nftFields as unknown as NftFields)?.metadata?.fields?.attributes?.fields || Object.entries(nftFields ?? {}) .filter(([key]) => key !== 'id') .reduce( @@ -54,28 +53,6 @@ export function useNftDetails(nftId: string, accountAddress: string | null) { objectData.owner.AddressOwner) || ''; - function formatMetaValue(value: string | object) { - if (typeof value === 'object') { - return { - value: JSON.stringify(value), - valueLink: undefined, - }; - } else { - if (value.includes('http')) { - return { - value: value.startsWith('http') - ? truncateString(value, 20, 8) - : formatAddress(value), - valueLink: value, - }; - } - return { - value: value, - valueLink: undefined, - }; - } - } - const isLoading = isNftLoading || isCheckingAssetTransferability || isPendingNftDislpay; return { @@ -89,7 +66,6 @@ export function useNftDetails(nftId: string, accountAddress: string | null) { isAssetTransferable, metaKeys, metaValues, - formatMetaValue, isContainedInKiosk, kioskItem, nftDisplayData, diff --git a/apps/core/src/hooks/useOnScreen.ts b/apps/core/src/hooks/useOnScreen.ts index 33ae1701b8c..a1532e79818 100644 --- a/apps/core/src/hooks/useOnScreen.ts +++ b/apps/core/src/hooks/useOnScreen.ts @@ -19,7 +19,7 @@ export const useOnScreen = (elementRef: MutableRefObject) => { ); observer.observe(node); return () => observer.disconnect(); - }, [elementRef]); + }, [elementRef.current]); return { isIntersecting }; }; diff --git a/apps/core/src/hooks/useTimeAgo.ts b/apps/core/src/hooks/useTimeAgo.ts index 6e892254b7d..9011034b20a 100644 --- a/apps/core/src/hooks/useTimeAgo.ts +++ b/apps/core/src/hooks/useTimeAgo.ts @@ -123,32 +123,3 @@ export const timeAgo = ( return result ? result : endLabel; }; - -// TODO - Merge with related functions -type Format = 'year' | 'month' | 'day' | 'hour' | 'minute' | 'second' | 'weekday'; - -export function formatDate(date: Date | number, format?: Format[]): string { - const formatOption = format ?? (['month', 'day', 'hour', 'minute'] as Format[]); - const dateTime = new Date(date); - if (!(dateTime instanceof Date)) return ''; - - const options = { - year: 'numeric', - month: 'short', - day: 'numeric', - hour: 'numeric', - weekday: 'short', - minute: 'numeric', - second: 'numeric', - }; - - const formatOptions = formatOption.reduce((accumulator, current: Format) => { - const responseObj = { - ...accumulator, - ...{ [current]: options[current] }, - }; - return responseObj; - }, {}); - - return new Intl.DateTimeFormat('en-US', formatOptions).format(dateTime); -} diff --git a/apps/core/src/hooks/useTransactionSummary.ts b/apps/core/src/hooks/useTransactionSummary.ts index f34bfa4001d..2e79dc69a00 100644 --- a/apps/core/src/hooks/useTransactionSummary.ts +++ b/apps/core/src/hooks/useTransactionSummary.ts @@ -11,7 +11,7 @@ import { IotaObjectChangeWithDisplay } from '../types'; import { getBalanceChangeSummary, getGasSummary, - getLabel, + getTransactionAction, getObjectChangeSummary, getObjectDisplayLookup, } from '../utils'; @@ -57,7 +57,7 @@ export function useTransactionSummary({ sender: transaction.transaction?.data.sender, balanceChanges: balanceChangeSummary, digest: transaction.digest, - label: getLabel(transaction, currentAddress), + label: getTransactionAction(transaction, currentAddress), objectSummary, status: transaction.effects?.status.status, timestamp: transaction.timestampMs, diff --git a/apps/core/src/hooks/useTransferAsset.ts b/apps/core/src/hooks/useTransferAsset.ts new file mode 100644 index 00000000000..e11f4ef1c67 --- /dev/null +++ b/apps/core/src/hooks/useTransferAsset.ts @@ -0,0 +1,64 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 +import { useGetKioskContents, TransferAssetExecuteFn } from '../'; +import { type IotaTransactionBlockResponse } from '@iota/iota-sdk/client'; +import { Transaction } from '@iota/iota-sdk/transactions'; +import { useMutation } from '@tanstack/react-query'; +import { useTransferKioskItem } from './useTransferKioskItem'; + +export function useTransferAsset({ + objectId, + objectType, + activeAddress, + executeFn, + onSuccess, + onError, +}: { + objectId: string; + objectType?: string | null; + activeAddress?: string | null; + executeFn?: TransferAssetExecuteFn; + onSuccess?: (response: IotaTransactionBlockResponse, variables: string) => void; + onError?: (error: Error) => void; +}) { + const { data: kiosk } = useGetKioskContents(activeAddress); + const transferKioskItem = useTransferKioskItem({ + objectId, + objectType, + executeFn, + address: activeAddress, + }); + const isContainedInKiosk = kiosk?.list.some( + (kioskItem) => kioskItem.data?.objectId === objectId, + ); + + const handleKioskTransfer = async (to: string) => { + return transferKioskItem.mutateAsync({ to }); + }; + + const handleDirectTransfer = async (to: string) => { + const tx = new Transaction(); + tx.transferObjects([tx.object(objectId)], to); + + return executeFn!({ + transaction: tx, + options: { + showInput: true, + showEffects: true, + showEvents: true, + }, + }); + }; + + return useMutation({ + mutationFn: async (to: string) => { + if (!to || !executeFn) { + throw new Error('Missing data'); + } + + return isContainedInKiosk ? handleKioskTransfer(to) : handleDirectTransfer(to); + }, + onSuccess, + onError, + }); +} diff --git a/apps/wallet/src/ui/app/pages/home/nft-transfer/useTransferKioskItem.tsx b/apps/core/src/hooks/useTransferKioskItem.tsx similarity index 87% rename from apps/wallet/src/ui/app/pages/home/nft-transfer/useTransferKioskItem.tsx rename to apps/core/src/hooks/useTransferKioskItem.tsx index f4edd7930bc..e04b9c98428 100644 --- a/apps/wallet/src/ui/app/pages/home/nft-transfer/useTransferKioskItem.tsx +++ b/apps/core/src/hooks/useTransferKioskItem.tsx @@ -1,8 +1,7 @@ // Copyright (c) Mysten Labs, Inc. // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { useActiveAccount } from '_src/ui/app/hooks/useActiveAccount'; -import { useSigner } from '_src/ui/app/hooks/useSigner'; + import { useFeatureValue } from '@growthbook/growthbook-react'; import { useKioskClient, @@ -12,7 +11,8 @@ import { useGetKioskContents, useGetObject, Feature, -} from '@iota/core'; + TransferAssetExecuteFn, +} from '../../'; import { useIotaClient } from '@iota/dapp-kit'; import { KioskTransaction } from '@iota/kiosk'; import { Transaction } from '@iota/iota-sdk/transactions'; @@ -23,14 +23,15 @@ const ORIGINBYTE_PACKAGE_ID = '0x083b02db943238dcea0ff0938a54a17d7575f5b48034506 export function useTransferKioskItem({ objectId, objectType, + executeFn, + address, }: { objectId: string; objectType?: string | null; + executeFn?: TransferAssetExecuteFn; + address?: string | null; }) { const client = useIotaClient(); - const activeAccount = useActiveAccount(); - const signer = useSigner(activeAccount); - const address = activeAccount?.address; const obPackageId = useFeatureValue(Feature.KioskOriginbytePackageid, ORIGINBYTE_PACKAGE_ID); const { data: kioskData } = useGetKioskContents(address); // show personal kiosks too const objectData = useGetObject(objectId); @@ -38,7 +39,7 @@ export function useTransferKioskItem({ return useMutation({ mutationFn: async ({ to }: { to: string }) => { - if (!to || !signer || !objectType) { + if (!to || !executeFn || !objectType) { throw new Error('Missing data'); } @@ -60,8 +61,8 @@ export function useTransferKioskItem({ }) .finalize(); - return signer.signAndExecuteTransaction({ - transactionBlock: txb, + return executeFn({ + transaction: txb, options: { showInput: true, showEffects: true, @@ -99,8 +100,8 @@ export function useTransferKioskItem({ arguments: [tx.object(kioskId), tx.pure.address(to), tx.pure.id(objectId)], }); } - return signer.signAndExecuteTransaction({ - transactionBlock: tx, + return executeFn({ + transaction: tx, options: { showInput: true, showEffects: true, diff --git a/apps/core/src/interfaces/index.ts b/apps/core/src/interfaces/index.ts index 3194d2ae0a1..226be390797 100644 --- a/apps/core/src/interfaces/index.ts +++ b/apps/core/src/interfaces/index.ts @@ -1,5 +1,6 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -export * from './validatorLogo.interfaces'; export * from './balanceChange.interfaces'; +export * from './transactions.interfaces'; +export * from './stakeEvent.interfaces'; diff --git a/apps/core/src/interfaces/stakeEvent.interfaces.ts b/apps/core/src/interfaces/stakeEvent.interfaces.ts new file mode 100644 index 00000000000..1b7514f0a64 --- /dev/null +++ b/apps/core/src/interfaces/stakeEvent.interfaces.ts @@ -0,0 +1,14 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +export interface StakeEventJson { + amount: string; + validator_address: string; + epoch: string; +} + +export interface UnstakeEventJson { + principal_amount?: string; + reward_amount?: string; + validator_address?: string; +} diff --git a/apps/wallet-dashboard/lib/interfaces/transactions.interface.ts b/apps/core/src/interfaces/transactions.interfaces.ts similarity index 77% rename from apps/wallet-dashboard/lib/interfaces/transactions.interface.ts rename to apps/core/src/interfaces/transactions.interfaces.ts index 3a7b9c789d8..75ff392dbfd 100644 --- a/apps/wallet-dashboard/lib/interfaces/transactions.interface.ts +++ b/apps/core/src/interfaces/transactions.interfaces.ts @@ -14,8 +14,13 @@ export enum TransactionAction { Send = 'Send', Receive = 'Receive', Transaction = 'Transaction', + Failed = 'Failed', Staked = 'Staked', Unstaked = 'Unstaked', + TimelockedStaked = 'Timelocked Staked', + TimelockedUnstaked = 'Timelocked Unstaked', + TimelockedCollect = 'Timelocked Collect', + Migration = 'Migration', Rewards = 'Rewards', PersonalMessage = 'PersonalMessage', } diff --git a/apps/core/src/interfaces/validatorLogo.interfaces.ts b/apps/core/src/interfaces/validatorLogo.interfaces.ts deleted file mode 100644 index 26b2d558ff2..00000000000 --- a/apps/core/src/interfaces/validatorLogo.interfaces.ts +++ /dev/null @@ -1,9 +0,0 @@ -// Copyright (c) 2024 IOTA Stiftung -// SPDX-License-Identifier: Apache-2.0 - -export interface ValidatorLogoProps { - address: string; - isSelected: boolean; - showActiveStatus?: boolean; - activeEpoch?: string; -} diff --git a/apps/core/src/types/index.ts b/apps/core/src/types/index.ts index da698c54d8d..80c31f7bb78 100644 --- a/apps/core/src/types/index.ts +++ b/apps/core/src/types/index.ts @@ -6,3 +6,4 @@ export * from './balanceChange'; export * from './objectChange'; export * from './transactionSummary'; export * from './gasSummary'; +export * from './transactionExecute'; diff --git a/apps/core/src/types/renderComponent.ts b/apps/core/src/types/renderComponent.ts index 3059aa3f24d..b28b83ce439 100644 --- a/apps/core/src/types/renderComponent.ts +++ b/apps/core/src/types/renderComponent.ts @@ -3,8 +3,6 @@ import type { PropsWithChildren, JSX } from 'react'; import type { ExplorerLinkConfig } from '../utils/getExplorerLink'; -import type { ValidatorLogoProps } from '../interfaces'; export type RenderExplorerLinkProps = PropsWithChildren; export type RenderExplorerLink = (props: RenderExplorerLinkProps) => JSX.Element; -export type RenderValidatorLogo = (props: ValidatorLogoProps) => JSX.Element; diff --git a/apps/core/src/types/transactionExecute.ts b/apps/core/src/types/transactionExecute.ts new file mode 100644 index 00000000000..9f60d20e0b3 --- /dev/null +++ b/apps/core/src/types/transactionExecute.ts @@ -0,0 +1,13 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +import { + IotaTransactionBlockResponse, + IotaTransactionBlockResponseOptions, +} from '@iota/iota-sdk/client'; +import { Transaction } from '@iota/iota-sdk/transactions'; + +export type TransferAssetExecuteFn = (input: { + transaction: Transaction; + options?: IotaTransactionBlockResponseOptions; +}) => Promise; diff --git a/apps/core/src/utils/formatAmount.ts b/apps/core/src/utils/formatAmount.ts index a745d5c7552..b241f16556c 100644 --- a/apps/core/src/utils/formatAmount.ts +++ b/apps/core/src/utils/formatAmount.ts @@ -4,7 +4,7 @@ import BigNumber from 'bignumber.js'; -export function formatAmountParts(amount?: BigNumber | bigint | number | string | null) { +export function formatAmountParts(amount?: BigNumber | bigint | number | string | null): string[] { if (typeof amount === 'undefined' || amount === null) { return ['--']; } @@ -29,6 +29,16 @@ export function formatAmountParts(amount?: BigNumber | bigint | number | string bn = bn.decimalPlaces(2, BigNumber.ROUND_DOWN); } + if (bnAbs.gt(0) && bnAbs.lt(1)) { + const leadingZeros = countDecimalLeadingZeros(bn.toFormat()); + + if (leadingZeros >= 4) { + return [formatWithSubscript(bn.toFormat(), leadingZeros), postfix]; + } else { + return [bn.toFormat(leadingZeros + 1), postfix]; + } + } + return [bn.toFormat(), postfix]; } @@ -37,3 +47,45 @@ export function formatAmount(...args: Parameters) { .filter(Boolean) .join(' '); } + +export const countDecimalLeadingZeros = ( + input: BigNumber | bigint | number | string | null, +): number => { + if (input === null) { + return 0; + } + + const [, decimals] = input.toString().split('.'); + + if (!decimals) { + return 0; + } + + let count = 0; + + for (const digit of decimals) { + if (digit === '0') { + count++; + } else { + break; + } + } + + return count; +}; + +const SUBSCRIPTS = ['₀', '₁', '₂', '₃', '₄', '₅', '₆', '₇', '₈', '₉']; + +export const formatWithSubscript = ( + input: BigNumber | bigint | number | string | null, + zeroCount: number, +): string => { + if (input === null) { + return '0'; + } + + const [, decimals] = input.toString().split('.'); + const remainder = decimals.slice(zeroCount); + + return `0.0${SUBSCRIPTS[zeroCount]}${remainder}`; +}; diff --git a/apps/core/src/utils/formatDate.ts b/apps/core/src/utils/formatDate.ts new file mode 100644 index 00000000000..5d386d7afb5 --- /dev/null +++ b/apps/core/src/utils/formatDate.ts @@ -0,0 +1,32 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +type Format = 'year' | 'month' | 'day' | 'hour' | 'minute' | 'second' | 'weekday'; + +export function formatDate( + date: Date | number, + format: Format[] = ['day', 'month', 'hour', 'minute'], +): string { + const dateTime = new Date(date); + if (!(dateTime instanceof Date)) return ''; + + const options = { + year: 'numeric', + month: 'short', + day: 'numeric', + hour: 'numeric', + weekday: 'short', + minute: 'numeric', + second: 'numeric', + }; + + const formatOptions = format.reduce((accumulator, current: Format) => { + const responseObj = { + ...accumulator, + ...{ [current]: options[current] }, + }; + return responseObj; + }, {}); + + return new Intl.DateTimeFormat('en-GB', formatOptions).format(dateTime); +} diff --git a/apps/core/src/utils/index.ts b/apps/core/src/utils/index.ts index cfbe4e93729..98be7606fdb 100644 --- a/apps/core/src/utils/index.ts +++ b/apps/core/src/utils/index.ts @@ -4,6 +4,7 @@ export * from './calculateStakeShare'; export * from './chunkArray'; export * from './formatAmount'; +export * from './formatDate'; export * from './formatPercentageDisplay'; export * from './getRefGasPrice'; export * from './hasDisplayData'; @@ -22,6 +23,7 @@ export * from './getExplorerPaths'; export * from './getExplorerLink'; export * from './truncateString'; export * from './determineCountDownText'; +export * from './toTitleCase'; export * from './stake'; export * from './transaction'; diff --git a/apps/core/src/utils/stake/checkIfIsTimelockedStaking.ts b/apps/core/src/utils/stake/checkIfIsTimelockedStaking.ts new file mode 100644 index 00000000000..b88e6166068 --- /dev/null +++ b/apps/core/src/utils/stake/checkIfIsTimelockedStaking.ts @@ -0,0 +1,25 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +import type { IotaTransactionBlockResponse } from '@iota/iota-sdk/client'; +import { STAKING_REQUEST_EVENT, UNSTAKING_REQUEST_EVENT } from '../../constants'; + +export function checkIfIsTimelockedStaking(events: IotaTransactionBlockResponse['events']) { + const TIMELOCKED_STAKING_EVENT_MODULE = 'timelocked_staking'; + if (!events) return { isTimelockedStaking: false, isTimelockedUnstaking: false }; + + const stakeTypeTransaction = events?.find(({ type }) => type === STAKING_REQUEST_EVENT); + const unstakeTypeTransaction = events?.find(({ type }) => type === UNSTAKING_REQUEST_EVENT); + + const isTimelockedStaking = + stakeTypeTransaction?.transactionModule === TIMELOCKED_STAKING_EVENT_MODULE; + const isTimelockedUnstaking = + unstakeTypeTransaction?.transactionModule === TIMELOCKED_STAKING_EVENT_MODULE; + + return { + isTimelockedStaking, + isTimelockedUnstaking, + stakeTypeTransaction, + unstakeTypeTransaction, + }; +} diff --git a/apps/core/src/utils/stake/getStakeDetailsFromEvent.ts b/apps/core/src/utils/stake/getStakeDetailsFromEvent.ts new file mode 100644 index 00000000000..d1e4f406d77 --- /dev/null +++ b/apps/core/src/utils/stake/getStakeDetailsFromEvent.ts @@ -0,0 +1,18 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +import { StakeEventJson } from '../../interfaces'; +import type { IotaEvent } from '@iota/iota-sdk/client'; + +export function getStakeDetailsFromEvent(event: IotaEvent): { + stakedAmount: string; + validatorAddress: string; + epoch: number; +} { + const eventJson = event.parsedJson as StakeEventJson; + return { + stakedAmount: eventJson.amount || '0', + validatorAddress: eventJson.validator_address || '', + epoch: Number(eventJson.epoch || '0'), + }; +} diff --git a/apps/core/src/utils/stake/getTransactionAmountForTimelocked.ts b/apps/core/src/utils/stake/getTransactionAmountForTimelocked.ts new file mode 100644 index 00000000000..42af4741347 --- /dev/null +++ b/apps/core/src/utils/stake/getTransactionAmountForTimelocked.ts @@ -0,0 +1,24 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +import type { IotaEvent } from '@iota/iota-sdk/client'; +import { + getStakeDetailsFromEvent, + getUnstakeDetailsFromEvent, + checkIfIsTimelockedStaking, +} from '.'; + +export function getTransactionAmountForTimelocked( + events: IotaEvent[], +): bigint | undefined | string { + if (!events) return; + const { isTimelockedStaking, isTimelockedUnstaking } = checkIfIsTimelockedStaking(events); + + if (isTimelockedStaking) { + const { stakedAmount } = getStakeDetailsFromEvent(events[0]); + return stakedAmount; + } else if (isTimelockedUnstaking) { + const { totalAmount } = getUnstakeDetailsFromEvent(events[0]); + return totalAmount; + } +} diff --git a/apps/core/src/utils/stake/getUnstakeDetailsFromEvent.ts b/apps/core/src/utils/stake/getUnstakeDetailsFromEvent.ts new file mode 100644 index 00000000000..5a9a13ddc57 --- /dev/null +++ b/apps/core/src/utils/stake/getUnstakeDetailsFromEvent.ts @@ -0,0 +1,23 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +import { UnstakeEventJson } from '../../interfaces'; +import type { IotaEvent } from '@iota/iota-sdk/client'; + +export function getUnstakeDetailsFromEvent(event: IotaEvent): { + principalAmount: string; + rewardAmount: string; + totalAmount: bigint; + validatorAddress: string; +} { + const eventJson = event.parsedJson as UnstakeEventJson; + const principalAmount = eventJson.principal_amount || '0'; + const rewardAmount = eventJson.reward_amount || '0'; + const totalAmount = BigInt(principalAmount) + BigInt(rewardAmount); + return { + principalAmount, + rewardAmount, + totalAmount, + validatorAddress: eventJson.validator_address || '', + }; +} diff --git a/apps/core/src/utils/stake/index.ts b/apps/core/src/utils/stake/index.ts index 6ecca7353f6..e742b3377ec 100644 --- a/apps/core/src/utils/stake/index.ts +++ b/apps/core/src/utils/stake/index.ts @@ -7,3 +7,7 @@ export * from './createStakeTransaction'; export * from './createTimelockedUnstakeTransaction'; export * from './createTimelockedStakeTransaction'; export * from './createValidationSchema'; +export * from './getStakeDetailsFromEvent'; +export * from './checkIfIsTimelockedStaking'; +export * from './getUnstakeDetailsFromEvent'; +export * from './getTransactionAmountForTimelocked'; diff --git a/apps/core/src/utils/toTitleCase.ts b/apps/core/src/utils/toTitleCase.ts new file mode 100644 index 00000000000..1081f0c2857 --- /dev/null +++ b/apps/core/src/utils/toTitleCase.ts @@ -0,0 +1,10 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +export function toTitleCase(str: string): string { + if (!str) return str; + return str + .split(' ') + .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()) + .join(' '); +} diff --git a/apps/core/src/utils/transaction/getLabel.ts b/apps/core/src/utils/transaction/getLabel.ts deleted file mode 100644 index fbcd0e57649..00000000000 --- a/apps/core/src/utils/transaction/getLabel.ts +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// Modifications Copyright (c) 2024 IOTA Stiftung -// SPDX-License-Identifier: Apache-2.0 -import { IotaTransactionBlockResponse } from '@iota/iota-sdk/client'; - -// todo: add more logic for deriving transaction label -export const getLabel = (transaction: IotaTransactionBlockResponse, currentAddress?: string) => { - const isSender = transaction.transaction?.data.sender === currentAddress; - // Rename to "Send" to Transaction - return isSender ? 'Transaction' : 'Receive'; -}; diff --git a/apps/core/src/utils/transaction/getTransactionAction.ts b/apps/core/src/utils/transaction/getTransactionAction.ts new file mode 100644 index 00000000000..990576c9bc3 --- /dev/null +++ b/apps/core/src/utils/transaction/getTransactionAction.ts @@ -0,0 +1,42 @@ +// Copyright (c) Mysten Labs, Inc. +// Modifications Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +import { IotaTransactionBlockResponse } from '@iota/iota-sdk/client'; +import { TransactionAction } from '../../interfaces'; +import { checkIfIsTimelockedStaking } from '../stake'; +import { isMigrationTransaction, isUnlockTimelockedObjectTransaction } from '..'; + +export const getTransactionAction = ( + transaction: IotaTransactionBlockResponse, + currentAddress?: string, +) => { + const sender = transaction.transaction?.data.sender; + const { + isTimelockedStaking, + isTimelockedUnstaking, + stakeTypeTransaction, + unstakeTypeTransaction, + } = checkIfIsTimelockedStaking(transaction?.events); + + const isMigration = isMigrationTransaction(transaction.transaction); + const isSupplyIncreaseVestingCollect = isUnlockTimelockedObjectTransaction( + transaction.transaction, + ); + + if (isMigration) { + return TransactionAction.Migration; + } else if (isSupplyIncreaseVestingCollect) { + return TransactionAction.TimelockedCollect; + } else if (stakeTypeTransaction) { + return isTimelockedStaking ? TransactionAction.TimelockedStaked : TransactionAction.Staked; + } else if (unstakeTypeTransaction) { + return isTimelockedUnstaking + ? TransactionAction.TimelockedUnstaked + : TransactionAction.Unstaked; + } else if (sender) { + return sender === currentAddress ? TransactionAction.Send : TransactionAction.Receive; + } else { + return TransactionAction.Transaction; + } +}; diff --git a/apps/core/src/utils/transaction/index.ts b/apps/core/src/utils/transaction/index.ts index f5ef47663b6..375e87ca890 100644 --- a/apps/core/src/utils/transaction/index.ts +++ b/apps/core/src/utils/transaction/index.ts @@ -4,7 +4,7 @@ export * from './getBalanceChangeSummary'; export * from './getObjectChangeSummary'; -export * from './getLabel'; +export * from './getTransactionAction'; export * from './getGasSummary'; export * from './groupByOwner'; export * from './getOwnerType'; @@ -13,3 +13,5 @@ export * from './createTokenTransferTransaction'; export * from './getObjectDisplayLookup'; export * from './createNftSendValidationSchema'; export * from './createUnlockTimelockedObjectsTransaction'; +export * from './isMigrationTransaction'; +export * from './isUnlockTimelockedObjectTransaction'; diff --git a/apps/core/src/utils/transaction/isMigrationTransaction.ts b/apps/core/src/utils/transaction/isMigrationTransaction.ts new file mode 100644 index 00000000000..b7889f2c747 --- /dev/null +++ b/apps/core/src/utils/transaction/isMigrationTransaction.ts @@ -0,0 +1,29 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +import type { + IotaTransaction, + IotaTransactionBlockResponse, + MoveCallIotaTransaction, +} from '@iota/iota-sdk/client'; +import { STARDUST_PACKAGE_ID } from '../../constants'; + +export function isMigrationTransaction( + transaction: IotaTransactionBlockResponse['transaction'], +): boolean { + if (!transaction || transaction.data.transaction.kind !== 'ProgrammableTransaction') + return false; + const moveCallTxs = transaction.data.transaction.transactions.filter(isMoveCall); + const isMigration = moveCallTxs.some( + (tx) => + tx.MoveCall.package === STARDUST_PACKAGE_ID && + tx.MoveCall.function === 'extract_assets', + ); + return isMigration; +} + +function isMoveCall( + transaction: IotaTransaction, +): transaction is { MoveCall: MoveCallIotaTransaction } { + return 'MoveCall' in transaction; +} diff --git a/apps/core/src/utils/transaction/isUnlockTimelockedObjectTransaction.ts b/apps/core/src/utils/transaction/isUnlockTimelockedObjectTransaction.ts new file mode 100644 index 00000000000..e0ced9c249e --- /dev/null +++ b/apps/core/src/utils/transaction/isUnlockTimelockedObjectTransaction.ts @@ -0,0 +1,28 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +import type { + IotaTransaction, + IotaTransactionBlockResponse, + MoveCallIotaTransaction, +} from '@iota/iota-sdk/client'; +import { TIMELOCK_MODULE } from '../..'; + +export function isUnlockTimelockedObjectTransaction( + transaction: IotaTransactionBlockResponse['transaction'], +): boolean { + if (!transaction || transaction.data.transaction.kind !== 'ProgrammableTransaction') + return false; + const moveCallTxs = transaction.data.transaction.transactions + .filter(isMoveCall) + .filter((tx) => tx.MoveCall.module === TIMELOCK_MODULE); + const isUnlockTimelockedObject = + moveCallTxs.length > 0 && moveCallTxs.every((tx) => tx.MoveCall.function === 'unlock'); + return isUnlockTimelockedObject; +} + +function isMoveCall( + transaction: IotaTransaction, +): transaction is { MoveCall: MoveCallIotaTransaction } { + return 'MoveCall' in transaction; +} diff --git a/apps/core/tailwind.config.ts b/apps/core/tailwind.config.ts index 6add2c1e8b4..917136bd1c6 100644 --- a/apps/core/tailwind.config.ts +++ b/apps/core/tailwind.config.ts @@ -4,7 +4,7 @@ import { type Config } from 'tailwindcss'; import colors from 'tailwindcss/colors'; -import uiKitResponsivePreset from '../../apps/ui-kit/src/lib/tailwind/responsive.preset'; +import uiKitResponsivePreset from '../../apps/ui-kit/src/lib/tailwind/responsive.presets'; export default { presets: [uiKitResponsivePreset], diff --git a/apps/core/tsconfig.json b/apps/core/tsconfig.json new file mode 100644 index 00000000000..1f2191974c4 --- /dev/null +++ b/apps/core/tsconfig.json @@ -0,0 +1,13 @@ +{ + "compilerOptions": { + "jsx": "react-jsx", + "module": "ESNext", + "target": "ES2020", + "strict": true, + "esModuleInterop": true, + "moduleResolution": "node", + "skipLibCheck": true + }, + "include": ["src"], + "exclude": ["node_modules", "dist"] +} diff --git a/apps/explorer/package.json b/apps/explorer/package.json index 8982b0a9d72..96c9e97af5f 100644 --- a/apps/explorer/package.json +++ b/apps/explorer/package.json @@ -27,11 +27,11 @@ "@growthbook/growthbook": "^1.0.0", "@growthbook/growthbook-react": "^1.0.0", "@headlessui/react": "^1.7.15", + "@iota/apps-ui-icons": "workspace:*", "@iota/apps-ui-kit": "workspace:*", "@iota/core": "workspace:*", "@iota/dapp-kit": "workspace:*", "@iota/iota-sdk": "workspace:*", - "@iota/ui-icons": "workspace:*", "@radix-ui/react-collapsible": "^1.0.3", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-popover": "^1.1.1", diff --git a/apps/explorer/src/components/ThemedIotaLogo.tsx b/apps/explorer/src/components/ThemedIotaLogo.tsx index 71a42a49a8d..de85d75486d 100644 --- a/apps/explorer/src/components/ThemedIotaLogo.tsx +++ b/apps/explorer/src/components/ThemedIotaLogo.tsx @@ -1,7 +1,7 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { IotaLogoWeb } from '@iota/ui-icons'; +import { IotaLogoWeb } from '@iota/apps-ui-icons'; export function ThemedIotaLogo(): React.JSX.Element { return ; diff --git a/apps/explorer/src/components/activity/EpochsActivityTable.tsx b/apps/explorer/src/components/activity/EpochsActivityTable.tsx index f0db0b602ce..00cb1f54849 100644 --- a/apps/explorer/src/components/activity/EpochsActivityTable.tsx +++ b/apps/explorer/src/components/activity/EpochsActivityTable.tsx @@ -5,7 +5,7 @@ import { InfoBox, InfoBoxStyle, InfoBoxType, Select, SelectSize } from '@iota/apps-ui-kit'; import { useIotaClientQuery, useIotaClient, useIotaClientInfiniteQuery } from '@iota/dapp-kit'; import { useCursorPagination } from '@iota/core'; -import { Warning } from '@iota/ui-icons'; +import { Warning } from '@iota/apps-ui-icons'; import { useQuery } from '@tanstack/react-query'; import { useState } from 'react'; import { PlaceholderTable, TableCard } from '~/components/ui'; diff --git a/apps/explorer/src/components/activity/TransactionsActivityTable.tsx b/apps/explorer/src/components/activity/TransactionsActivityTable.tsx index e5f06e71af0..78bbd1bb25e 100644 --- a/apps/explorer/src/components/activity/TransactionsActivityTable.tsx +++ b/apps/explorer/src/components/activity/TransactionsActivityTable.tsx @@ -14,7 +14,7 @@ import { import { numberSuffix } from '~/lib/utils'; import { InfoBox, InfoBoxStyle, InfoBoxType, Select, SelectSize } from '@iota/apps-ui-kit'; import { generateTransactionsTableColumns } from '~/lib/ui'; -import { Warning } from '@iota/ui-icons'; +import { Warning } from '@iota/apps-ui-icons'; import { PAGE_SIZES_RANGE_20_60 } from '~/lib/constants'; interface TransactionsActivityTableProps { diff --git a/apps/explorer/src/components/checkpoints/CheckpointsTable.tsx b/apps/explorer/src/components/checkpoints/CheckpointsTable.tsx index 6d90547d25e..67b1e5680fe 100644 --- a/apps/explorer/src/components/checkpoints/CheckpointsTable.tsx +++ b/apps/explorer/src/components/checkpoints/CheckpointsTable.tsx @@ -4,7 +4,7 @@ import { InfoBox, InfoBoxStyle, InfoBoxType, Select, SelectSize } from '@iota/apps-ui-kit'; import { useIotaClientQuery } from '@iota/dapp-kit'; -import { Warning } from '@iota/ui-icons'; +import { Warning } from '@iota/apps-ui-icons'; import { useMemo, useState } from 'react'; import { PlaceholderTable, TableCard } from '~/components/ui'; import { DEFAULT_CHECKPOINTS_LIMIT, useGetCheckpoints } from '~/hooks/useGetCheckpoints'; diff --git a/apps/explorer/src/components/error-boundary/ErrorBoundary.tsx b/apps/explorer/src/components/error-boundary/ErrorBoundary.tsx index f62bd7fd95c..02f9114f70f 100644 --- a/apps/explorer/src/components/error-boundary/ErrorBoundary.tsx +++ b/apps/explorer/src/components/error-boundary/ErrorBoundary.tsx @@ -7,7 +7,7 @@ import { useLocation } from 'react-router-dom'; import type { ReactNode } from 'react'; import type { FallbackProps } from 'react-error-boundary'; import { InfoBox, InfoBoxType, InfoBoxStyle } from '@iota/apps-ui-kit'; -import { Warning } from '@iota/ui-icons'; +import { Warning } from '@iota/apps-ui-icons'; function Fallback({ error }: FallbackProps): JSX.Element { return ( diff --git a/apps/explorer/src/components/footer/Footer.tsx b/apps/explorer/src/components/footer/Footer.tsx index 8779d6cc52f..93a2f629ed1 100644 --- a/apps/explorer/src/components/footer/Footer.tsx +++ b/apps/explorer/src/components/footer/Footer.tsx @@ -28,7 +28,7 @@ function FooterLinks(): JSX.Element { ); } -function Footer(): JSX.Element { +export function Footer(): JSX.Element { return (
); } - -export default Footer; diff --git a/apps/explorer/src/components/gas-breakdown/GasBreakdown.tsx b/apps/explorer/src/components/gas-breakdown/GasBreakdown.tsx index a226583b306..34e84d2f645 100644 --- a/apps/explorer/src/components/gas-breakdown/GasBreakdown.tsx +++ b/apps/explorer/src/components/gas-breakdown/GasBreakdown.tsx @@ -10,7 +10,7 @@ import { useFormatCoin, } from '@iota/core'; import { IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; -import { Copy } from '@iota/ui-icons'; +import { Copy } from '@iota/apps-ui-icons'; import toast from 'react-hot-toast'; import { AddressLink, CollapsibleCard, ObjectLink } from '~/components/ui'; diff --git a/apps/explorer/src/components/header/Header.tsx b/apps/explorer/src/components/header/Header.tsx index a2f95b165d5..9d1d428f7cd 100644 --- a/apps/explorer/src/components/header/Header.tsx +++ b/apps/explorer/src/components/header/Header.tsx @@ -3,12 +3,12 @@ // SPDX-License-Identifier: Apache-2.0 import { NetworkSelector } from '../network'; -import Search from '../search/Search'; +import { Search } from '../search'; import { LinkWithQuery } from '~/components/ui'; import { ThemedIotaLogo } from '~/components'; import { ThemeSwitcher } from '@iota/core'; -function Header(): JSX.Element { +export function Header(): JSX.Element { return (
@@ -30,5 +30,3 @@ function Header(): JSX.Element {
); } - -export default Header; diff --git a/apps/explorer/src/components/layout/PageLayout.tsx b/apps/explorer/src/components/layout/PageLayout.tsx index 8b8192d799e..da1a7ab00e9 100644 --- a/apps/explorer/src/components/layout/PageLayout.tsx +++ b/apps/explorer/src/components/layout/PageLayout.tsx @@ -7,11 +7,11 @@ import { useAppsBackend, Feature } from '@iota/core'; import { Network } from '@iota/iota-sdk/client'; import { useQuery } from '@tanstack/react-query'; import { type ReactNode, useRef } from 'react'; -import Footer from '../footer/Footer'; -import Header from '../header/Header'; +import { Footer } from '../footer'; +import { Header } from '../header'; import { useNetworkContext } from '~/contexts'; import { InfoBox, InfoBoxStyle, InfoBoxType, LoadingIndicator } from '@iota/apps-ui-kit'; -import { Info } from '@iota/ui-icons'; +import { Info } from '@iota/apps-ui-icons'; type PageLayoutProps = { content: ReactNode; diff --git a/apps/explorer/src/components/module/module-functions-interaction/FunctionExecutionResult.tsx b/apps/explorer/src/components/module/module-functions-interaction/FunctionExecutionResult.tsx index ef2bbb9a238..d81f63a2194 100644 --- a/apps/explorer/src/components/module/module-functions-interaction/FunctionExecutionResult.tsx +++ b/apps/explorer/src/components/module/module-functions-interaction/FunctionExecutionResult.tsx @@ -4,7 +4,7 @@ import { LinkGroup } from './LinkGroup'; import type { IotaTransactionBlockResponse, OwnedObjectRef } from '@iota/iota-sdk/client'; -import { Close } from '@iota/ui-icons'; +import { Close } from '@iota/apps-ui-icons'; interface ToObjectLink { text: string; diff --git a/apps/explorer/src/components/module/module-functions-interaction/ModuleFunctionsInteraction.tsx b/apps/explorer/src/components/module/module-functions-interaction/ModuleFunctionsInteraction.tsx index 2e914e5a6cd..56cd9e3c82b 100644 --- a/apps/explorer/src/components/module/module-functions-interaction/ModuleFunctionsInteraction.tsx +++ b/apps/explorer/src/components/module/module-functions-interaction/ModuleFunctionsInteraction.tsx @@ -6,7 +6,7 @@ import { useMemo } from 'react'; import { ModuleFunction } from './ModuleFunction'; import { useNormalizedMoveModule } from '~/hooks/useNormalizedMoveModule'; import { InfoBox, InfoBoxStyle, InfoBoxType, LoadingIndicator } from '@iota/apps-ui-kit'; -import { Info, Warning } from '@iota/ui-icons'; +import { Info, Warning } from '@iota/apps-ui-icons'; type ModuleFunctionsInteractionProps = { packageId: string; diff --git a/apps/explorer/src/components/network/NetworkSelector.tsx b/apps/explorer/src/components/network/NetworkSelector.tsx index deb20e35e9b..05f56f46e5e 100644 --- a/apps/explorer/src/components/network/NetworkSelector.tsx +++ b/apps/explorer/src/components/network/NetworkSelector.tsx @@ -11,7 +11,7 @@ import { CustomRPCInput } from '~/components/ui'; import { ampli } from '~/lib/utils'; import { type NetworkId, getAllNetworks } from '@iota/iota-sdk/client'; import { Button, ButtonSize, ButtonType, Dropdown, ListItem } from '@iota/apps-ui-kit'; -import { ArrowDown, CheckmarkFilled } from '@iota/ui-icons'; +import { ArrowDown, CheckmarkFilled } from '@iota/apps-ui-icons'; import { Transition } from '@headlessui/react'; interface NetworkOption { diff --git a/apps/explorer/src/components/object/FieldItem.tsx b/apps/explorer/src/components/object/FieldItem.tsx index 50fc0d0f6c3..25fdc86df61 100644 --- a/apps/explorer/src/components/object/FieldItem.tsx +++ b/apps/explorer/src/components/object/FieldItem.tsx @@ -49,7 +49,7 @@ export function FieldItem({ if (normalizedType === TYPE_URL) { return ( -
+
{value} @@ -58,7 +58,7 @@ export function FieldItem({ } return ( -
+
{value === null || value === undefined ? null : String(value)}
); diff --git a/apps/explorer/src/components/object/ObjectFieldsCard.tsx b/apps/explorer/src/components/object/ObjectFieldsCard.tsx index db5390ed143..8f2cdd62087 100644 --- a/apps/explorer/src/components/object/ObjectFieldsCard.tsx +++ b/apps/explorer/src/components/object/ObjectFieldsCard.tsx @@ -24,7 +24,7 @@ import { InfoBoxStyle, InfoBoxType, } from '@iota/apps-ui-kit'; -import { Warning } from '@iota/ui-icons'; +import { Warning } from '@iota/apps-ui-icons'; const DEFAULT_OPEN_FIELDS = 3; const DEFAULT_FIELDS_COUNT_TO_SHOW_SEARCH = 10; diff --git a/apps/explorer/src/components/object/UnderlyingObjectCard.tsx b/apps/explorer/src/components/object/UnderlyingObjectCard.tsx index 7d4ce9061e9..824ae045be1 100644 --- a/apps/explorer/src/components/object/UnderlyingObjectCard.tsx +++ b/apps/explorer/src/components/object/UnderlyingObjectCard.tsx @@ -6,7 +6,7 @@ import { useIotaClientQuery } from '@iota/dapp-kit'; import { FieldItem } from './FieldItem'; import type { DynamicFieldName } from '@iota/iota-sdk/client'; import { InfoBox, InfoBoxStyle, InfoBoxType, LoadingIndicator } from '@iota/apps-ui-kit'; -import { Warning } from '@iota/ui-icons'; +import { Warning } from '@iota/apps-ui-icons'; interface UnderlyingObjectCardProps { parentId: string; diff --git a/apps/explorer/src/components/owned-coins/CoinItem.tsx b/apps/explorer/src/components/owned-coins/CoinItem.tsx index d745b9202c3..c06e2d6def5 100644 --- a/apps/explorer/src/components/owned-coins/CoinItem.tsx +++ b/apps/explorer/src/components/owned-coins/CoinItem.tsx @@ -12,7 +12,7 @@ interface CoinItemProps { coin: CoinStruct; } -export default function CoinItem({ coin }: CoinItemProps): JSX.Element { +export function CoinItem({ coin }: CoinItemProps): JSX.Element { const [formattedBalance, symbol] = useFormatCoin(coin.balance, coin.coinType); return ( (isIotaCoin); const [formattedTotalBalance, symbol] = useFormatCoin(coin.totalBalance, coin.coinType); diff --git a/apps/explorer/src/components/owned-coins/OwnedCoins.tsx b/apps/explorer/src/components/owned-coins/OwnedCoins.tsx index 619fd8e9864..6f25165f27c 100644 --- a/apps/explorer/src/components/owned-coins/OwnedCoins.tsx +++ b/apps/explorer/src/components/owned-coins/OwnedCoins.tsx @@ -7,9 +7,9 @@ import { useIotaClientQuery } from '@iota/dapp-kit'; import { type CoinBalance, type Network } from '@iota/iota-sdk/client'; import { useNetwork } from '~/hooks'; import { normalizeIotaAddress } from '@iota/iota-sdk/utils'; -import { FilterList, Warning } from '@iota/ui-icons'; +import { FilterList, Warning } from '@iota/apps-ui-icons'; import { useMemo, useState } from 'react'; -import OwnedCoinView from './OwnedCoinView'; +import { OwnedCoinView } from './OwnedCoinView'; import { Button, ButtonType, diff --git a/apps/explorer/src/components/owned-coins/OwnedCoinsPanel.tsx b/apps/explorer/src/components/owned-coins/OwnedCoinsPanel.tsx index 2f2895ab885..5d9fd09d144 100644 --- a/apps/explorer/src/components/owned-coins/OwnedCoinsPanel.tsx +++ b/apps/explorer/src/components/owned-coins/OwnedCoinsPanel.tsx @@ -5,7 +5,7 @@ import { useElementDimensions, useGetCoins, useOnScreen } from '@iota/core'; import clsx from 'clsx'; import { useEffect, useRef } from 'react'; -import CoinItem from './CoinItem'; +import { CoinItem } from './CoinItem'; import { LoadingIndicator } from '@iota/apps-ui-kit'; const MIN_CONTAINER_WIDTH_SIZE = 500; @@ -15,7 +15,7 @@ type CoinsPanelProps = { id: string; }; -export default function CoinsPanel({ coinType, id }: CoinsPanelProps): JSX.Element { +export function CoinsPanel({ coinType, id }: CoinsPanelProps): JSX.Element { const containerRef = useRef(null); const coinsSectionRef = useRef(null); const { isIntersecting } = useOnScreen(containerRef); diff --git a/apps/explorer/src/components/owned-objects/OwnedObjects.tsx b/apps/explorer/src/components/owned-objects/OwnedObjects.tsx index 4323c7301c3..32f4559062e 100644 --- a/apps/explorer/src/components/owned-objects/OwnedObjects.tsx +++ b/apps/explorer/src/components/owned-objects/OwnedObjects.tsx @@ -27,7 +27,7 @@ import { InfoBoxStyle, InfoBoxType, } from '@iota/apps-ui-kit'; -import { ListViewLarge, ListViewMedium, ListViewSmall, Warning } from '@iota/ui-icons'; +import { ListViewLarge, ListViewMedium, ListViewSmall, Warning } from '@iota/apps-ui-icons'; import clsx from 'clsx'; import { useEffect, useMemo, useState } from 'react'; import { ListView, NoObjectsOwnedMessage, SmallThumbnailsView, ThumbnailsView } from '~/components'; @@ -68,9 +68,15 @@ const VIEW_MODES = [ function getItemsRangeFromCurrentPage( currentPage: number, itemsPerPage: number, + availableItems?: number, ): ItemsRangeFromCurrentPage { const start = currentPage * itemsPerPage + 1; - const end = start + itemsPerPage - 1; + let end = start + itemsPerPage - 1; + + if (availableItems && availableItems < itemsPerPage) { + end = start + availableItems - 1; + } + return { start, end }; } @@ -143,11 +149,7 @@ export function OwnedObjects({ id }: OwnedObjectsProps): JSX.Element { ); const { start, end } = useMemo( - () => - getItemsRangeFromCurrentPage( - pagination.currentPage, - filteredData?.length || PAGE_SIZES_RANGE_10_50[0], - ), + () => getItemsRangeFromCurrentPage(pagination.currentPage, limit, filteredData?.length), [filteredData?.length, pagination.currentPage], ); diff --git a/apps/explorer/src/components/owned-objects/SmallThumbnailsView.tsx b/apps/explorer/src/components/owned-objects/SmallThumbnailsView.tsx index c9095bc12c1..8c1ef9539b3 100644 --- a/apps/explorer/src/components/owned-objects/SmallThumbnailsView.tsx +++ b/apps/explorer/src/components/owned-objects/SmallThumbnailsView.tsx @@ -5,7 +5,7 @@ import { Tooltip, TooltipPosition } from '@iota/apps-ui-kit'; import { type IotaObjectResponse } from '@iota/iota-sdk/client'; import { formatAddress } from '@iota/iota-sdk/utils'; -import { Info, Loader } from '@iota/ui-icons'; +import { Info, Loader } from '@iota/apps-ui-icons'; import { type ReactNode } from 'react'; import { ObjectLink, ObjectVideoImage } from '~/components/ui'; import { useResolveVideo } from '~/hooks/useResolveVideo'; diff --git a/apps/explorer/src/components/owned-objects/ThumbnailsView.tsx b/apps/explorer/src/components/owned-objects/ThumbnailsView.tsx index 2f397d42f2e..45b1a86a26f 100644 --- a/apps/explorer/src/components/owned-objects/ThumbnailsView.tsx +++ b/apps/explorer/src/components/owned-objects/ThumbnailsView.tsx @@ -4,7 +4,7 @@ import { type IotaObjectResponse } from '@iota/iota-sdk/client'; import { formatAddress } from '@iota/iota-sdk/utils'; -import { Loader } from '@iota/ui-icons'; +import { Loader } from '@iota/apps-ui-icons'; import { ObjectLink, ObjectVideoImage } from '~/components/ui'; import { useResolveVideo } from '~/hooks/useResolveVideo'; import { parseObjectType, trimStdLibPrefix } from '~/lib/utils'; diff --git a/apps/explorer/src/components/search/Search.tsx b/apps/explorer/src/components/search/Search.tsx index d2a0f41eebf..61a5bfaa2d4 100644 --- a/apps/explorer/src/components/search/Search.tsx +++ b/apps/explorer/src/components/search/Search.tsx @@ -10,7 +10,7 @@ import { useDebouncedValue } from '~/hooks/useDebouncedValue'; import { useSearch } from '~/hooks/useSearch'; import { ampli } from '~/lib/utils'; -function Search(): JSX.Element { +export function Search(): JSX.Element { const [query, setQuery] = useState(''); const debouncedQuery = useDebouncedValue(query); const { isPending, data: results } = useSearch(debouncedQuery); @@ -58,5 +58,3 @@ function Search(): JSX.Element { /> ); } - -export default Search; diff --git a/apps/explorer/src/components/top-validators-card/TopValidatorsCard.tsx b/apps/explorer/src/components/top-validators-card/TopValidatorsCard.tsx index 2f4f653a9cc..1d43fadbd8b 100644 --- a/apps/explorer/src/components/top-validators-card/TopValidatorsCard.tsx +++ b/apps/explorer/src/components/top-validators-card/TopValidatorsCard.tsx @@ -3,11 +3,20 @@ // SPDX-License-Identifier: Apache-2.0 import { useIotaClientQuery } from '@iota/dapp-kit'; -import { PlaceholderTable, TableCard } from '~/components/ui'; +import { Link, PlaceholderTable, TableCard } from '~/components/ui'; import { generateValidatorsTableColumns } from '~/lib/ui'; -import { InfoBox, InfoBoxStyle, InfoBoxType, Panel, Title } from '@iota/apps-ui-kit'; +import { + Button, + ButtonSize, + ButtonType, + InfoBox, + InfoBoxStyle, + InfoBoxType, + Panel, + Title, +} from '@iota/apps-ui-kit'; import { ErrorBoundary } from '../error-boundary/ErrorBoundary'; -import { Warning } from '@iota/ui-icons'; +import { Warning } from '@iota/apps-ui-icons'; const NUMBER_OF_VALIDATORS = 10; @@ -19,6 +28,9 @@ type TopValidatorsCardProps = { export function TopValidatorsCard({ limit, showIcon }: TopValidatorsCardProps): JSX.Element { const { data, isPending, isSuccess, isError } = useIotaClientQuery('getLatestIotaSystemState'); + const topActiveValidators = + data?.activeValidators.slice(0, limit || NUMBER_OF_VALIDATORS) ?? []; + const tableColumns = generateValidatorsTableColumns({ atRiskValidators: [], validatorEvents: [], @@ -42,26 +54,33 @@ export function TopValidatorsCard({ limit, showIcon }: TopValidatorsCardProps): return ( - - - <div className="p-md"> - {isPending && ( - <PlaceholderTable - rowCount={limit || NUMBER_OF_VALIDATORS} - rowHeight="13px" - colHeadings={['Name', 'Address', 'Stake']} - /> - )} + <div className="relative"> + <div className="absolute right-0 mr-4 mt-2"> + <Link to="/validators"> + <Button + type={ButtonType.Secondary} + size={ButtonSize.Small} + text="View All" + /> + </Link> + </div> + <Title title="Top Validators" /> - {isSuccess && ( - <ErrorBoundary> - <TableCard - data={data.activeValidators} - columns={tableColumns} - viewAll="/validators" + <div className="p-md"> + {isPending && ( + <PlaceholderTable + rowCount={limit || NUMBER_OF_VALIDATORS} + rowHeight="13px" + colHeadings={['Name', 'Address', 'Stake']} /> - </ErrorBoundary> - )} + )} + + {isSuccess && ( + <ErrorBoundary> + <TableCard data={topActiveValidators} columns={tableColumns} /> + </ErrorBoundary> + )} + </div> </div> </Panel> ); diff --git a/apps/explorer/src/components/transactions/TransactionsForAddress.tsx b/apps/explorer/src/components/transactions/TransactionsForAddress.tsx index e3547919a9b..97de53ef95a 100644 --- a/apps/explorer/src/components/transactions/TransactionsForAddress.tsx +++ b/apps/explorer/src/components/transactions/TransactionsForAddress.tsx @@ -5,7 +5,7 @@ import { InfoBox, InfoBoxStyle, InfoBoxType, LoadingIndicator } from '@iota/apps-ui-kit'; import { useIotaClient } from '@iota/dapp-kit'; import { type IotaTransactionBlockResponse } from '@iota/iota-sdk/client'; -import { Warning } from '@iota/ui-icons'; +import { Warning } from '@iota/apps-ui-icons'; import { useQuery } from '@tanstack/react-query'; import { TableCard } from '~/components/ui'; import { generateTransactionsTableColumns } from '~/lib/ui'; diff --git a/apps/explorer/src/components/ui/ExpandableList.tsx b/apps/explorer/src/components/ui/ExpandableList.tsx index 73060d50085..abf14e4ba37 100644 --- a/apps/explorer/src/components/ui/ExpandableList.tsx +++ b/apps/explorer/src/components/ui/ExpandableList.tsx @@ -3,7 +3,7 @@ // SPDX-License-Identifier: Apache-2.0 import { type ReactNode, useMemo, useState, createContext, useContext } from 'react'; -import { TriangleDown } from '@iota/ui-icons'; +import { TriangleDown } from '@iota/apps-ui-icons'; import { Button, ButtonSize, ButtonType } from '@iota/apps-ui-kit'; import clsx from 'clsx'; diff --git a/apps/explorer/src/components/ui/ObjectVideoImage.tsx b/apps/explorer/src/components/ui/ObjectVideoImage.tsx index 36584243015..454193699b6 100644 --- a/apps/explorer/src/components/ui/ObjectVideoImage.tsx +++ b/apps/explorer/src/components/ui/ObjectVideoImage.tsx @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { Play } from '@iota/ui-icons'; +import { Play } from '@iota/apps-ui-icons'; import { cva, type VariantProps } from 'class-variance-authority'; import clsx from 'clsx'; diff --git a/apps/explorer/src/components/ui/PageHeader.tsx b/apps/explorer/src/components/ui/PageHeader.tsx index ada56b11ffc..cdf02bcf77c 100644 --- a/apps/explorer/src/components/ui/PageHeader.tsx +++ b/apps/explorer/src/components/ui/PageHeader.tsx @@ -11,7 +11,7 @@ import { Panel, Placeholder, } from '@iota/apps-ui-kit'; -import { Copy, Warning } from '@iota/ui-icons'; +import { Copy, Warning } from '@iota/apps-ui-icons'; import { useCopyToClipboard } from '@iota/core'; import toast from 'react-hot-toast'; diff --git a/apps/explorer/src/components/ui/Pagination.tsx b/apps/explorer/src/components/ui/Pagination.tsx index 3dceec84667..8d39b2da1e0 100644 --- a/apps/explorer/src/components/ui/Pagination.tsx +++ b/apps/explorer/src/components/ui/Pagination.tsx @@ -3,7 +3,7 @@ // SPDX-License-Identifier: Apache-2.0 import { Button, ButtonSize, ButtonType } from '@iota/apps-ui-kit'; -import { ArrowLeft, ArrowRight, DoubleArrowLeft } from '@iota/ui-icons'; +import { ArrowLeft, ArrowRight, DoubleArrowLeft } from '@iota/apps-ui-icons'; import { useState } from 'react'; interface PaginationProps { diff --git a/apps/explorer/src/components/ui/PlayPause.tsx b/apps/explorer/src/components/ui/PlayPause.tsx index 451ae069b42..977ff83223f 100644 --- a/apps/explorer/src/components/ui/PlayPause.tsx +++ b/apps/explorer/src/components/ui/PlayPause.tsx @@ -3,7 +3,7 @@ // SPDX-License-Identifier: Apache-2.0 import { ButtonUnstyled } from '@iota/apps-ui-kit'; -import { Pause, Play } from '@iota/ui-icons'; +import { Pause, Play } from '@iota/apps-ui-icons'; import { motion } from 'framer-motion'; import { useEffect } from 'react'; diff --git a/apps/explorer/src/components/ui/SplitPanes.tsx b/apps/explorer/src/components/ui/SplitPanes.tsx index be26b5d04f8..53fc5fec872 100644 --- a/apps/explorer/src/components/ui/SplitPanes.tsx +++ b/apps/explorer/src/components/ui/SplitPanes.tsx @@ -3,7 +3,7 @@ // SPDX-License-Identifier: Apache-2.0 import { Button, ButtonSize, ButtonType } from '@iota/apps-ui-kit'; -import { ArrowRight, ArrowUp } from '@iota/ui-icons'; +import { ArrowRight, ArrowUp } from '@iota/apps-ui-icons'; import { cva, type VariantProps } from 'class-variance-authority'; import clsx from 'clsx'; import { type ReactNode, useRef, useState } from 'react'; diff --git a/apps/explorer/src/components/ui/image/Image.tsx b/apps/explorer/src/components/ui/image/Image.tsx index 63e18775839..39b1131a5c9 100644 --- a/apps/explorer/src/components/ui/image/Image.tsx +++ b/apps/explorer/src/components/ui/image/Image.tsx @@ -3,13 +3,12 @@ // SPDX-License-Identifier: Apache-2.0 import { LoadingIndicator } from '@iota/apps-ui-kit'; -import { PlaceholderReplace, VisibilityOff } from '@iota/ui-icons'; +import { PlaceholderReplace, VisibilityOff } from '@iota/apps-ui-icons'; import { cva, cx, type VariantProps } from 'class-variance-authority'; import clsx from 'clsx'; import { useAnimate } from 'framer-motion'; import { type ImgHTMLAttributes, useEffect, useState } from 'react'; - -import useImage from '~/hooks/useImage'; +import { useImage } from '~/hooks'; import { ImageVisibility } from '~/lib/enums'; const imageStyles = cva(null, { diff --git a/apps/explorer/src/components/ui/modal/Modal.tsx b/apps/explorer/src/components/ui/modal/Modal.tsx index 236a054d7a2..6d66cf820ad 100644 --- a/apps/explorer/src/components/ui/modal/Modal.tsx +++ b/apps/explorer/src/components/ui/modal/Modal.tsx @@ -3,7 +3,7 @@ // SPDX-License-Identifier: Apache-2.0 import { Dialog, Transition } from '@headlessui/react'; -import { Close } from '@iota/ui-icons'; +import { Close } from '@iota/apps-ui-icons'; import { Fragment, type ReactNode } from 'react'; export interface ModalProps { diff --git a/apps/explorer/src/components/ui/modal/ObjectModal.tsx b/apps/explorer/src/components/ui/modal/ObjectModal.tsx index 3e44d3c0536..26ae2a6d89f 100644 --- a/apps/explorer/src/components/ui/modal/ObjectModal.tsx +++ b/apps/explorer/src/components/ui/modal/ObjectModal.tsx @@ -4,7 +4,7 @@ import { Modal, type ModalProps } from './Modal'; import { Image } from '../image/Image'; -import { Close } from '@iota/ui-icons'; +import { Close } from '@iota/apps-ui-icons'; export interface ObjectModalProps extends Omit<ModalProps, 'children'> { title: string; diff --git a/apps/explorer/src/components/validator/ValidatorMeta.tsx b/apps/explorer/src/components/validator/ValidatorMeta.tsx index 1b04666cf06..5543344c591 100644 --- a/apps/explorer/src/components/validator/ValidatorMeta.tsx +++ b/apps/explorer/src/components/validator/ValidatorMeta.tsx @@ -5,7 +5,7 @@ import { Badge, BadgeType, KeyValueInfo, Panel } from '@iota/apps-ui-kit'; import { type IotaValidatorSummary } from '@iota/iota-sdk/client'; import toast from 'react-hot-toast'; -import { ArrowTopRight } from '@iota/ui-icons'; +import { ArrowTopRight } from '@iota/apps-ui-icons'; import { AddressLink } from '~/components/ui'; import { ImageIcon, ImageIconSize } from '@iota/core'; diff --git a/apps/explorer/src/components/validator/ValidatorStats.tsx b/apps/explorer/src/components/validator/ValidatorStats.tsx index a39b65a7eec..06992a863a1 100644 --- a/apps/explorer/src/components/validator/ValidatorStats.tsx +++ b/apps/explorer/src/components/validator/ValidatorStats.tsx @@ -149,7 +149,7 @@ export function ValidatorStats({ tooltipText={ !tallyingScore ? 'Coming soon' - : 'A score created by validators to assess each other’s performance during Iota’s standard operations.' + : 'A score created by validators to assess each other’s performance during IOTA’s standard operations.' } tooltipPosition={TooltipPosition.Right} /> diff --git a/apps/explorer/src/hooks/useImage.ts b/apps/explorer/src/hooks/useImage.ts index f750e4ac715..50018b6568f 100644 --- a/apps/explorer/src/hooks/useImage.ts +++ b/apps/explorer/src/hooks/useImage.ts @@ -47,5 +47,3 @@ export function useImage({ src = '', moderate = true }: UseImageProps) { return { moderation, url: formatted, status, ref }; } - -export default useImage; diff --git a/apps/explorer/src/index.tsx b/apps/explorer/src/index.tsx index 670a7e6ad93..aad5ea550a5 100644 --- a/apps/explorer/src/index.tsx +++ b/apps/explorer/src/index.tsx @@ -9,7 +9,6 @@ import { QueryClientProvider } from '@tanstack/react-query'; import React from 'react'; import ReactDOM from 'react-dom/client'; import { RouterProvider } from 'react-router-dom'; - import { growthbook, initAmplitude, initSentry, queryClient } from './lib/utils'; import { router } from './pages'; diff --git a/apps/explorer/src/lib/enums/imageVisibility.enum.ts b/apps/explorer/src/lib/enums/imageVisibility.enums.ts similarity index 100% rename from apps/explorer/src/lib/enums/imageVisibility.enum.ts rename to apps/explorer/src/lib/enums/imageVisibility.enums.ts diff --git a/apps/explorer/src/lib/enums/index.ts b/apps/explorer/src/lib/enums/index.ts index 21eccaf2e98..459938152ff 100644 --- a/apps/explorer/src/lib/enums/index.ts +++ b/apps/explorer/src/lib/enums/index.ts @@ -1,7 +1,7 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -export * from './objectViewMode.enum'; -export * from './objectFilterValue.enum'; -export * from './imageVisibility.enum'; -export * from './splitPaneKey.enum'; +export * from './objectViewMode.enums'; +export * from './objectFilterValue.enums'; +export * from './imageVisibility.enums'; +export * from './splitPaneKey.enums'; diff --git a/apps/explorer/src/lib/enums/objectFilterValue.enum.ts b/apps/explorer/src/lib/enums/objectFilterValue.enums.ts similarity index 100% rename from apps/explorer/src/lib/enums/objectFilterValue.enum.ts rename to apps/explorer/src/lib/enums/objectFilterValue.enums.ts diff --git a/apps/explorer/src/lib/enums/objectViewMode.enum.ts b/apps/explorer/src/lib/enums/objectViewMode.enums.ts similarity index 100% rename from apps/explorer/src/lib/enums/objectViewMode.enum.ts rename to apps/explorer/src/lib/enums/objectViewMode.enums.ts diff --git a/apps/explorer/src/lib/enums/splitPaneKey.enum.ts b/apps/explorer/src/lib/enums/splitPaneKey.enums.ts similarity index 100% rename from apps/explorer/src/lib/enums/splitPaneKey.enum.ts rename to apps/explorer/src/lib/enums/splitPaneKey.enums.ts diff --git a/apps/explorer/src/lib/ui/utils/generateCheckpointsTableColumns.tsx b/apps/explorer/src/lib/ui/utils/generateCheckpointsTableColumns.tsx index 27db60a3252..091dab73950 100644 --- a/apps/explorer/src/lib/ui/utils/generateCheckpointsTableColumns.tsx +++ b/apps/explorer/src/lib/ui/utils/generateCheckpointsTableColumns.tsx @@ -46,12 +46,12 @@ export function generateCheckpointsTableColumns(): ColumnDef<Checkpoint>[] { }, { header: 'Transactions', - accessorKey: 'networkTotalTransactions', + accessorKey: 'transactions', cell: ({ getValue }) => { - const networkTotalTransactions = getValue<Checkpoint['networkTotalTransactions']>(); + const transactions = getValue<Checkpoint['transactions']>(); return ( <TableCellBase> - <TableCellText>{networkTotalTransactions}</TableCellText> + <TableCellText>{transactions.length}</TableCellText> </TableCellBase> ); }, @@ -70,17 +70,5 @@ export function generateCheckpointsTableColumns(): ColumnDef<Checkpoint>[] { ); }, }, - { - header: 'Transaction Block Count', - accessorKey: 'transactions', - cell: ({ getValue }) => { - const transactions = getValue<Checkpoint['transactions']>(); - return ( - <TableCellBase> - <TableCellText>{transactions.length}</TableCellText> - </TableCellBase> - ); - }, - }, ]; } diff --git a/apps/explorer/src/lib/ui/utils/generateTransactionsTableColumns.tsx b/apps/explorer/src/lib/ui/utils/generateTransactionsTableColumns.tsx index 3cc12a45e2a..ace65b6ba98 100644 --- a/apps/explorer/src/lib/ui/utils/generateTransactionsTableColumns.tsx +++ b/apps/explorer/src/lib/ui/utils/generateTransactionsTableColumns.tsx @@ -89,11 +89,12 @@ export function generateTransactionsTableColumns(): ColumnDef<IotaTransactionBlo accessorKey: 'timestampMs', cell: ({ getValue }) => { const timestampMs = getValue(); + const elapsedTime = timestampMs + ? getElapsedTime(Number(timestampMs), Date.now()) + : '--'; return ( <TableCellBase> - <TableCellText> - {getElapsedTime(Number(timestampMs), Date.now()) || '--'} - </TableCellText> + <TableCellText>{elapsedTime}</TableCellText> </TableCellBase> ); }, diff --git a/apps/explorer/src/lib/utils/sentry.ts b/apps/explorer/src/lib/utils/sentry.ts index e8c3f689aab..d49b9db38a8 100644 --- a/apps/explorer/src/lib/utils/sentry.ts +++ b/apps/explorer/src/lib/utils/sentry.ts @@ -24,14 +24,12 @@ export function initSentry() { : 'https://c8085701fa2650fb2a090ed6aba6bc62@o4508279186718720.ingest.de.sentry.io/4508279963320400', environment: import.meta.env.VITE_VERCEL_ENV, integrations: [ - new Sentry.BrowserTracing({ - routingInstrumentation: Sentry.reactRouterV6Instrumentation( - useEffect, - useLocation, - useNavigationType, - createRoutesFromChildren, - matchRoutes, - ), + Sentry.reactRouterV6BrowserTracingIntegration({ + useEffect, + useLocation, + useNavigationType, + createRoutesFromChildren, + matchRoutes, }), ], tracesSampleRate: SENTRY_SAMPLE_RATE, diff --git a/apps/explorer/src/pages/address-result/AddressResult.tsx b/apps/explorer/src/pages/address-result/AddressResult.tsx index 32808a8d796..7f55716dbaf 100644 --- a/apps/explorer/src/pages/address-result/AddressResult.tsx +++ b/apps/explorer/src/pages/address-result/AddressResult.tsx @@ -47,7 +47,7 @@ function AddressResult({ address }: { address: string }): JSX.Element { ); } -export default function AddressResultPage(): JSX.Element { +export function AddressResultPage(): JSX.Element { const { id } = useParams(); return ( diff --git a/apps/explorer/src/pages/checkpoints/CheckpointDetail.tsx b/apps/explorer/src/pages/checkpoints/CheckpointDetail.tsx index 7b23c9054b1..45fda86c521 100644 --- a/apps/explorer/src/pages/checkpoints/CheckpointDetail.tsx +++ b/apps/explorer/src/pages/checkpoints/CheckpointDetail.tsx @@ -24,7 +24,7 @@ import { import { useState } from 'react'; import { useFormatCoin } from '@iota/core'; import { IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; -import { Warning } from '@iota/ui-icons'; +import { Warning } from '@iota/apps-ui-icons'; enum FeesTabs { GasAndStorageFees = 'gas-and-storage-fees', @@ -37,7 +37,7 @@ enum NestedTabs { Aggregated = 'aggregated', } -export default function CheckpointDetail(): JSX.Element { +export function CheckpointDetail(): JSX.Element { const [activeFeesTabId, setActiveFeesTabId] = useState(FeesTabs.GasAndStorageFees); const [activeDetailsTabId, setActiveDetailsTabId] = useState(DetailsTabs.Details); const [activeNestedTabId, setActiveNestedTabId] = useState(NestedTabs.Aggregated); diff --git a/apps/explorer/src/pages/epochs/EpochDetail.tsx b/apps/explorer/src/pages/epochs/EpochDetail.tsx index cf6b074838d..468afa3ef5a 100644 --- a/apps/explorer/src/pages/epochs/EpochDetail.tsx +++ b/apps/explorer/src/pages/epochs/EpochDetail.tsx @@ -28,14 +28,14 @@ import cx from 'clsx'; import { TokenStats } from './stats/TokenStats'; import { EpochTopStats } from './stats/EpochTopStats'; import { getEpochStorageFundFlow } from '~/lib/utils'; -import { Warning } from '@iota/ui-icons'; +import { Warning } from '@iota/apps-ui-icons'; enum EpochTabs { Checkpoints = 'checkpoints', Validators = 'validators', } -export default function EpochDetail() { +export function EpochDetail() { const [activeTabId, setActiveTabId] = useState(EpochTabs.Checkpoints); const { id } = useParams(); const enhancedRpc = useEnhancedRpcClient(); diff --git a/apps/explorer/src/pages/epochs/stats/EpochTopStats.tsx b/apps/explorer/src/pages/epochs/stats/EpochTopStats.tsx index c99f5a51c39..93d650863e1 100644 --- a/apps/explorer/src/pages/epochs/stats/EpochTopStats.tsx +++ b/apps/explorer/src/pages/epochs/stats/EpochTopStats.tsx @@ -5,11 +5,12 @@ import { ProgressBar } from '~/components'; import { EpochStatsGrid } from './EpochStats'; import { LabelText, LabelTextSize } from '@iota/apps-ui-kit'; -import { formatDate } from '@iota/core'; +import { Feature, formatDate, useFeatureEnabledByNetwork } from '@iota/core'; import { TokenStats } from './TokenStats'; import { getSupplyChangeAfterEpochEnd } from '~/lib'; import { useEpochProgress } from '../utils'; -import type { EndOfEpochInfo } from '@iota/iota-sdk/src/client'; +import type { Network, EndOfEpochInfo } from '@iota/iota-sdk/client'; +import { useNetworkContext } from '~/contexts'; interface EpochProgressProps { start: number; @@ -25,8 +26,15 @@ export function EpochTopStats({ endOfEpochInfo, }: EpochProgressProps): React.JSX.Element { const { progress, label } = useEpochProgress(); + const [network] = useNetworkContext(); + const endTime = inProgress ? label : end ? formatDate(end) : undefined; + const isBurntAndMintedTokensInEndedEpochsFeatureEnabled = useFeatureEnabledByNetwork( + Feature.BurntAndMintedTokensInEndedEpochs, + network as Network, + ); + return ( <div className="flex w-full flex-col gap-md--rs"> {inProgress ? <ProgressBar progress={progress || 0} /> : null} @@ -35,12 +43,30 @@ export function EpochTopStats({ <LabelText text={formatDate(start)} label="Start" /> {endTime ? <LabelText text={endTime} label="End" /> : null} {endOfEpochInfo && ( - <TokenStats - label="Supply Change" - size={LabelTextSize.Large} - amount={getSupplyChangeAfterEpochEnd(endOfEpochInfo)} - showSign - /> + <> + {isBurntAndMintedTokensInEndedEpochsFeatureEnabled && ( + <> + <TokenStats + label="Burnt Tokens" + size={LabelTextSize.Large} + amount={BigInt(endOfEpochInfo?.burntTokensAmount)} + showSign + /> + <TokenStats + label="Minted Tokens" + size={LabelTextSize.Large} + amount={BigInt(endOfEpochInfo?.mintedTokensAmount)} + showSign + /> + </> + )} + <TokenStats + label="Supply Change" + size={LabelTextSize.Large} + amount={getSupplyChangeAfterEpochEnd(endOfEpochInfo)} + showSign + /> + </> )} </EpochStatsGrid> </div> diff --git a/apps/explorer/src/pages/home/Home.tsx b/apps/explorer/src/pages/home/Home.tsx index 1cee4ba88ab..d89625da7b0 100644 --- a/apps/explorer/src/pages/home/Home.tsx +++ b/apps/explorer/src/pages/home/Home.tsx @@ -21,7 +21,7 @@ import { useNetwork } from '~/hooks'; const TRANSACTIONS_LIMIT = 15; -function Home(): JSX.Element { +export function Home(): JSX.Element { const [network] = useNetwork(); const isIotaTokenCardEnabled = network === Network.Mainnet; return ( @@ -77,5 +77,3 @@ function Home(): JSX.Element { /> ); } - -export default Home; diff --git a/apps/explorer/src/pages/index.tsx b/apps/explorer/src/pages/index.tsx index c1e40edb438..d2bd6722775 100644 --- a/apps/explorer/src/pages/index.tsx +++ b/apps/explorer/src/pages/index.tsx @@ -4,13 +4,13 @@ import { wrapCreateBrowserRouter } from '@sentry/react'; import { createBrowserRouter, Navigate, useLocation, useParams } from 'react-router-dom'; -import AddressResult from './address-result/AddressResult'; -import CheckpointDetail from './checkpoints/CheckpointDetail'; -import EpochDetail from './epochs/EpochDetail'; -import Home from './home/Home'; +import { AddressResultPage } from './address-result/AddressResult'; +import { CheckpointDetail } from './checkpoints/CheckpointDetail'; +import { EpochDetail } from './epochs/EpochDetail'; +import { Home } from './home/Home'; import { ObjectResult } from './object-result/ObjectResult'; import { Recent } from './recent'; -import TransactionResult from './transaction-result/TransactionResult'; +import { TransactionResult } from './transaction-result/TransactionResult'; import { ValidatorDetails } from './validator/ValidatorDetails'; import { ValidatorPageResult } from './validators/Validators'; import { Layout } from '~/components'; @@ -39,7 +39,7 @@ export const router = sentryCreateBrowserRouter([ { path: 'epoch/current', element: <EpochDetail /> }, { path: 'txblock/:id', element: <TransactionResult /> }, { path: 'epoch/:id', element: <EpochDetail /> }, - { path: 'address/:id', element: <AddressResult /> }, + { path: 'address/:id', element: <AddressResultPage /> }, { path: 'validators', element: <ValidatorPageResult /> }, { path: 'validator/:id', element: <ValidatorDetails /> }, ], diff --git a/apps/explorer/src/pages/object-result/ObjectResult.tsx b/apps/explorer/src/pages/object-result/ObjectResult.tsx index 147ba0fc4d5..5cea76ef174 100644 --- a/apps/explorer/src/pages/object-result/ObjectResult.tsx +++ b/apps/explorer/src/pages/object-result/ObjectResult.tsx @@ -8,10 +8,9 @@ import { ErrorBoundary, PageLayout } from '~/components'; import { PageHeader } from '~/components/ui'; import { ObjectView } from '~/pages/object-result/views/ObjectView'; import { translate, type DataType } from './ObjectResultType'; -import PkgView from './views/PkgView'; -import { TokenView } from './views/TokenView'; +import { PkgView, TokenView } from './views'; import { InfoBox, InfoBoxStyle, InfoBoxType, LoadingIndicator } from '@iota/apps-ui-kit'; -import { Warning } from '@iota/ui-icons'; +import { Warning } from '@iota/apps-ui-icons'; const PACKAGE_TYPE_NAME = 'Move Package'; diff --git a/apps/explorer/src/pages/object-result/views/ObjectView.tsx b/apps/explorer/src/pages/object-result/views/ObjectView.tsx index 087498cf6ef..79dead884ce 100644 --- a/apps/explorer/src/pages/object-result/views/ObjectView.tsx +++ b/apps/explorer/src/pages/object-result/views/ObjectView.tsx @@ -13,7 +13,7 @@ import { normalizeStructTag, parseStructTag, } from '@iota/iota-sdk/utils'; -import { ArrowTopRight } from '@iota/ui-icons'; +import { ArrowTopRight } from '@iota/apps-ui-icons'; import { useQuery } from '@tanstack/react-query'; import clsx from 'clsx'; import { type PropsWithChildren, type ReactNode, useEffect, useState } from 'react'; diff --git a/apps/explorer/src/pages/object-result/views/PkgView.tsx b/apps/explorer/src/pages/object-result/views/PkgView.tsx index 7710894489a..56beb84b038 100644 --- a/apps/explorer/src/pages/object-result/views/PkgView.tsx +++ b/apps/explorer/src/pages/object-result/views/PkgView.tsx @@ -39,7 +39,7 @@ interface PkgViewProps { data: DataType; } -function PkgView({ data }: PkgViewProps): JSX.Element { +export function PkgView({ data }: PkgViewProps): JSX.Element { const [selectedSplitPanelOrientation, setSplitPanelOrientation] = useState( SPLIT_PANELS_ORIENTATION[1].value, ); @@ -145,5 +145,3 @@ function PkgView({ data }: PkgViewProps): JSX.Element { </div> ); } - -export default PkgView; diff --git a/apps/explorer/src/pages/object-result/views/index.ts b/apps/explorer/src/pages/object-result/views/index.ts new file mode 100644 index 00000000000..08b740d5988 --- /dev/null +++ b/apps/explorer/src/pages/object-result/views/index.ts @@ -0,0 +1,5 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +export * from './PkgView'; +export * from './TokenView'; diff --git a/apps/explorer/src/pages/transaction-result/Events.tsx b/apps/explorer/src/pages/transaction-result/Events.tsx index cc53d32ec83..936a34f962e 100644 --- a/apps/explorer/src/pages/transaction-result/Events.tsx +++ b/apps/explorer/src/pages/transaction-result/Events.tsx @@ -11,7 +11,7 @@ import { } from '@iota/apps-ui-kit'; import { type IotaEvent } from '@iota/iota-sdk/client'; import { formatAddress, parseStructTag } from '@iota/iota-sdk/utils'; -import { TriangleDown } from '@iota/ui-icons'; +import { TriangleDown } from '@iota/apps-ui-icons'; import clsx from 'clsx'; import { useState } from 'react'; import { SyntaxHighlighter } from '~/components'; diff --git a/apps/explorer/src/pages/transaction-result/TransactionResult.tsx b/apps/explorer/src/pages/transaction-result/TransactionResult.tsx index 2abdd1770a9..f98645a6d30 100644 --- a/apps/explorer/src/pages/transaction-result/TransactionResult.tsx +++ b/apps/explorer/src/pages/transaction-result/TransactionResult.tsx @@ -9,7 +9,7 @@ import { PageLayout } from '~/components'; import { PageHeader } from '~/components/ui'; import { TransactionView } from './TransactionView'; import { InfoBox, InfoBoxType, InfoBoxStyle } from '@iota/apps-ui-kit'; -import { Warning } from '@iota/ui-icons'; +import { Warning } from '@iota/apps-ui-icons'; interface TransactionResultPageHeaderProps { transaction?: IotaTransactionBlockResponse; @@ -40,7 +40,7 @@ function TransactionResultPageHeader({ ); } -export default function TransactionResult(): JSX.Element { +export function TransactionResult(): JSX.Element { const { id } = useParams(); const { isPending, diff --git a/apps/explorer/src/pages/transaction-result/programmable-transaction-view/InputsCard.tsx b/apps/explorer/src/pages/transaction-result/programmable-transaction-view/InputsCard.tsx index 8610e071aed..439e6ba6593 100644 --- a/apps/explorer/src/pages/transaction-result/programmable-transaction-view/InputsCard.tsx +++ b/apps/explorer/src/pages/transaction-result/programmable-transaction-view/InputsCard.tsx @@ -4,6 +4,7 @@ import { KeyValueInfo, TitleSize } from '@iota/apps-ui-kit'; import { type IotaCallArg } from '@iota/iota-sdk/client'; +import { toHEX } from '@iota/iota-sdk/utils'; import { ProgrammableTxnBlockCard, AddressLink, ObjectLink, CollapsibleCard } from '~/components'; import { useBreakpoint } from '~/hooks'; @@ -48,6 +49,13 @@ export function InputsCard({ inputs }: InputsCardProps): JSX.Element | null { } else if (REGEX_NUMBER.test(stringValue)) { const bigNumber = BigInt(stringValue); renderValue = bigNumber.toLocaleString(); + } else if ( + 'valueType' in input && + 'value' in input && + input.valueType === 'vector<u8>' && + key === 'value' + ) { + renderValue = toHEX(new Uint8Array(stringValue.split(',').map(Number))); } else { renderValue = stringValue; } diff --git a/apps/explorer/src/pages/transaction-result/transaction-summary/BalanceChanges.tsx b/apps/explorer/src/pages/transaction-result/transaction-summary/BalanceChanges.tsx index 8597bec0a25..27e6081325f 100644 --- a/apps/explorer/src/pages/transaction-result/transaction-summary/BalanceChanges.tsx +++ b/apps/explorer/src/pages/transaction-result/transaction-summary/BalanceChanges.tsx @@ -23,7 +23,7 @@ import { ImageIconSize, CoinIcon, } from '@iota/core'; -import { RecognizedBadge } from '@iota/ui-icons'; +import { RecognizedBadge } from '@iota/apps-ui-icons'; import { useMemo } from 'react'; import { AddressLink, CollapsibleCard } from '~/components/ui'; import { BREAK_POINT, useMediaQuery } from '~/hooks'; diff --git a/apps/explorer/src/pages/transaction-result/transaction-summary/ObjectChanges.tsx b/apps/explorer/src/pages/transaction-result/transaction-summary/ObjectChanges.tsx index 34d4e09ef68..7b7c83838a1 100644 --- a/apps/explorer/src/pages/transaction-result/transaction-summary/ObjectChanges.tsx +++ b/apps/explorer/src/pages/transaction-result/transaction-summary/ObjectChanges.tsx @@ -35,7 +35,7 @@ import { KeyValueInfo, TitleSize, } from '@iota/apps-ui-kit'; -import { TriangleDown } from '@iota/ui-icons'; +import { TriangleDown } from '@iota/apps-ui-icons'; interface ItemProps { label: string; diff --git a/apps/explorer/src/pages/transaction-result/transaction-summary/ObjectDisplay.tsx b/apps/explorer/src/pages/transaction-result/transaction-summary/ObjectDisplay.tsx index 278df5ca5c4..0d351a6f64d 100644 --- a/apps/explorer/src/pages/transaction-result/transaction-summary/ObjectDisplay.tsx +++ b/apps/explorer/src/pages/transaction-result/transaction-summary/ObjectDisplay.tsx @@ -5,7 +5,7 @@ import { Card, CardAction, CardActionType, CardBody, CardImage, CardType } from '@iota/apps-ui-kit'; import { ImageIcon } from '@iota/core'; import { type DisplayFieldsResponse } from '@iota/iota-sdk/client'; -import { ArrowTopRight } from '@iota/ui-icons'; +import { ArrowTopRight } from '@iota/apps-ui-icons'; import { useState } from 'react'; import { ObjectModal } from '~/components/ui'; diff --git a/apps/explorer/src/pages/validator/ValidatorDetails.tsx b/apps/explorer/src/pages/validator/ValidatorDetails.tsx index a8ea8c7ae60..d491edac6da 100644 --- a/apps/explorer/src/pages/validator/ValidatorDetails.tsx +++ b/apps/explorer/src/pages/validator/ValidatorDetails.tsx @@ -5,13 +5,13 @@ import { useGetValidatorsApy, useGetValidatorsEvents } from '@iota/core'; import { useIotaClientQuery } from '@iota/dapp-kit'; import { type IotaSystemStateSummary } from '@iota/iota-sdk/client'; -import React, { useMemo } from 'react'; +import { useMemo } from 'react'; import { useParams } from 'react-router-dom'; import { PageLayout, ValidatorMeta, ValidatorStats } from '~/components'; import { VALIDATOR_LOW_STAKE_GRACE_PERIOD } from '~/lib/constants'; import { getValidatorMoveEvent } from '~/lib/utils'; import { InfoBox, InfoBoxStyle, InfoBoxType, LoadingIndicator } from '@iota/apps-ui-kit'; -import { Warning } from '@iota/ui-icons'; +import { Warning } from '@iota/apps-ui-icons'; const getAtRiskRemainingEpochs = ( data: IotaSystemStateSummary | undefined, diff --git a/apps/explorer/src/pages/validators/Validators.tsx b/apps/explorer/src/pages/validators/Validators.tsx index 78e333cbf90..a11a5b69790 100644 --- a/apps/explorer/src/pages/validators/Validators.tsx +++ b/apps/explorer/src/pages/validators/Validators.tsx @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import React, { type JSX, useMemo } from 'react'; +import { type JSX, useMemo } from 'react'; import { roundFloat, useFormatCoin, useGetValidatorsApy, useGetValidatorsEvents } from '@iota/core'; import { DisplayStats, @@ -19,7 +19,7 @@ import { useIotaClientQuery } from '@iota/dapp-kit'; 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/ui-icons'; +import { Warning } from '@iota/apps-ui-icons'; function ValidatorPageResult(): JSX.Element { const { data, isPending, isSuccess, isError } = useIotaClientQuery('getLatestIotaSystemState'); diff --git a/apps/explorer/tailwind.config.ts b/apps/explorer/tailwind.config.ts index 553727d7246..4d1800c3212 100644 --- a/apps/explorer/tailwind.config.ts +++ b/apps/explorer/tailwind.config.ts @@ -5,7 +5,7 @@ import colors from 'tailwindcss/colors'; import { type Config } from 'tailwindcss'; // Note: exception for the tailwind preset import -import uiKitResponsivePreset from '../../apps/ui-kit/src/lib/tailwind/responsive.preset'; +import uiKitResponsivePreset from '../../apps/ui-kit/src/lib/tailwind/responsive.presets'; export default { presets: [uiKitResponsivePreset], diff --git a/apps/ui-icons/CHANGELOG.md b/apps/ui-icons/CHANGELOG.md new file mode 100644 index 00000000000..63b69e18156 --- /dev/null +++ b/apps/ui-icons/CHANGELOG.md @@ -0,0 +1,13 @@ +# @iota/apps-ui-icons + +## 0.2.1 + +### Patch Changes + +- b772ffa: Add correct prepublish script + +## 0.2.0 + +### Minor Changes + +- c1c5e9b: Initial npm release diff --git a/apps/ui-icons/README.md b/apps/ui-icons/README.md index 058a955d440..e5b6d018eca 100644 --- a/apps/ui-icons/README.md +++ b/apps/ui-icons/README.md @@ -1,4 +1,4 @@ -# `@iota/ui-icons` +# `@iota/apps-ui-icons` ## Exporting Icons diff --git a/apps/ui-icons/package.json b/apps/ui-icons/package.json index eea49bf5aeb..89fe42bc47a 100644 --- a/apps/ui-icons/package.json +++ b/apps/ui-icons/package.json @@ -1,9 +1,13 @@ { - "name": "@iota/ui-icons", - "main": "src/index.ts", - "private": true, + "name": "@iota/apps-ui-icons", + "version": "0.2.1", + "main": "dist/index.js", + "module": "dist/index.mjs", + "types": "dist/index.d.ts", "sideEffects": false, "scripts": { + "build": "tsup src/index.ts --format cjs,esm --dts", + "prepublishOnly": "pnpm run build", "clean:src": "rimraf src/**", "clean:svgs": "rimraf svgs/**", "clean:all": "pnpm clean:src && pnpm clean:svgs", @@ -21,6 +25,7 @@ "@types/react": "^18.3.3", "react": "^18.3.1", "rimraf": "^5.0.1", + "tsup": "^8.3.5", "typescript": "^5.5.3" } } diff --git a/apps/ui-kit/CHANGELOG.md b/apps/ui-kit/CHANGELOG.md new file mode 100644 index 00000000000..e5deb97322c --- /dev/null +++ b/apps/ui-kit/CHANGELOG.md @@ -0,0 +1,20 @@ +# @iota/apps-ui-kit + +## 0.2.1 + +### Patch Changes + +- b772ffa: Add correct prepublish script +- Updated dependencies [b772ffa] + - @iota/apps-ui-icons@0.2.1 + +## 0.2.0 + +### Minor Changes + +- c1c5e9b: Initial npm release + +### Patch Changes + +- Updated dependencies [c1c5e9b] + - @iota/apps-ui-icons@0.2.0 diff --git a/apps/ui-kit/package.json b/apps/ui-kit/package.json index 89e9785c466..92ccab8f83a 100644 --- a/apps/ui-kit/package.json +++ b/apps/ui-kit/package.json @@ -1,16 +1,19 @@ { "name": "@iota/apps-ui-kit", - "private": true, - "version": "0.0.1-rc.1", + "version": "0.2.1", "repository": { "type": "git", "url": "github.com:iotaledger/iota.git" }, "license": "Apache-2.0", "files": [ + "CHANGELOG.md", + "LICENSE", + "src", "dist" ], "scripts": { + "prepublishOnly": "pnpm turbo run build", "prettier:check": "prettier -c --ignore-unknown --ignore-path=../../.prettierignore --ignore-path=.prettierignore .", "prettier:fix": "prettier -w --ignore-unknown --ignore-path=../../.prettierignore --ignore-path=.prettierignore .", "eslint:check": "eslint --max-warnings=0 .", @@ -34,7 +37,7 @@ "types": "./dist/index.d.ts", "dependencies": { "@fontsource/inter": "^5.0.17", - "@iota/ui-icons": "workspace:*", + "@iota/apps-ui-icons": "workspace:*", "@radix-ui/react-dialog": "^1.1.1", "@radix-ui/react-visually-hidden": "^1.1.0", "classnames": "^2.5.1", diff --git a/apps/ui-kit/src/lib/components/atoms/badge/Badge.tsx b/apps/ui-kit/src/lib/components/atoms/badge/Badge.tsx index 390b8078342..c6dcba7dff9 100644 --- a/apps/ui-kit/src/lib/components/atoms/badge/Badge.tsx +++ b/apps/ui-kit/src/lib/components/atoms/badge/Badge.tsx @@ -1,7 +1,6 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import React from 'react'; import cx from 'classnames'; import { BadgeType } from './badge.enums'; import { BACKGROUND_COLORS, BADGE_TEXT_CLASS, BORDER_COLORS, TEXT_COLORS } from './badge.classes'; diff --git a/apps/ui-kit/src/lib/components/atoms/button-segment/ButtonSegment.tsx b/apps/ui-kit/src/lib/components/atoms/button-segment/ButtonSegment.tsx index f3ff331c2d8..1024457df90 100644 --- a/apps/ui-kit/src/lib/components/atoms/button-segment/ButtonSegment.tsx +++ b/apps/ui-kit/src/lib/components/atoms/button-segment/ButtonSegment.tsx @@ -1,7 +1,6 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import React from 'react'; import { BACKGROUND_COLORS, BACKGROUND_COLORS_SELECTED, @@ -9,9 +8,9 @@ import { TEXT_COLORS_SELECTED, UNDERLINED, UNDERLINED_SELECTED, -} from './button-segment.classes'; +} from './buttonSegment.classes'; import cx from 'classnames'; -import { ButtonSegmentType } from './button-segment.enums'; +import { ButtonSegmentType } from './buttonSegment.enums'; import { ButtonUnstyled } from '../button'; interface ButtonSegmentProps { diff --git a/apps/ui-kit/src/lib/components/atoms/button-segment/button-segment.classes.ts b/apps/ui-kit/src/lib/components/atoms/button-segment/buttonSegment.classes.ts similarity index 100% rename from apps/ui-kit/src/lib/components/atoms/button-segment/button-segment.classes.ts rename to apps/ui-kit/src/lib/components/atoms/button-segment/buttonSegment.classes.ts diff --git a/apps/ui-kit/src/lib/components/atoms/button-segment/button-segment.enums.ts b/apps/ui-kit/src/lib/components/atoms/button-segment/buttonSegment.enums.ts similarity index 100% rename from apps/ui-kit/src/lib/components/atoms/button-segment/button-segment.enums.ts rename to apps/ui-kit/src/lib/components/atoms/button-segment/buttonSegment.enums.ts diff --git a/apps/ui-kit/src/lib/components/atoms/button-segment/index.ts b/apps/ui-kit/src/lib/components/atoms/button-segment/index.ts index f8b4143cc86..0c48b7e0022 100644 --- a/apps/ui-kit/src/lib/components/atoms/button-segment/index.ts +++ b/apps/ui-kit/src/lib/components/atoms/button-segment/index.ts @@ -2,4 +2,4 @@ // SPDX-License-Identifier: Apache-2.0 export * from './ButtonSegment'; -export * from './button-segment.enums'; +export * from './buttonSegment.enums'; diff --git a/apps/ui-kit/src/lib/components/atoms/button/Button.tsx b/apps/ui-kit/src/lib/components/atoms/button/Button.tsx index b35d566c50f..793aa5d8cb1 100644 --- a/apps/ui-kit/src/lib/components/atoms/button/Button.tsx +++ b/apps/ui-kit/src/lib/components/atoms/button/Button.tsx @@ -1,7 +1,6 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import React from 'react'; import { ButtonHtmlType, ButtonSize, ButtonType } from './button.enums'; import { PADDINGS, diff --git a/apps/ui-kit/src/lib/components/atoms/button/button-variants/ButtonPill.tsx b/apps/ui-kit/src/lib/components/atoms/button/button-variants/ButtonPill.tsx index b502085574e..53556258c6a 100644 --- a/apps/ui-kit/src/lib/components/atoms/button/button-variants/ButtonPill.tsx +++ b/apps/ui-kit/src/lib/components/atoms/button/button-variants/ButtonPill.tsx @@ -2,7 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 import { ButtonHtmlType } from '../button.enums'; -import { ButtonVariantProps } from './button-variants.types'; +import { ButtonVariantProps } from './buttonVariants.types'; export function ButtonPill({ htmlType = ButtonHtmlType.Button, diff --git a/apps/ui-kit/src/lib/components/atoms/button/button-variants/ButtonUnstyled.tsx b/apps/ui-kit/src/lib/components/atoms/button/button-variants/ButtonUnstyled.tsx index 1b4d64ad861..53400f13513 100644 --- a/apps/ui-kit/src/lib/components/atoms/button/button-variants/ButtonUnstyled.tsx +++ b/apps/ui-kit/src/lib/components/atoms/button/button-variants/ButtonUnstyled.tsx @@ -2,7 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 import { ButtonHtmlType } from '../button.enums'; -import { ButtonVariantProps } from './button-variants.types'; +import { ButtonVariantProps } from './buttonVariants.types'; import cx from 'classnames'; export function ButtonUnstyled({ diff --git a/apps/ui-kit/src/lib/components/atoms/button/button-variants/button-variants.types.ts b/apps/ui-kit/src/lib/components/atoms/button/button-variants/buttonVariants.types.ts similarity index 100% rename from apps/ui-kit/src/lib/components/atoms/button/button-variants/button-variants.types.ts rename to apps/ui-kit/src/lib/components/atoms/button/button-variants/buttonVariants.types.ts diff --git a/apps/ui-kit/src/lib/components/atoms/checkbox/Checkbox.tsx b/apps/ui-kit/src/lib/components/atoms/checkbox/Checkbox.tsx index aec9826a44f..ca2a875e0a6 100644 --- a/apps/ui-kit/src/lib/components/atoms/checkbox/Checkbox.tsx +++ b/apps/ui-kit/src/lib/components/atoms/checkbox/Checkbox.tsx @@ -3,7 +3,7 @@ import { forwardRef, useEffect, useRef } from 'react'; import cx from 'classnames'; -import { Dash, Checkmark } from '@iota/ui-icons'; +import { Dash, Checkmark } from '@iota/apps-ui-icons'; interface CheckboxProps { /** diff --git a/apps/ui-kit/src/lib/components/atoms/divider/Divider.tsx b/apps/ui-kit/src/lib/components/atoms/divider/Divider.tsx index a9391cfe151..996bc0ac005 100644 --- a/apps/ui-kit/src/lib/components/atoms/divider/Divider.tsx +++ b/apps/ui-kit/src/lib/components/atoms/divider/Divider.tsx @@ -1,7 +1,6 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import React from 'react'; import { DividerType } from './divider.enums'; import cx from 'classnames'; import { BACKGROUND_COLORS, DIVIDER_FULL_WIDTH } from './divider.classes'; diff --git a/apps/ui-kit/src/lib/components/atoms/header/Header.tsx b/apps/ui-kit/src/lib/components/atoms/header/Header.tsx index 0f9f3ff6eda..e3e43aa6913 100644 --- a/apps/ui-kit/src/lib/components/atoms/header/Header.tsx +++ b/apps/ui-kit/src/lib/components/atoms/header/Header.tsx @@ -3,7 +3,7 @@ import cx from 'classnames'; import { Button, ButtonSize, ButtonType } from '../button'; -import { ArrowBack, Close } from '@iota/ui-icons'; +import { ArrowBack, Close } from '@iota/apps-ui-icons'; interface HeaderProps { /** diff --git a/apps/ui-kit/src/lib/components/atoms/info-box/InfoBox.tsx b/apps/ui-kit/src/lib/components/atoms/info-box/InfoBox.tsx index e8548979d21..bb668cbe24b 100644 --- a/apps/ui-kit/src/lib/components/atoms/info-box/InfoBox.tsx +++ b/apps/ui-kit/src/lib/components/atoms/info-box/InfoBox.tsx @@ -1,10 +1,9 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import React from 'react'; import cx from 'classnames'; -import { InfoBoxStyle, InfoBoxType } from './info-box.enums'; -import { BACKGROUND_COLORS, ICON_COLORS } from './info-box.classes'; +import { InfoBoxStyle, InfoBoxType } from './infoBox.enums'; +import { BACKGROUND_COLORS, ICON_COLORS } from './infoBox.classes'; export interface InfoBoxProps { /** diff --git a/apps/ui-kit/src/lib/components/atoms/info-box/index.ts b/apps/ui-kit/src/lib/components/atoms/info-box/index.ts index c4f12c2be81..fff4ed5d37a 100644 --- a/apps/ui-kit/src/lib/components/atoms/info-box/index.ts +++ b/apps/ui-kit/src/lib/components/atoms/info-box/index.ts @@ -2,4 +2,4 @@ // SPDX-License-Identifier: Apache-2.0 export * from './InfoBox'; -export * from './info-box.enums'; +export * from './infoBox.enums'; diff --git a/apps/ui-kit/src/lib/components/atoms/info-box/info-box.classes.ts b/apps/ui-kit/src/lib/components/atoms/info-box/infoBox.classes.ts similarity index 91% rename from apps/ui-kit/src/lib/components/atoms/info-box/info-box.classes.ts rename to apps/ui-kit/src/lib/components/atoms/info-box/infoBox.classes.ts index ce7136fa7e8..d78493a4af3 100644 --- a/apps/ui-kit/src/lib/components/atoms/info-box/info-box.classes.ts +++ b/apps/ui-kit/src/lib/components/atoms/info-box/infoBox.classes.ts @@ -1,7 +1,7 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { InfoBoxType } from './info-box.enums'; +import { InfoBoxType } from './infoBox.enums'; export const ICON_COLORS: Record<InfoBoxType, string> = { [InfoBoxType.Default]: 'bg-neutral-96 dark:bg-neutral-12 text-neutral-10 dark:text-neutral-92', diff --git a/apps/ui-kit/src/lib/components/atoms/info-box/info-box.enums.ts b/apps/ui-kit/src/lib/components/atoms/info-box/infoBox.enums.ts similarity index 100% rename from apps/ui-kit/src/lib/components/atoms/info-box/info-box.enums.ts rename to apps/ui-kit/src/lib/components/atoms/info-box/infoBox.enums.ts diff --git a/apps/ui-kit/src/lib/components/atoms/key-value-info/KeyValueInfo.tsx b/apps/ui-kit/src/lib/components/atoms/key-value-info/KeyValueInfo.tsx index d15da2af5de..c05c9884f20 100644 --- a/apps/ui-kit/src/lib/components/atoms/key-value-info/KeyValueInfo.tsx +++ b/apps/ui-kit/src/lib/components/atoms/key-value-info/KeyValueInfo.tsx @@ -1,9 +1,9 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import React, { ReactNode } from 'react'; +import { ReactNode } from 'react'; import cx from 'classnames'; -import { Copy, Info } from '@iota/ui-icons'; +import { Copy, Info } from '@iota/apps-ui-icons'; import { ValueSize } from './keyValue.enums'; import { Tooltip, TooltipPosition } from '../tooltip'; import { ButtonUnstyled } from '../button'; @@ -154,5 +154,3 @@ export function KeyValueInfo({ </div> ); } - -export default KeyValueInfo; diff --git a/apps/ui-kit/src/lib/components/atoms/label-text/LabelText.tsx b/apps/ui-kit/src/lib/components/atoms/label-text/LabelText.tsx index 5135219c33c..2cf95723a91 100644 --- a/apps/ui-kit/src/lib/components/atoms/label-text/LabelText.tsx +++ b/apps/ui-kit/src/lib/components/atoms/label-text/LabelText.tsx @@ -1,11 +1,10 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import React from 'react'; import cx from 'classnames'; import { LabelTextSize } from './labelText.enums'; import { LABEL_TEXT_SIZE, SUPPORTING_TEXT_SIZE, TEXT_SIZE } from './labelText.classes'; -import { Info } from '@iota/ui-icons'; +import { Info } from '@iota/apps-ui-icons'; import { TooltipPosition, Tooltip } from '../tooltip'; interface LabelTextProps { diff --git a/apps/ui-kit/src/lib/components/atoms/list-item/ListItem.tsx b/apps/ui-kit/src/lib/components/atoms/list-item/ListItem.tsx index 9f6475a674b..6eb6cf79b50 100644 --- a/apps/ui-kit/src/lib/components/atoms/list-item/ListItem.tsx +++ b/apps/ui-kit/src/lib/components/atoms/list-item/ListItem.tsx @@ -1,9 +1,9 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import React, { PropsWithChildren } from 'react'; +import { PropsWithChildren } from 'react'; import cx from 'classnames'; -import { ArrowRight } from '@iota/ui-icons'; +import { ArrowRight } from '@iota/apps-ui-icons'; import { Button, ButtonSize, ButtonType } from '@/components'; export interface ListItemProps { diff --git a/apps/ui-kit/src/lib/components/atoms/loading-indicator/LoadingIndicator.tsx b/apps/ui-kit/src/lib/components/atoms/loading-indicator/LoadingIndicator.tsx index 86160c55771..53814f9457b 100644 --- a/apps/ui-kit/src/lib/components/atoms/loading-indicator/LoadingIndicator.tsx +++ b/apps/ui-kit/src/lib/components/atoms/loading-indicator/LoadingIndicator.tsx @@ -1,9 +1,8 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import React from 'react'; import cx from 'classnames'; -import { Loader } from '@iota/ui-icons'; +import { Loader } from '@iota/apps-ui-icons'; export interface LoadingIndicatorProps { /** diff --git a/apps/ui-kit/src/lib/components/atoms/panel/Panel.tsx b/apps/ui-kit/src/lib/components/atoms/panel/Panel.tsx index d5eae32a334..0f87336f524 100644 --- a/apps/ui-kit/src/lib/components/atoms/panel/Panel.tsx +++ b/apps/ui-kit/src/lib/components/atoms/panel/Panel.tsx @@ -1,7 +1,6 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import React from 'react'; import cx from 'classnames'; interface PanelProps { diff --git a/apps/ui-kit/src/lib/components/atoms/radio-button/RadioButton.tsx b/apps/ui-kit/src/lib/components/atoms/radio-button/RadioButton.tsx index 54bbb8277de..b1d0177f39f 100644 --- a/apps/ui-kit/src/lib/components/atoms/radio-button/RadioButton.tsx +++ b/apps/ui-kit/src/lib/components/atoms/radio-button/RadioButton.tsx @@ -1,9 +1,8 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import React from 'react'; import cx from 'classnames'; -import { RadioOn, RadioOff } from '@iota/ui-icons'; +import { RadioOn, RadioOff } from '@iota/apps-ui-icons'; interface RadioButtonProps { /** diff --git a/apps/ui-kit/src/lib/components/atoms/snackbar/Snackbar.tsx b/apps/ui-kit/src/lib/components/atoms/snackbar/Snackbar.tsx index 173ae161c1b..da41a13a024 100644 --- a/apps/ui-kit/src/lib/components/atoms/snackbar/Snackbar.tsx +++ b/apps/ui-kit/src/lib/components/atoms/snackbar/Snackbar.tsx @@ -3,7 +3,7 @@ import { useEffect } from 'react'; import cx from 'classnames'; -import { Close } from '@iota/ui-icons'; +import { Close } from '@iota/apps-ui-icons'; import { SnackbarType } from './snackbar.enums'; import { BACKGROUND_COLOR, TEXT_COLOR } from '@/components/atoms/snackbar/snackbar.classes'; diff --git a/apps/ui-kit/src/lib/components/atoms/tooltip/Tooltip.tsx b/apps/ui-kit/src/lib/components/atoms/tooltip/Tooltip.tsx index 467aa94d316..220f47f7da7 100644 --- a/apps/ui-kit/src/lib/components/atoms/tooltip/Tooltip.tsx +++ b/apps/ui-kit/src/lib/components/atoms/tooltip/Tooltip.tsx @@ -1,7 +1,7 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import React, { PropsWithChildren } from 'react'; +import { PropsWithChildren } from 'react'; import cx from 'classnames'; import { TooltipPosition } from './tooltip.enums'; import { TOOLTIP_POSITION } from './tooltip.classes'; diff --git a/apps/ui-kit/src/lib/components/atoms/visual-asset-card/VisualAssetCard.tsx b/apps/ui-kit/src/lib/components/atoms/visual-asset-card/VisualAssetCard.tsx index 1dbcf4731cf..4f35afb1296 100644 --- a/apps/ui-kit/src/lib/components/atoms/visual-asset-card/VisualAssetCard.tsx +++ b/apps/ui-kit/src/lib/components/atoms/visual-asset-card/VisualAssetCard.tsx @@ -1,10 +1,9 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import React from 'react'; -import { VisualAssetType } from './visual-asset-card.enums'; +import { VisualAssetType } from './visualAssetCard.enums'; import { ButtonUnstyled } from '../button'; -import { MoreHoriz } from '@iota/ui-icons'; +import { MoreHoriz } from '@iota/apps-ui-icons'; import cx from 'classnames'; export interface VisualAssetCardProps { diff --git a/apps/ui-kit/src/lib/components/atoms/visual-asset-card/index.ts b/apps/ui-kit/src/lib/components/atoms/visual-asset-card/index.ts index 05a2d49f88d..3e758c82d59 100644 --- a/apps/ui-kit/src/lib/components/atoms/visual-asset-card/index.ts +++ b/apps/ui-kit/src/lib/components/atoms/visual-asset-card/index.ts @@ -2,4 +2,4 @@ // SPDX-License-Identifier: Apache-2.0 export * from './VisualAssetCard'; -export * from './visual-asset-card.enums'; +export * from './visualAssetCard.enums'; diff --git a/apps/ui-kit/src/lib/components/atoms/visual-asset-card/visual-asset-card.enums.ts b/apps/ui-kit/src/lib/components/atoms/visual-asset-card/visualAssetCard.enums.ts similarity index 100% rename from apps/ui-kit/src/lib/components/atoms/visual-asset-card/visual-asset-card.enums.ts rename to apps/ui-kit/src/lib/components/atoms/visual-asset-card/visualAssetCard.enums.ts diff --git a/apps/ui-kit/src/lib/components/molecules/account/Account.tsx b/apps/ui-kit/src/lib/components/molecules/account/Account.tsx index e62f598ad1b..37d6c3099ae 100644 --- a/apps/ui-kit/src/lib/components/molecules/account/Account.tsx +++ b/apps/ui-kit/src/lib/components/molecules/account/Account.tsx @@ -1,11 +1,16 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import React from 'react'; import cx from 'classnames'; import { ButtonUnstyled } from '../../atoms/button'; import { Badge, BadgeType } from '../../atoms'; -import { LockLocked, LockUnlocked, MoreHoriz, CheckmarkFilled, RadioOff } from '@iota/ui-icons'; +import { + LockLocked, + LockUnlocked, + MoreHoriz, + CheckmarkFilled, + RadioOff, +} from '@iota/apps-ui-icons'; import { Address } from '../address'; interface AccountProps { diff --git a/apps/ui-kit/src/lib/components/molecules/address/Address.tsx b/apps/ui-kit/src/lib/components/molecules/address/Address.tsx index 869048a62a2..f05e283e827 100644 --- a/apps/ui-kit/src/lib/components/molecules/address/Address.tsx +++ b/apps/ui-kit/src/lib/components/molecules/address/Address.tsx @@ -1,9 +1,8 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import React from 'react'; import cx from 'classnames'; -import { Copy, ArrowTopRight } from '@iota/ui-icons'; +import { Copy, ArrowTopRight } from '@iota/apps-ui-icons'; import { ButtonUnstyled } from '../../atoms/button'; interface AddressProps { diff --git a/apps/ui-kit/src/lib/components/molecules/card/Card.tsx b/apps/ui-kit/src/lib/components/molecules/card/Card.tsx index cc1b8368349..34c9ca68ef6 100644 --- a/apps/ui-kit/src/lib/components/molecules/card/Card.tsx +++ b/apps/ui-kit/src/lib/components/molecules/card/Card.tsx @@ -1,7 +1,6 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import React from 'react'; import cx from 'classnames'; import { CARD_DISABLED_CLASSES, CARD_TYPE_CLASSES } from './card.classes'; import { CardType } from './card.enums'; diff --git a/apps/ui-kit/src/lib/components/molecules/card/CardAction.tsx b/apps/ui-kit/src/lib/components/molecules/card/CardAction.tsx index 7a4774df310..f12203bc45c 100644 --- a/apps/ui-kit/src/lib/components/molecules/card/CardAction.tsx +++ b/apps/ui-kit/src/lib/components/molecules/card/CardAction.tsx @@ -1,7 +1,7 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { ArrowRight } from '@iota/ui-icons'; +import { ArrowRight } from '@iota/apps-ui-icons'; import { CardActionType } from './card.enums'; import { Button, ButtonSize, ButtonType } from '../../atoms/button'; diff --git a/apps/ui-kit/src/lib/components/molecules/card/CardImage.tsx b/apps/ui-kit/src/lib/components/molecules/card/CardImage.tsx index 6f4efc1e9d7..1a0048dd2fa 100644 --- a/apps/ui-kit/src/lib/components/molecules/card/CardImage.tsx +++ b/apps/ui-kit/src/lib/components/molecules/card/CardImage.tsx @@ -1,7 +1,6 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import React from 'react'; import cx from 'classnames'; import { ImageType, ImageShape } from './card.enums'; import { IMAGE_BG_CLASSES, IMAGE_VARIANT_CLASSES } from './card.classes'; diff --git a/apps/ui-kit/src/lib/components/molecules/chip/Chip.tsx b/apps/ui-kit/src/lib/components/molecules/chip/Chip.tsx index 8d98db426aa..f79777b7c73 100644 --- a/apps/ui-kit/src/lib/components/molecules/chip/Chip.tsx +++ b/apps/ui-kit/src/lib/components/molecules/chip/Chip.tsx @@ -12,7 +12,7 @@ import { FOCUS_CLASSES, } from './chip.classes'; import { ButtonUnstyled } from '../../atoms/button'; -import { Close } from '@iota/ui-icons'; +import { Close } from '@iota/apps-ui-icons'; interface ChipProps { /** @@ -47,6 +47,10 @@ interface ChipProps { * Trailing element to show in the chip. */ trailingElement?: React.JSX.Element; + /** + * The button is disabled or not. + */ + disabled?: boolean; } export function Chip({ @@ -58,18 +62,20 @@ export function Chip({ avatar, leadingElement, trailingElement, + disabled, }: ChipProps) { const chipState = selected ? ChipState.Selected : ChipState.Default; return ( <ButtonUnstyled onClick={onClick} className={cx( - 'border transition-all duration-500 ease-in-out', + 'border transition-all duration-500 ease-in-out disabled:opacity-40', ROUNDED_CLASS, BACKGROUND_CLASSES[chipState], BORDER_CLASSES[chipState], FOCUS_CLASSES, )} + disabled={disabled} > <span className={cx( @@ -77,7 +83,7 @@ export function Chip({ avatar ? 'py-xxs' : 'py-[6px]', avatar ? 'pl-xxs' : leadingElement ? 'pl-xs' : 'pl-sm', ROUNDED_CLASS, - STATE_LAYER_CLASSES, + !disabled && STATE_LAYER_CLASSES, showClose ? 'pr-xs' : 'pr-sm', TEXT_COLOR[chipState], )} diff --git a/apps/ui-kit/src/lib/components/molecules/display-stats/DisplayStats.tsx b/apps/ui-kit/src/lib/components/molecules/display-stats/DisplayStats.tsx index 417b2b8427e..c68566f6343 100644 --- a/apps/ui-kit/src/lib/components/molecules/display-stats/DisplayStats.tsx +++ b/apps/ui-kit/src/lib/components/molecules/display-stats/DisplayStats.tsx @@ -1,10 +1,10 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import React, { ReactNode } from 'react'; +import { ReactNode } from 'react'; import { Tooltip, TooltipPosition } from '../../atoms'; -import { Info } from '@iota/ui-icons'; -import { DisplayStatsType, DisplayStatsSize } from './display-stats.enums'; +import { Info } from '@iota/apps-ui-icons'; +import { DisplayStatsType, DisplayStatsSize } from './displayStats.enums'; import cx from 'classnames'; import { BACKGROUND_CLASSES, @@ -13,7 +13,7 @@ import { VALUE_TEXT_CLASSES, SUPPORTING_LABEL_TEXT_CLASSES, LABEL_TEXT_CLASSES, -} from './display-stats.classes'; +} from './displayStats.classes'; interface DisplayStatsProps { /** diff --git a/apps/ui-kit/src/lib/components/molecules/display-stats/display-stats.classes.ts b/apps/ui-kit/src/lib/components/molecules/display-stats/displayStats.classes.ts similarity index 94% rename from apps/ui-kit/src/lib/components/molecules/display-stats/display-stats.classes.ts rename to apps/ui-kit/src/lib/components/molecules/display-stats/displayStats.classes.ts index 55a470f8d6d..cd61e36c357 100644 --- a/apps/ui-kit/src/lib/components/molecules/display-stats/display-stats.classes.ts +++ b/apps/ui-kit/src/lib/components/molecules/display-stats/displayStats.classes.ts @@ -1,7 +1,7 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { DisplayStatsType, DisplayStatsSize } from './display-stats.enums'; +import { DisplayStatsType, DisplayStatsSize } from './displayStats.enums'; export const BACKGROUND_CLASSES: Record<DisplayStatsType, string> = { [DisplayStatsType.Default]: 'bg-neutral-96 dark:bg-neutral-10', diff --git a/apps/ui-kit/src/lib/components/molecules/display-stats/display-stats.enums.ts b/apps/ui-kit/src/lib/components/molecules/display-stats/displayStats.enums.ts similarity index 100% rename from apps/ui-kit/src/lib/components/molecules/display-stats/display-stats.enums.ts rename to apps/ui-kit/src/lib/components/molecules/display-stats/displayStats.enums.ts diff --git a/apps/ui-kit/src/lib/components/molecules/display-stats/index.ts b/apps/ui-kit/src/lib/components/molecules/display-stats/index.ts index 9203c88a7db..36d4c1dcf47 100644 --- a/apps/ui-kit/src/lib/components/molecules/display-stats/index.ts +++ b/apps/ui-kit/src/lib/components/molecules/display-stats/index.ts @@ -2,4 +2,4 @@ // SPDX-License-Identifier: Apache-2.0 export * from './DisplayStats'; -export * from './display-stats.enums'; +export * from './displayStats.enums'; diff --git a/apps/ui-kit/src/lib/components/molecules/dropdown/dropdown-position.enum.ts b/apps/ui-kit/src/lib/components/molecules/dropdown/dropdownPosition.enums.ts similarity index 100% rename from apps/ui-kit/src/lib/components/molecules/dropdown/dropdown-position.enum.ts rename to apps/ui-kit/src/lib/components/molecules/dropdown/dropdownPosition.enums.ts diff --git a/apps/ui-kit/src/lib/components/molecules/dropdown/index.ts b/apps/ui-kit/src/lib/components/molecules/dropdown/index.ts index 7661c872580..97c3abbbd0b 100644 --- a/apps/ui-kit/src/lib/components/molecules/dropdown/index.ts +++ b/apps/ui-kit/src/lib/components/molecules/dropdown/index.ts @@ -2,4 +2,4 @@ // SPDX-License-Identifier: Apache-2.0 export * from './Dropdown'; -export * from './dropdown-position.enum'; +export * from './dropdownPosition.enums'; diff --git a/apps/ui-kit/src/lib/components/molecules/input/Input.tsx b/apps/ui-kit/src/lib/components/molecules/input/Input.tsx index c0ff7fe4b4b..86526254985 100644 --- a/apps/ui-kit/src/lib/components/molecules/input/Input.tsx +++ b/apps/ui-kit/src/lib/components/molecules/input/Input.tsx @@ -13,7 +13,7 @@ import { } from './input.classes'; import { InputType } from './input.enums'; import { SecondaryText } from '../../atoms/secondary-text'; -import { Close, VisibilityOff, VisibilityOn } from '@iota/ui-icons'; +import { Close, VisibilityOff, VisibilityOn } from '@iota/apps-ui-icons'; import { ButtonUnstyled } from '../../atoms/button'; import { InputPropsByType, NumericFormatInputProps } from './input.types'; import { NumericFormat } from 'react-number-format'; diff --git a/apps/ui-kit/src/lib/components/molecules/input/TextArea.tsx b/apps/ui-kit/src/lib/components/molecules/input/TextArea.tsx index 003be38944c..4ca28019a2a 100644 --- a/apps/ui-kit/src/lib/components/molecules/input/TextArea.tsx +++ b/apps/ui-kit/src/lib/components/molecules/input/TextArea.tsx @@ -11,7 +11,7 @@ import { } from './input.classes'; import cx from 'classnames'; import { ButtonUnstyled } from '../../atoms/button'; -import { VisibilityOff, VisibilityOn } from '@iota/ui-icons'; +import { VisibilityOff, VisibilityOn } from '@iota/apps-ui-icons'; type TextAreaProps = Omit< React.TextareaHTMLAttributes<HTMLTextAreaElement>, diff --git a/apps/ui-kit/src/lib/components/molecules/navbar-item/NavbarItem.tsx b/apps/ui-kit/src/lib/components/molecules/navbar-item/NavbarItem.tsx index 52eb085081a..a9864a14a17 100644 --- a/apps/ui-kit/src/lib/components/molecules/navbar-item/NavbarItem.tsx +++ b/apps/ui-kit/src/lib/components/molecules/navbar-item/NavbarItem.tsx @@ -1,7 +1,6 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import React from 'react'; import { NavbarItemHorizontal } from './NavbarItemHorizontal'; import { NavbarItemVertical } from './NavbarItemVertical'; import { NavbarItemType } from './navbarItem.enums'; diff --git a/apps/ui-kit/src/lib/components/molecules/navbar-item/NavbarItemHorizontal.tsx b/apps/ui-kit/src/lib/components/molecules/navbar-item/NavbarItemHorizontal.tsx index 328f90aa384..ac0b7fceb26 100644 --- a/apps/ui-kit/src/lib/components/molecules/navbar-item/NavbarItemHorizontal.tsx +++ b/apps/ui-kit/src/lib/components/molecules/navbar-item/NavbarItemHorizontal.tsx @@ -1,7 +1,6 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import React from 'react'; import cx from 'classnames'; import { BADGE_WITH_TEXT, diff --git a/apps/ui-kit/src/lib/components/molecules/navbar-item/NavbarItemVertical.tsx b/apps/ui-kit/src/lib/components/molecules/navbar-item/NavbarItemVertical.tsx index 0212d273523..039ff6fcaef 100644 --- a/apps/ui-kit/src/lib/components/molecules/navbar-item/NavbarItemVertical.tsx +++ b/apps/ui-kit/src/lib/components/molecules/navbar-item/NavbarItemVertical.tsx @@ -1,7 +1,6 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import React from 'react'; import cx from 'classnames'; import { SELECTED_BACKGROUND, diff --git a/apps/ui-kit/src/lib/components/molecules/search/Search.tsx b/apps/ui-kit/src/lib/components/molecules/search/Search.tsx index 35565d8f6af..71dc2499446 100644 --- a/apps/ui-kit/src/lib/components/molecules/search/Search.tsx +++ b/apps/ui-kit/src/lib/components/molecules/search/Search.tsx @@ -1,9 +1,9 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import React, { useEffect, useRef, useState } from 'react'; +import { useEffect, useRef, useState } from 'react'; import cx from 'classnames'; -import { Loader, Search as SearchIcon } from '@iota/ui-icons'; +import { Loader, Search as SearchIcon } from '@iota/apps-ui-icons'; import { Divider, SearchBarType } from '@/components'; import { BACKGROUND_COLORS, diff --git a/apps/ui-kit/src/lib/components/molecules/segmented-button/SegmentedButton.tsx b/apps/ui-kit/src/lib/components/molecules/segmented-button/SegmentedButton.tsx index fb09cabcb1f..195606ecec4 100644 --- a/apps/ui-kit/src/lib/components/molecules/segmented-button/SegmentedButton.tsx +++ b/apps/ui-kit/src/lib/components/molecules/segmented-button/SegmentedButton.tsx @@ -1,10 +1,10 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import React, { PropsWithChildren } from 'react'; -import { BACKGROUND_COLORS, OUTLINED_BORDER } from './segmented-button.classes'; +import { PropsWithChildren } from 'react'; +import { BACKGROUND_COLORS, OUTLINED_BORDER } from './segmentedButton.classes'; import cx from 'classnames'; -import { SegmentedButtonType } from './segmented-button.enums'; +import { SegmentedButtonType } from './segmentedButton.enums'; import { ButtonSegmentType } from '../../atoms'; interface SegmentedButtonProps { diff --git a/apps/ui-kit/src/lib/components/molecules/segmented-button/index.ts b/apps/ui-kit/src/lib/components/molecules/segmented-button/index.ts index 481c1f46d93..0df9efe8def 100644 --- a/apps/ui-kit/src/lib/components/molecules/segmented-button/index.ts +++ b/apps/ui-kit/src/lib/components/molecules/segmented-button/index.ts @@ -3,4 +3,4 @@ export * from './SegmentedButton'; -export * from './segmented-button.enums'; +export * from './segmentedButton.enums'; diff --git a/apps/ui-kit/src/lib/components/molecules/segmented-button/segmented-button.classes.ts b/apps/ui-kit/src/lib/components/molecules/segmented-button/segmentedButton.classes.ts similarity index 86% rename from apps/ui-kit/src/lib/components/molecules/segmented-button/segmented-button.classes.ts rename to apps/ui-kit/src/lib/components/molecules/segmented-button/segmentedButton.classes.ts index f7160bed6b1..3ed05f9ac8c 100644 --- a/apps/ui-kit/src/lib/components/molecules/segmented-button/segmented-button.classes.ts +++ b/apps/ui-kit/src/lib/components/molecules/segmented-button/segmentedButton.classes.ts @@ -1,7 +1,7 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { SegmentedButtonType } from './segmented-button.enums'; +import { SegmentedButtonType } from './segmentedButton.enums'; export const BACKGROUND_COLORS: Record<SegmentedButtonType, string> = { [SegmentedButtonType.Outlined]: 'bg-transparent', diff --git a/apps/ui-kit/src/lib/components/molecules/segmented-button/segmented-button.enums.ts b/apps/ui-kit/src/lib/components/molecules/segmented-button/segmentedButton.enums.ts similarity index 100% rename from apps/ui-kit/src/lib/components/molecules/segmented-button/segmented-button.enums.ts rename to apps/ui-kit/src/lib/components/molecules/segmented-button/segmentedButton.enums.ts diff --git a/apps/ui-kit/src/lib/components/molecules/select/Select.tsx b/apps/ui-kit/src/lib/components/molecules/select/Select.tsx index d5d0754de25..866eb7bc74a 100644 --- a/apps/ui-kit/src/lib/components/molecules/select/Select.tsx +++ b/apps/ui-kit/src/lib/components/molecules/select/Select.tsx @@ -1,7 +1,7 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { TriangleDown } from '@iota/ui-icons'; +import { TriangleDown } from '@iota/apps-ui-icons'; import cx from 'classnames'; import { forwardRef, useEffect, useState } from 'react'; import { Dropdown } from '../dropdown/Dropdown'; diff --git a/apps/ui-kit/src/lib/components/molecules/table-cell/table-cell.enums.ts b/apps/ui-kit/src/lib/components/molecules/table-cell/table-cell.enums.ts deleted file mode 100644 index c89759317d8..00000000000 --- a/apps/ui-kit/src/lib/components/molecules/table-cell/table-cell.enums.ts +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright (c) 2024 IOTA Stiftung -// SPDX-License-Identifier: Apache-2.0 - -export enum TableCellType { - Text = 'text', - TextToCopy = 'text-to-copy', - Badge = 'badge', - AvatarText = 'avatar-text', - Checkbox = 'checkbox', - Placeholder = 'placeholder', - Link = 'link', - Children = 'children', -} - -export enum TableCellTextColor { - Default = 'text-neutral-40 dark:text-neutral-60', - Dark = 'text-neutral-10 dark:text-neutral-92', -} diff --git a/apps/ui-kit/src/lib/components/molecules/table-header-cell/TableHeaderCell.tsx b/apps/ui-kit/src/lib/components/molecules/table-header-cell/TableHeaderCell.tsx index 84beb087ecb..08f071e26ae 100644 --- a/apps/ui-kit/src/lib/components/molecules/table-header-cell/TableHeaderCell.tsx +++ b/apps/ui-kit/src/lib/components/molecules/table-header-cell/TableHeaderCell.tsx @@ -1,10 +1,11 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import React from 'react'; -import { SortByDown, SortByUp } from '@iota/ui-icons'; + +import { useState } from 'react'; +import { SortByDown, SortByUp } from '@iota/apps-ui-icons'; import cx from 'classnames'; import { Checkbox } from '@/lib'; -import { TableHeaderCellSortOrder } from './table-header-cell.enums'; +import { TableHeaderCellSortOrder } from './tableHeaderCell.enums'; export interface TableHeaderCellProps { /** @@ -64,7 +65,7 @@ export function TableHeaderCell({ onSortClick, onCheckboxChange, }: TableHeaderCellProps): JSX.Element { - const [sortOrder, setSortOrder] = React.useState<TableHeaderCellSortOrder | null>( + const [sortOrder, setSortOrder] = useState<TableHeaderCellSortOrder | null>( TableHeaderCellSortOrder.Asc, ); diff --git a/apps/ui-kit/src/lib/components/molecules/table-header-cell/index.ts b/apps/ui-kit/src/lib/components/molecules/table-header-cell/index.ts index 42f32bb3b76..d4e701c2740 100644 --- a/apps/ui-kit/src/lib/components/molecules/table-header-cell/index.ts +++ b/apps/ui-kit/src/lib/components/molecules/table-header-cell/index.ts @@ -2,4 +2,4 @@ // SPDX-License-Identifier: Apache-2.0 export * from './TableHeaderCell'; -export * from './table-header-cell.enums'; +export * from './tableHeaderCell.enums'; diff --git a/apps/ui-kit/src/lib/components/molecules/table-header-cell/table-header-cell.enums.ts b/apps/ui-kit/src/lib/components/molecules/table-header-cell/tableHeaderCell.enums.ts similarity index 100% rename from apps/ui-kit/src/lib/components/molecules/table-header-cell/table-header-cell.enums.ts rename to apps/ui-kit/src/lib/components/molecules/table-header-cell/tableHeaderCell.enums.ts diff --git a/apps/ui-kit/src/lib/components/molecules/title/Title.tsx b/apps/ui-kit/src/lib/components/molecules/title/Title.tsx index bfaaaf8e37b..1298499ecf3 100644 --- a/apps/ui-kit/src/lib/components/molecules/title/Title.tsx +++ b/apps/ui-kit/src/lib/components/molecules/title/Title.tsx @@ -2,10 +2,10 @@ // SPDX-License-Identifier: Apache-2.0 import { Tooltip, TooltipPosition } from '../../atoms'; -import { Info } from '@iota/ui-icons'; -import { TitleSize } from './title-size.enum'; +import { Info } from '@iota/apps-ui-icons'; +import { TitleSize } from './titleSize.enums'; import cx from 'classnames'; -import { TITLE_PADDINGS, TITLE_SIZE } from './title-classes.constants'; +import { TITLE_PADDINGS, TITLE_SIZE } from './titleClasses.constants'; interface TitleProps { /** diff --git a/apps/ui-kit/src/lib/components/molecules/title/index.ts b/apps/ui-kit/src/lib/components/molecules/title/index.ts index 9a78adf3f24..34efb8414ac 100644 --- a/apps/ui-kit/src/lib/components/molecules/title/index.ts +++ b/apps/ui-kit/src/lib/components/molecules/title/index.ts @@ -2,4 +2,4 @@ // SPDX-License-Identifier: Apache-2.0 export * from './Title'; -export { TitleSize } from './title-size.enum'; +export { TitleSize } from './titleSize.enums'; diff --git a/apps/ui-kit/src/lib/components/molecules/title/title-classes.constants.ts b/apps/ui-kit/src/lib/components/molecules/title/titleClasses.constants.ts similarity index 88% rename from apps/ui-kit/src/lib/components/molecules/title/title-classes.constants.ts rename to apps/ui-kit/src/lib/components/molecules/title/titleClasses.constants.ts index 15640fbb854..eb66d1726b5 100644 --- a/apps/ui-kit/src/lib/components/molecules/title/title-classes.constants.ts +++ b/apps/ui-kit/src/lib/components/molecules/title/titleClasses.constants.ts @@ -1,7 +1,7 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { TitleSize } from './title-size.enum'; +import { TitleSize } from './titleSize.enums'; export const TITLE_PADDINGS: Record<TitleSize, string> = { [TitleSize.Small]: 'px-md py-sm--rs', diff --git a/apps/ui-kit/src/lib/components/molecules/title/title-size.enum.ts b/apps/ui-kit/src/lib/components/molecules/title/titleSize.enums.ts similarity index 100% rename from apps/ui-kit/src/lib/components/molecules/title/title-size.enum.ts rename to apps/ui-kit/src/lib/components/molecules/title/titleSize.enums.ts diff --git a/apps/ui-kit/src/lib/components/organisms/accordion/Accordion.tsx b/apps/ui-kit/src/lib/components/organisms/accordion/Accordion.tsx index 1489c52c1d5..47768f08b73 100644 --- a/apps/ui-kit/src/lib/components/organisms/accordion/Accordion.tsx +++ b/apps/ui-kit/src/lib/components/organisms/accordion/Accordion.tsx @@ -1,9 +1,9 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import React, { PropsWithChildren } from 'react'; +import { PropsWithChildren } from 'react'; import cx from 'classnames'; -import { ArrowDown } from '@iota/ui-icons'; +import { ArrowDown } from '@iota/apps-ui-icons'; import { Button, ButtonType } from '@/lib'; import { ICON_STYLE } from './accordion.classes'; diff --git a/apps/ui-kit/src/lib/components/organisms/dialog/Dialog.tsx b/apps/ui-kit/src/lib/components/organisms/dialog/Dialog.tsx index 50fd835d2e3..3f78f5635de 100644 --- a/apps/ui-kit/src/lib/components/organisms/dialog/Dialog.tsx +++ b/apps/ui-kit/src/lib/components/organisms/dialog/Dialog.tsx @@ -5,7 +5,7 @@ import * as RadixDialog from '@radix-ui/react-dialog'; import * as VisuallyHidden from '@radix-ui/react-visually-hidden'; import cx from 'classnames'; import * as React from 'react'; -import { Close } from '@iota/ui-icons'; +import { Close } from '@iota/apps-ui-icons'; import { useEffect, useState } from 'react'; import { DialogPosition } from './dialog.enums'; diff --git a/apps/ui-kit/src/lib/components/organisms/navbar/Navbar.tsx b/apps/ui-kit/src/lib/components/organisms/navbar/Navbar.tsx index 845bb339142..a7af094a0be 100644 --- a/apps/ui-kit/src/lib/components/organisms/navbar/Navbar.tsx +++ b/apps/ui-kit/src/lib/components/organisms/navbar/Navbar.tsx @@ -2,7 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 import cx from 'classnames'; -import { IotaLogoMark, MenuIcon } from '@iota/ui-icons'; +import { IotaLogoMark, MenuIcon } from '@iota/apps-ui-icons'; import { NavbarItem, NavbarItemProps } from '@/components/molecules/navbar-item/NavbarItem'; export type NavbarItemWithId = NavbarItemProps & { id: string }; diff --git a/apps/ui-kit/src/lib/components/organisms/navbar/NavbarSlideout.tsx b/apps/ui-kit/src/lib/components/organisms/navbar/NavbarSlideout.tsx index ad2055b8964..495f1c546ac 100644 --- a/apps/ui-kit/src/lib/components/organisms/navbar/NavbarSlideout.tsx +++ b/apps/ui-kit/src/lib/components/organisms/navbar/NavbarSlideout.tsx @@ -1,8 +1,7 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import React from 'react'; -import { ArrowBack } from '@iota/ui-icons'; +import { ArrowBack } from '@iota/apps-ui-icons'; import cx from 'classnames'; import { Button, ButtonType, NavbarItem, NavbarItemType } from '@/components'; import { NavbarProps } from './Navbar'; diff --git a/apps/ui-kit/src/lib/components/organisms/table/Table.tsx b/apps/ui-kit/src/lib/components/organisms/table/Table.tsx index ac11bc19eff..83375a81b19 100644 --- a/apps/ui-kit/src/lib/components/organisms/table/Table.tsx +++ b/apps/ui-kit/src/lib/components/organisms/table/Table.tsx @@ -13,7 +13,7 @@ import { TableCellBase, TableHeaderCell, } from '@/lib'; -import { ArrowLeft, DoubleArrowLeft, ArrowRight, DoubleArrowRight } from '@iota/ui-icons'; +import { ArrowLeft, DoubleArrowLeft, ArrowRight, DoubleArrowRight } from '@iota/apps-ui-icons'; export interface TablePaginationOptions { /** diff --git a/apps/ui-kit/src/lib/enums/index.ts b/apps/ui-kit/src/lib/enums/index.ts index b85a71aeebb..c15d6246d2c 100644 --- a/apps/ui-kit/src/lib/enums/index.ts +++ b/apps/ui-kit/src/lib/enums/index.ts @@ -1,4 +1,4 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -export * from './screenSize.enum'; +export * from './screenSize.enums'; diff --git a/apps/ui-kit/src/lib/enums/screenSize.enum.ts b/apps/ui-kit/src/lib/enums/screenSize.enums.ts similarity index 100% rename from apps/ui-kit/src/lib/enums/screenSize.enum.ts rename to apps/ui-kit/src/lib/enums/screenSize.enums.ts diff --git a/apps/ui-kit/src/lib/tailwind/base.preset.ts b/apps/ui-kit/src/lib/tailwind/base.presets.ts similarity index 100% rename from apps/ui-kit/src/lib/tailwind/base.preset.ts rename to apps/ui-kit/src/lib/tailwind/base.presets.ts diff --git a/apps/ui-kit/src/lib/tailwind/constants/index.ts b/apps/ui-kit/src/lib/tailwind/constants/index.ts index 2adc80fcca0..7be12319899 100644 --- a/apps/ui-kit/src/lib/tailwind/constants/index.ts +++ b/apps/ui-kit/src/lib/tailwind/constants/index.ts @@ -3,4 +3,4 @@ export * from './scaling.constants'; export * from './fontSizes.constants'; -export * from './variable-spacing.constants'; +export * from './variableSpacing.constants'; diff --git a/apps/ui-kit/src/lib/tailwind/constants/variable-spacing.constants.ts b/apps/ui-kit/src/lib/tailwind/constants/variableSpacing.constants.ts similarity index 97% rename from apps/ui-kit/src/lib/tailwind/constants/variable-spacing.constants.ts rename to apps/ui-kit/src/lib/tailwind/constants/variableSpacing.constants.ts index ad6ed83f78d..c091667ccba 100644 --- a/apps/ui-kit/src/lib/tailwind/constants/variable-spacing.constants.ts +++ b/apps/ui-kit/src/lib/tailwind/constants/variableSpacing.constants.ts @@ -1,7 +1,7 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { ScreenSize } from '../../enums/screenSize.enum'; +import { ScreenSize } from '../../enums/screenSize.enums'; enum VariableSpacingClassPrefix { Xs = 'xs--rs', diff --git a/apps/ui-kit/src/lib/tailwind/index.ts b/apps/ui-kit/src/lib/tailwind/index.ts index 5edddfd1578..d0766485b1b 100644 --- a/apps/ui-kit/src/lib/tailwind/index.ts +++ b/apps/ui-kit/src/lib/tailwind/index.ts @@ -1,5 +1,5 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -export { default as uiKitResponsivePreset } from './responsive.preset'; -export { default as uiKitStaticPreset } from './static.preset'; +export { default as uiKitResponsivePreset } from './responsive.presets'; +export { default as uiKitStaticPreset } from './static.presets'; diff --git a/apps/ui-kit/src/lib/tailwind/responsive.preset.ts b/apps/ui-kit/src/lib/tailwind/responsive.presets.ts similarity index 95% rename from apps/ui-kit/src/lib/tailwind/responsive.preset.ts rename to apps/ui-kit/src/lib/tailwind/responsive.presets.ts index b86c59eb154..a0c99a45340 100644 --- a/apps/ui-kit/src/lib/tailwind/responsive.preset.ts +++ b/apps/ui-kit/src/lib/tailwind/responsive.presets.ts @@ -5,7 +5,7 @@ import type { Config } from 'tailwindcss'; import type { ScreenBreakpoints } from './types'; import { ScreenSize } from '../enums'; import { getTailwindScreens, pxToRem } from './helpers'; -import { BASE_CONFIG } from './base.preset'; +import { BASE_CONFIG } from './base.presets'; import merge from 'lodash.merge'; const BREAKPOINTS: ScreenBreakpoints = { diff --git a/apps/ui-kit/src/lib/tailwind/static.preset.ts b/apps/ui-kit/src/lib/tailwind/static.presets.ts similarity index 92% rename from apps/ui-kit/src/lib/tailwind/static.preset.ts rename to apps/ui-kit/src/lib/tailwind/static.presets.ts index ad50674fb55..d1a3868ad42 100644 --- a/apps/ui-kit/src/lib/tailwind/static.preset.ts +++ b/apps/ui-kit/src/lib/tailwind/static.presets.ts @@ -4,7 +4,7 @@ import type { Config } from 'tailwindcss'; import type { ScreenBreakpoints } from './types'; import { getTailwindScreens } from './helpers'; -import { BASE_CONFIG } from './base.preset'; +import { BASE_CONFIG } from './base.presets'; import merge from 'lodash.merge'; const BREAKPOINTS: Partial<ScreenBreakpoints> & { default: number } = { diff --git a/apps/ui-kit/src/storybook/constants/index.ts b/apps/ui-kit/src/storybook/constants/index.ts index a259cd8f991..ae109adc501 100644 --- a/apps/ui-kit/src/storybook/constants/index.ts +++ b/apps/ui-kit/src/storybook/constants/index.ts @@ -2,4 +2,4 @@ // SPDX-License-Identifier: Apache-2.0 export * from './typeset.constants'; -export * from './variable-spacing.constants'; +export * from './variableSpacing.constants'; diff --git a/apps/ui-kit/src/storybook/constants/variable-spacing.constants.ts b/apps/ui-kit/src/storybook/constants/variableSpacing.constants.ts similarity index 100% rename from apps/ui-kit/src/storybook/constants/variable-spacing.constants.ts rename to apps/ui-kit/src/storybook/constants/variableSpacing.constants.ts diff --git a/apps/ui-kit/src/storybook/stories/atoms/InfoBox.stories.tsx b/apps/ui-kit/src/storybook/stories/atoms/InfoBox.stories.tsx index 3ae962543f1..33700c4099a 100644 --- a/apps/ui-kit/src/storybook/stories/atoms/InfoBox.stories.tsx +++ b/apps/ui-kit/src/storybook/stories/atoms/InfoBox.stories.tsx @@ -3,7 +3,7 @@ import type { Meta, StoryObj } from '@storybook/react'; import { InfoBox, InfoBoxStyle, InfoBoxType } from '@/components'; -import { Info } from '@iota/ui-icons'; +import { Info } from '@iota/apps-ui-icons'; const meta: Meta<typeof InfoBox> = { component: InfoBox, diff --git a/apps/ui-kit/src/storybook/stories/atoms/ListItem.stories.tsx b/apps/ui-kit/src/storybook/stories/atoms/ListItem.stories.tsx index bcb48ddf751..c3887ab539f 100644 --- a/apps/ui-kit/src/storybook/stories/atoms/ListItem.stories.tsx +++ b/apps/ui-kit/src/storybook/stories/atoms/ListItem.stories.tsx @@ -2,7 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 import { ListItem } from '@/components'; -import { Seed } from '@iota/ui-icons'; +import { Seed } from '@iota/apps-ui-icons'; import type { Meta, StoryObj } from '@storybook/react'; const meta = { diff --git a/apps/ui-kit/src/storybook/stories/atoms/Tooltip.stories.tsx b/apps/ui-kit/src/storybook/stories/atoms/Tooltip.stories.tsx index 3b72332277e..33e71c8e5e2 100644 --- a/apps/ui-kit/src/storybook/stories/atoms/Tooltip.stories.tsx +++ b/apps/ui-kit/src/storybook/stories/atoms/Tooltip.stories.tsx @@ -2,7 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 import { Tooltip, TooltipPosition } from '@/lib/components'; -import { Info } from '@iota/ui-icons'; +import { Info } from '@iota/apps-ui-icons'; import type { Meta, StoryObj } from '@storybook/react'; const meta: Meta<typeof Tooltip> = { diff --git a/apps/ui-kit/src/storybook/stories/components/VariableSpacingShowcase.tsx b/apps/ui-kit/src/storybook/stories/components/VariableSpacingShowcase.tsx index 761e9f883e5..5822fdf8ea2 100644 --- a/apps/ui-kit/src/storybook/stories/components/VariableSpacingShowcase.tsx +++ b/apps/ui-kit/src/storybook/stories/components/VariableSpacingShowcase.tsx @@ -4,7 +4,6 @@ import { Button } from '@/lib'; import { Showcase } from '@/storybook/blocks'; import { VARIABLE_GAP_CLASSES, VARIABLE_PADDING_CLASSES } from '@/storybook/constants'; -import React from 'react'; export function VariableSpacingShowcase() { return ( diff --git a/apps/ui-kit/src/storybook/stories/design-tokens/icons.stories.mdx b/apps/ui-kit/src/storybook/stories/design-tokens/icons.stories.mdx index 3fbab5da9c7..aa4896bba02 100644 --- a/apps/ui-kit/src/storybook/stories/design-tokens/icons.stories.mdx +++ b/apps/ui-kit/src/storybook/stories/design-tokens/icons.stories.mdx @@ -1,6 +1,6 @@ import React from 'react'; import { Meta, Title, IconGallery, IconItem } from '@storybook/blocks'; -import * as Icons from '@iota/ui-icons'; +import * as Icons from '@iota/apps-ui-icons'; <Meta title="Design Tokens/Icon Gallery" /> diff --git a/apps/ui-kit/src/storybook/stories/molecules/Card.stories.tsx b/apps/ui-kit/src/storybook/stories/molecules/Card.stories.tsx index aa1429b7815..8889ddb698e 100644 --- a/apps/ui-kit/src/storybook/stories/molecules/Card.stories.tsx +++ b/apps/ui-kit/src/storybook/stories/molecules/Card.stories.tsx @@ -2,7 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 import type { Meta, StoryObj } from '@storybook/react'; -import { IotaLogoSmall } from '@iota/ui-icons'; +import { IotaLogoSmall } from '@iota/apps-ui-icons'; import { Card, CardProps, diff --git a/apps/ui-kit/src/storybook/stories/molecules/Chip.stories.tsx b/apps/ui-kit/src/storybook/stories/molecules/Chip.stories.tsx index 2c891a3e4c2..33fb28a7355 100644 --- a/apps/ui-kit/src/storybook/stories/molecules/Chip.stories.tsx +++ b/apps/ui-kit/src/storybook/stories/molecules/Chip.stories.tsx @@ -4,7 +4,7 @@ import type { Meta, StoryObj } from '@storybook/react'; import { Chip } from '@/components/molecules/chip/Chip'; -import { PlaceholderReplace } from '@iota/ui-icons'; +import { PlaceholderReplace } from '@iota/apps-ui-icons'; const meta: Meta<typeof Chip> = { component: Chip, diff --git a/apps/ui-kit/src/storybook/stories/molecules/DisplayStats.stories.tsx b/apps/ui-kit/src/storybook/stories/molecules/DisplayStats.stories.tsx index e892659ce9d..9bc46e2f7e3 100644 --- a/apps/ui-kit/src/storybook/stories/molecules/DisplayStats.stories.tsx +++ b/apps/ui-kit/src/storybook/stories/molecules/DisplayStats.stories.tsx @@ -1,7 +1,6 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import React from 'react'; import type { Meta, StoryObj } from '@storybook/react'; import { DisplayStats, TooltipPosition, DisplayStatsType, DisplayStatsSize } from '@/components'; diff --git a/apps/ui-kit/src/storybook/stories/molecules/Input.stories.tsx b/apps/ui-kit/src/storybook/stories/molecules/Input.stories.tsx index d9fccd8a736..044e3f23455 100644 --- a/apps/ui-kit/src/storybook/stories/molecules/Input.stories.tsx +++ b/apps/ui-kit/src/storybook/stories/molecules/Input.stories.tsx @@ -4,7 +4,7 @@ import type { Meta, StoryObj } from '@storybook/react'; import { Input, InputType } from '@/lib/components/molecules/input'; -import { PlaceholderReplace } from '@iota/ui-icons'; +import { PlaceholderReplace } from '@iota/apps-ui-icons'; import { ComponentProps, useCallback, useEffect, useState } from 'react'; import { ButtonPill } from '@/lib/components/atoms/button'; diff --git a/apps/ui-kit/src/storybook/stories/molecules/NavbarItem.stories.tsx b/apps/ui-kit/src/storybook/stories/molecules/NavbarItem.stories.tsx index aad83ca81f8..24c93f71b28 100644 --- a/apps/ui-kit/src/storybook/stories/molecules/NavbarItem.stories.tsx +++ b/apps/ui-kit/src/storybook/stories/molecules/NavbarItem.stories.tsx @@ -1,10 +1,9 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import React from 'react'; import type { Meta, StoryObj } from '@storybook/react'; import { NavbarItem, NavbarItemType } from '@/components'; -import { Home } from '@iota/ui-icons'; +import { Home } from '@iota/apps-ui-icons'; const meta: Meta<typeof NavbarItem> = { component: NavbarItem, diff --git a/apps/ui-kit/src/storybook/stories/molecules/SegmentedButton.stories.tsx b/apps/ui-kit/src/storybook/stories/molecules/SegmentedButton.stories.tsx index a8b1ddc4cfe..07cbdbe8548 100644 --- a/apps/ui-kit/src/storybook/stories/molecules/SegmentedButton.stories.tsx +++ b/apps/ui-kit/src/storybook/stories/molecules/SegmentedButton.stories.tsx @@ -10,7 +10,7 @@ import { SegmentedButtonType, } from '@/components'; import { ComponentProps, useState } from 'react'; -import { PlaceholderReplace } from '@iota/ui-icons'; +import { PlaceholderReplace } from '@iota/apps-ui-icons'; const meta: Meta<typeof SegmentedButton> = { component: SegmentedButton, diff --git a/apps/ui-kit/src/storybook/stories/molecules/Select.stories.tsx b/apps/ui-kit/src/storybook/stories/molecules/Select.stories.tsx index 43ecefbb391..22614d24618 100644 --- a/apps/ui-kit/src/storybook/stories/molecules/Select.stories.tsx +++ b/apps/ui-kit/src/storybook/stories/molecules/Select.stories.tsx @@ -4,7 +4,7 @@ import type { Meta, StoryObj } from '@storybook/react'; import { Select, SelectOption } from '@/components/molecules/select/Select'; import { useState } from 'react'; -import { IotaLogoMark, PlaceholderReplace } from '@iota/ui-icons'; +import { IotaLogoMark, PlaceholderReplace } from '@iota/apps-ui-icons'; const meta: Meta<typeof Select> = { component: Select, diff --git a/apps/ui-kit/src/storybook/stories/organisms/Navbar.stories.tsx b/apps/ui-kit/src/storybook/stories/organisms/Navbar.stories.tsx index 21189796c67..54e2ecccaea 100644 --- a/apps/ui-kit/src/storybook/stories/organisms/Navbar.stories.tsx +++ b/apps/ui-kit/src/storybook/stories/organisms/Navbar.stories.tsx @@ -2,7 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 import type { Meta, StoryObj } from '@storybook/react'; -import { Activity, Apps, Assets, Home } from '@iota/ui-icons'; +import { Activity, Apps, Assets, Home } from '@iota/apps-ui-icons'; import { Navbar, NavbarSlideout, NavbarItemWithId, NavbarProps } from '@/components'; import { useState } from 'react'; diff --git a/apps/ui-kit/tailwind.config.ts b/apps/ui-kit/tailwind.config.ts index 319b7dc1818..1ebb4d52c0f 100644 --- a/apps/ui-kit/tailwind.config.ts +++ b/apps/ui-kit/tailwind.config.ts @@ -1,6 +1,6 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import preset from './src/lib/tailwind/responsive.preset'; +import preset from './src/lib/tailwind/responsive.presets'; export default preset; diff --git a/apps/ui-kit/turbo.json b/apps/ui-kit/turbo.json new file mode 100644 index 00000000000..ded95d0156a --- /dev/null +++ b/apps/ui-kit/turbo.json @@ -0,0 +1,9 @@ +{ + "extends": ["//"], + "tasks": { + "build-storybook": { + "dependsOn": ["^build"], + "outputs": ["storybook-static/**"] + } + } +} diff --git a/apps/wallet-dashboard/app/(protected)/activity/page.tsx b/apps/wallet-dashboard/app/(protected)/activity/page.tsx index 14f4bc516da..7e89ca90b24 100644 --- a/apps/wallet-dashboard/app/(protected)/activity/page.tsx +++ b/apps/wallet-dashboard/app/(protected)/activity/page.tsx @@ -3,7 +3,6 @@ 'use client'; -import React from 'react'; import { Panel, Title, TitleSize } from '@iota/apps-ui-kit'; import { TransactionsList } from '@/components'; diff --git a/apps/wallet-dashboard/app/(protected)/assets/page.tsx b/apps/wallet-dashboard/app/(protected)/assets/page.tsx index 7007cc86c5c..b091ab2f345 100644 --- a/apps/wallet-dashboard/app/(protected)/assets/page.tsx +++ b/apps/wallet-dashboard/app/(protected)/assets/page.tsx @@ -3,16 +3,25 @@ 'use client'; -import { Panel, Title, Chip, TitleSize } from '@iota/apps-ui-kit'; -import { hasDisplayData, useGetOwnedObjects } from '@iota/core'; +import { useState } from 'react'; +import cl from 'clsx'; +import { usePageAssets, AssetCategory } from '@iota/core'; +import { + Panel, + Title, + TitleSize, + LoadingIndicator, + InfoBox, + InfoBoxType, + InfoBoxStyle, + Chip, +} from '@iota/apps-ui-kit'; import { useCurrentAccount } from '@iota/dapp-kit'; import { IotaObjectData } from '@iota/iota-sdk/client'; -import { useState } from 'react'; -import { AssetCategory } from '@/lib/enums'; -import { AssetList } from '@/components/AssetsList'; -import { AssetDialog } from '@/components/Dialogs/Assets'; +import { Warning } from '@iota/apps-ui-icons'; -const OBJECTS_PER_REQ = 50; +import { AssetTileLink, Loading } from '@/components'; +import { AssetDialog } from '@/components/dialogs/assets'; const ASSET_CATEGORIES: { label: string; value: AssetCategory }[] = [ { @@ -25,31 +34,32 @@ const ASSET_CATEGORIES: { label: string; value: AssetCategory }[] = [ }, ]; +const ASSET_LAYOUT: Record<AssetCategory, string> = { + [AssetCategory.Visual]: + 'grid-template-visual-assets grid max-h-[600px] gap-md overflow-auto py-sm', + [AssetCategory.Other]: 'flex flex-col overflow-auto py-sm', + [AssetCategory.Hidden]: 'flex flex-col overflow-auto py-sm', +}; + export default function AssetsDashboardPage(): React.JSX.Element { const [selectedAsset, setSelectedAsset] = useState<IotaObjectData | null>(null); - const [selectedCategory, setSelectedCategory] = useState<AssetCategory>(AssetCategory.Visual); const account = useCurrentAccount(); - const { data, isFetching, fetchNextPage, hasNextPage, refetch } = useGetOwnedObjects( - account?.address, - undefined, - OBJECTS_PER_REQ, - ); + const accountAddress = account?.address || null; - const assets: IotaObjectData[] = []; + const { + isPending, + refetch, + error, + isError, - for (const page of data?.pages || []) { - for (const asset of page.data) { - if (asset.data && asset.data.objectId) { - if (selectedCategory == AssetCategory.Visual) { - if (hasDisplayData(asset)) { - assets.push(asset.data); - } - } else if (selectedCategory == AssetCategory.Other) { - assets.push(asset.data); - } - } - } - } + ownedAssets, + isAssetsLoaded, + filteredAssets, + selectedAssetCategory, + setSelectedAssetCategory, + observerElem, + isSpinnerVisible, + } = usePageAssets(accountAddress); function onAssetClick(asset: IotaObjectData) { setSelectedAsset(asset); @@ -59,31 +69,69 @@ export default function AssetsDashboardPage(): React.JSX.Element { <Panel> <Title title="Assets" size={TitleSize.Medium} /> <div className="px-lg"> - <div className="flex flex-row items-center justify-start gap-xs py-xs"> - {ASSET_CATEGORIES.map((tab) => ( - <Chip - key={tab.label} - label={tab.label} - onClick={() => setSelectedCategory(tab.value)} - selected={selectedCategory === tab.value} + {isError ? ( + <div className="mb-2 flex h-full w-full items-center justify-center p-2"> + <InfoBox + type={InfoBoxType.Error} + title="Sync error (data might be outdated)" + supportingText={error?.message ?? 'An error occurred'} + icon={<Warning />} + style={InfoBoxStyle.Default} /> - ))} - </div> + </div> + ) : ( + <> + {isAssetsLoaded && + Boolean(ownedAssets?.visual.length || ownedAssets?.other.length) ? ( + <div className="flex flex-row items-center justify-start gap-xs py-xs"> + {ASSET_CATEGORIES.map(({ value, label }) => ( + <Chip + key={value} + onClick={() => setSelectedAssetCategory(value)} + label={label} + selected={selectedAssetCategory === value} + disabled={ + AssetCategory.Visual === value + ? !ownedAssets?.visual.length + : !ownedAssets?.other.length + } + /> + ))} + </div> + ) : null} + <Loading loading={isPending}> + <div + className={cl( + 'max-h-[600px]', + selectedAssetCategory && ASSET_LAYOUT[selectedAssetCategory], + )} + > + {filteredAssets.map((asset) => ( + <AssetTileLink + key={asset.digest} + asset={asset} + type={selectedAssetCategory} + onClick={onAssetClick} + /> + ))} + <div ref={observerElem}> + {isSpinnerVisible ? ( + <div className="mt-1 flex h-full w-full justify-center"> + <LoadingIndicator /> + </div> + ) : null} + </div> + </div> + </Loading> - <AssetList - assets={assets} - selectedCategory={selectedCategory} - onClick={onAssetClick} - hasNextPage={hasNextPage} - isFetchingNextPage={isFetching} - fetchNextPage={fetchNextPage} - /> - {selectedAsset && ( - <AssetDialog - onClose={() => setSelectedAsset(null)} - asset={selectedAsset} - refetchAssets={refetch} - /> + {selectedAsset && ( + <AssetDialog + onClose={() => setSelectedAsset(null)} + asset={selectedAsset} + refetchAssets={refetch} + /> + )} + </> )} </div> </Panel> diff --git a/apps/wallet-dashboard/app/(protected)/components/sidebar/Sidebar.tsx b/apps/wallet-dashboard/app/(protected)/components/sidebar/Sidebar.tsx index 03742f9e8e4..298b2bc5642 100644 --- a/apps/wallet-dashboard/app/(protected)/components/sidebar/Sidebar.tsx +++ b/apps/wallet-dashboard/app/(protected)/components/sidebar/Sidebar.tsx @@ -2,7 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 import { PROTECTED_ROUTES } from '@/lib/constants/routes.constants'; -import { IotaLogoMark } from '@iota/ui-icons'; +import { IotaLogoMark } from '@iota/apps-ui-icons'; import { SidebarItem } from './SidebarItem'; import { Feature } from '@iota/core'; import { useFeature } from '@growthbook/growthbook-react'; diff --git a/apps/wallet-dashboard/app/(protected)/components/top-nav/TopNav.tsx b/apps/wallet-dashboard/app/(protected)/components/top-nav/TopNav.tsx index 3b802387ca8..52337093bc3 100644 --- a/apps/wallet-dashboard/app/(protected)/components/top-nav/TopNav.tsx +++ b/apps/wallet-dashboard/app/(protected)/components/top-nav/TopNav.tsx @@ -3,14 +3,15 @@ import { SettingsDialog, useSettingsDialog } from '@/components'; import { Badge, BadgeType, Button, ButtonType } from '@iota/apps-ui-kit'; -import { ConnectButton, useIotaClientContext } from '@iota/dapp-kit'; -import { getNetwork, Network } from '@iota/iota-sdk/client'; -import { ThemeSwitcher } from '@iota/core'; -import { Settings } from '@iota/ui-icons'; +import { ConnectButton } from '@iota/dapp-kit'; +import { Network } from '@iota/iota-sdk/client'; +import { toTitleCase, ThemeSwitcher } from '@iota/core'; +import { Settings } from '@iota/apps-ui-icons'; +import { usePersistedNetwork } from '@/hooks'; export function TopNav() { - const { network } = useIotaClientContext(); - const { name: networkName } = getNetwork(network); + const { persistedNetwork } = usePersistedNetwork(); + const { isSettingsDialogOpen, settingsDialogView, @@ -22,8 +23,10 @@ export function TopNav() { return ( <div className="flex w-full flex-row items-center justify-end gap-md py-xs--rs"> <Badge - label={networkName} - type={network === Network.Mainnet ? BadgeType.PrimarySoft : BadgeType.Neutral} + label={toTitleCase(persistedNetwork)} + type={ + persistedNetwork === Network.Mainnet ? BadgeType.PrimarySoft : BadgeType.Neutral + } /> <ConnectButton size="md" /> <SettingsDialog diff --git a/apps/wallet-dashboard/app/(protected)/layout.tsx b/apps/wallet-dashboard/app/(protected)/layout.tsx index 72fa80c67cc..620a8a1184b 100644 --- a/apps/wallet-dashboard/app/(protected)/layout.tsx +++ b/apps/wallet-dashboard/app/(protected)/layout.tsx @@ -2,8 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 'use client'; -import { Notifications } from '@/components/index'; -import React, { type PropsWithChildren } from 'react'; +import { type PropsWithChildren } from 'react'; import { Sidebar, TopNav } from './components'; function DashboardLayout({ children }: PropsWithChildren): JSX.Element { @@ -22,7 +21,6 @@ function DashboardLayout({ children }: PropsWithChildren): JSX.Element { <div className="flex-1 py-md--rs">{children}</div> </div> </div> - <Notifications /> </div> ); } diff --git a/apps/wallet-dashboard/app/(protected)/migrations/page.tsx b/apps/wallet-dashboard/app/(protected)/migrations/page.tsx index b042465c49e..e9215b53f13 100644 --- a/apps/wallet-dashboard/app/(protected)/migrations/page.tsx +++ b/apps/wallet-dashboard/app/(protected)/migrations/page.tsx @@ -6,8 +6,8 @@ import { useState, useMemo, useCallback } from 'react'; import { useQueryClient } from '@tanstack/react-query'; import clsx from 'clsx'; -import { useGetStardustMigratableObjects } from '@/hooks'; -import { summarizeMigratableObjectValues, summarizeTimelockedObjectValues } from '@/lib/utils'; +import { useGetStardustMigratableObjects, useGroupedStardustObjects } from '@/hooks'; +import { getStardustObjectsTotals } from '@/lib/utils'; import { Button, ButtonSize, @@ -19,18 +19,20 @@ import { Panel, Title, } from '@iota/apps-ui-kit'; -import { Assets, Clock, IotaLogoMark, Tokens } from '@iota/ui-icons'; +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 { IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; import { StardustOutputMigrationStatus } from '@/lib/enums'; import { MigrationObjectsPanel, MigrationDialog } from '@/components'; +import { useRouter } from 'next/navigation'; function MigrationDashboardPage(): JSX.Element { const account = useCurrentAccount(); const address = account?.address || ''; const queryClient = useQueryClient(); const iotaClient = useIotaClient(); + const router = useRouter(); const [isMigrationDialogOpen, setIsMigrationDialogOpen] = useState(false); const [selectedStardustObjectsCategory, setSelectedStardustObjectsCategory] = useState< StardustOutputMigrationStatus | undefined @@ -45,24 +47,49 @@ function MigrationDashboardPage(): JSX.Element { timelockedNftOutputs, } = stardustMigrationObjects || {}; + const { data: resolvedMigrationObjects = [] } = useGroupedStardustObjects( + [...(migratableBasicOutputs || []), ...(migratableNftOutputs || [])], + false, + ); + const { data: resolvedTimelockedObjects = [] } = useGroupedStardustObjects( + [...(timelockedBasicOutputs || []), ...(timelockedNftOutputs || [])], + true, + ); + const { - totalIotaAmount, + totalIotaAmount: migratableIotaAmount, totalNativeTokens: migratableNativeTokens, totalVisualAssets: migratableVisualAssets, - } = summarizeMigratableObjectValues({ + } = getStardustObjectsTotals({ basicOutputs: migratableBasicOutputs, nftOutputs: migratableNftOutputs, address, + resolvedObjects: resolvedMigrationObjects, }); - const { totalTimelockedObjects } = summarizeTimelockedObjectValues({ + const { + totalIotaAmount: timelockedIotaAmount, + totalNativeTokens: timelockedNativeTokens, + totalVisualAssets: timelockedVisualAssets, + } = getStardustObjectsTotals({ basicOutputs: timelockedBasicOutputs, nftOutputs: timelockedNftOutputs, + address, + resolvedObjects: resolvedTimelockedObjects, }); const hasMigratableObjects = - (migratableBasicOutputs?.length || 0) > 0 && (migratableNftOutputs?.length || 0) > 0; + (migratableBasicOutputs?.length || 0) > 0 || (migratableNftOutputs?.length || 0) > 0; + const hasTimelockedObjects = + (timelockedBasicOutputs?.length || 0) > 0 || (timelockedNftOutputs?.length || 0) > 0; - const [timelockedIotaTokens, symbol] = useFormatCoin(totalIotaAmount, IOTA_TYPE_ARG); + const [migratableIotaAmountFormatted, migratableIotaAmountSymbol] = useFormatCoin( + migratableIotaAmount, + IOTA_TYPE_ARG, + ); + const [timelockedIotaAmountFormatted, timelockedIotaAmountSymbol] = useFormatCoin( + timelockedIotaAmount, + IOTA_TYPE_ARG, + ); const handleOnSuccess = useCallback( (digest: string) => { @@ -81,6 +108,9 @@ function MigrationDashboardPage(): JSX.Element { { StructType: STARDUST_NFT_OUTPUT_TYPE }, ], }); + queryClient.invalidateQueries({ + queryKey: ['migration-transaction', address], + }); }); }, [iotaClient, queryClient, address], @@ -88,7 +118,7 @@ function MigrationDashboardPage(): JSX.Element { const MIGRATION_CARDS: MigrationDisplayCardProps[] = [ { - title: `${timelockedIotaTokens} ${symbol}`, + title: `${migratableIotaAmountFormatted} ${migratableIotaAmountSymbol}`, subtitle: 'IOTA Tokens', icon: IotaLogoMark, }, @@ -106,9 +136,19 @@ function MigrationDashboardPage(): JSX.Element { const TIMELOCKED_ASSETS_CARDS: MigrationDisplayCardProps[] = [ { - title: `${totalTimelockedObjects}`, - subtitle: 'Time-locked', - icon: Clock, + title: `${timelockedIotaAmountFormatted} ${timelockedIotaAmountSymbol}`, + subtitle: 'IOTA Tokens', + icon: IotaLogoMark, + }, + { + title: `${timelockedNativeTokens}`, + subtitle: 'Native Tokens', + icon: Tokens, + }, + { + title: `${timelockedVisualAssets}`, + subtitle: 'Visual Assets', + icon: Assets, }, ]; @@ -139,6 +179,11 @@ function MigrationDashboardPage(): JSX.Element { setSelectedStardustObjectsCategory(undefined); } + function handleMigrationDialogClose() { + setIsMigrationDialogOpen(false); + router.replace('/home'); + } + return ( <div className="flex h-full w-full flex-wrap items-center justify-center space-y-4"> <div @@ -159,6 +204,7 @@ function MigrationDashboardPage(): JSX.Element { selectedStardustObjectsCategory === StardustOutputMigrationStatus.TimeLocked } + handleClose={handleMigrationDialogClose} /> )} <Panel> @@ -216,7 +262,7 @@ function MigrationDashboardPage(): JSX.Element { disabled={ selectedStardustObjectsCategory === StardustOutputMigrationStatus.TimeLocked || - !totalTimelockedObjects + !hasTimelockedObjects } onClick={() => setSelectedStardustObjectsCategory( @@ -231,7 +277,7 @@ function MigrationDashboardPage(): JSX.Element { <MigrationObjectsPanel selectedObjects={selectedObjects} onClose={handleCloseDetailsPanel} - isTimelocked={ + groupByTimelockUC={ selectedStardustObjectsCategory === StardustOutputMigrationStatus.TimeLocked } /> diff --git a/apps/wallet-dashboard/app/(protected)/staking/page.tsx b/apps/wallet-dashboard/app/(protected)/staking/page.tsx index 87f69eccffa..05e17b53e0b 100644 --- a/apps/wallet-dashboard/app/(protected)/staking/page.tsx +++ b/apps/wallet-dashboard/app/(protected)/staking/page.tsx @@ -37,7 +37,7 @@ import { } from '@iota/core'; import { useCurrentAccount, useIotaClient, useIotaClientQuery } from '@iota/dapp-kit'; import { IotaSystemStateSummary } from '@iota/iota-sdk/client'; -import { Info } from '@iota/ui-icons'; +import { Info } from '@iota/apps-ui-icons'; import { useMemo } from 'react'; import { IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; import { IotaSignAndExecuteTransactionOutput } from '@iota/wallet-standard'; diff --git a/apps/wallet-dashboard/app/(protected)/vesting/page.tsx b/apps/wallet-dashboard/app/(protected)/vesting/page.tsx index e29d94a7fef..37fb903678f 100644 --- a/apps/wallet-dashboard/app/(protected)/vesting/page.tsx +++ b/apps/wallet-dashboard/app/(protected)/vesting/page.tsx @@ -11,11 +11,10 @@ import { UnstakeDialog, StakeDialogView, } from '@/components'; -import { UnstakeDialogView } from '@/components/Dialogs/unstake/enums'; -import { useUnstakeDialog } from '@/components/Dialogs/unstake/hooks'; -import { useGetSupplyIncreaseVestingObjects, useNotifications } from '@/hooks'; +import { UnstakeDialogView } from '@/components/dialogs/unstake/enums'; +import { useUnstakeDialog } from '@/components/dialogs/unstake/hooks'; +import { useGetSupplyIncreaseVestingObjects } from '@/hooks'; import { groupTimelockedStakedObjects, TimelockedStakedObjectsGrouped } from '@/lib/utils'; -import { NotificationType } from '@/stores/notificationStore'; import { useFeature } from '@growthbook/growthbook-react'; import { Panel, @@ -34,6 +33,8 @@ import { Button, ButtonType, LoadingIndicator, + LabelText, + LabelTextSize, } from '@iota/apps-ui-kit'; import { Theme, @@ -51,11 +52,12 @@ import { } from '@iota/dapp-kit'; import { IotaValidatorSummary } from '@iota/iota-sdk/client'; import { IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; -import { Calendar, StarHex } from '@iota/ui-icons'; +import { Calendar, StarHex } from '@iota/apps-ui-icons'; import { useRouter } from 'next/navigation'; import { useEffect, useState } from 'react'; import { StakedTimelockObject } from '@/components'; import { IotaSignAndExecuteTransactionOutput } from '@iota/wallet-standard'; +import toast from 'react-hot-toast'; export default function VestingDashboardPage(): JSX.Element { const [timelockedObjectsToUnstake, setTimelockedObjectsToUnstake] = @@ -66,7 +68,6 @@ export default function VestingDashboardPage(): JSX.Element { const router = useRouter(); const { data: system } = useIotaClientQuery('getLatestIotaSystemState'); const [isVestingScheduleDialogOpen, setIsVestingScheduleDialogOpen] = useState(false); - const { addNotification } = useNotifications(); const { data: activeValidators } = useGetActiveValidatorsInfo(); const { mutateAsync: signAndExecuteTransaction } = useSignAndExecuteTransaction(); const { theme } = useTheme(); @@ -82,11 +83,11 @@ export default function VestingDashboardPage(): JSX.Element { nextPayout, supplyIncreaseVestingPortfolio, supplyIncreaseVestingSchedule, - supplyIncreaseVestingMapped, supplyIncreaseVestingStakedMapped, isTimelockedStakedObjectsLoading, unlockAllSupplyIncreaseVesting, refreshStakeList, + isSupplyIncreaseVestingScheduleEmpty, } = useGetSupplyIncreaseVestingObjects(address); const timelockedStakedObjectsGrouped: TimelockedStakedObjectsGrouped[] = @@ -151,6 +152,11 @@ export default function VestingDashboardPage(): JSX.Element { IOTA_TYPE_ARG, ); + const [formattedAvailableStaking, availableStakingSymbol] = useFormatCoin( + supplyIncreaseVestingSchedule.availableStaking, + IOTA_TYPE_ARG, + ); + function handleOnSuccess(digest: string): void { setTimelockedObjectsToUnstake(null); @@ -163,7 +169,7 @@ export default function VestingDashboardPage(): JSX.Element { const handleCollect = () => { if (!unlockAllSupplyIncreaseVesting?.transactionBlock) { - addNotification('Failed to create a Transaction', NotificationType.Error); + toast.error('Failed to create a Transaction'); return; } signAndExecuteTransaction( @@ -177,10 +183,10 @@ export default function VestingDashboardPage(): JSX.Element { }, ) .then(() => { - addNotification('Collect transaction has been sent'); + toast.success('Collect transaction has been sent'); }) .catch(() => { - addNotification('Collect transaction was not sent', NotificationType.Error); + toast.error('Collect transaction was not sent'); }); }; @@ -203,7 +209,7 @@ export default function VestingDashboardPage(): JSX.Element { useEffect(() => { if (!supplyIncreaseVestingEnabled) { - router.push('/'); + router.push('/home'); } }, [router, supplyIncreaseVestingEnabled]); @@ -222,7 +228,7 @@ export default function VestingDashboardPage(): JSX.Element { <Panel> <Title title="Vesting" size={TitleSize.Medium} /> <div className="flex flex-col gap-md p-lg pt-sm"> - <div className="flex h-24 flex-row gap-4"> + <div className="flex h-24 flex-row gap-md"> <DisplayStats label="Total Vested" value={formattedTotalVested} @@ -291,18 +297,20 @@ export default function VestingDashboardPage(): JSX.Element { </div> </Panel> - {supplyIncreaseVestingMapped.length === 0 ? ( + {isSupplyIncreaseVestingScheduleEmpty ? ( <Banner videoSrc={videoSrc} title="Stake Vested Tokens" subtitle="Earn Rewards" onButtonClick={() => handleNewStake()} buttonText="Stake" + disabled={supplyIncreaseVestingSchedule.availableStaking === 0n} /> ) : null} </div> - {supplyIncreaseVestingMapped.length !== 0 ? ( + {!isSupplyIncreaseVestingScheduleEmpty && + supplyIncreaseVestingSchedule.totalStaked !== 0n ? ( <div className="flex w-full md:w-1/2"> <Panel> <Title @@ -321,8 +329,8 @@ export default function VestingDashboardPage(): JSX.Element { } /> - <div className="flex flex-col px-lg py-sm"> - <div className="flex flex-row gap-md"> + <div className="flex flex-col gap-y-md px-lg py-sm"> + <div className="flex flex-row gap-x-md"> <DisplayStats label="Your stake" value={`${totalStakedFormatted} ${totalStakedSymbol}`} @@ -332,6 +340,21 @@ export default function VestingDashboardPage(): JSX.Element { value={`${totalEarnedFormatted} ${totalEarnedSymbol}`} /> </div> + <div className="flex w-full"> + <Card type={CardType.Filled}> + <CardBody + title="" + subtitle={ + <LabelText + size={LabelTextSize.Large} + label="Available for staking" + text={formattedAvailableStaking} + supportingLabel={availableStakingSymbol} + /> + } + /> + </Card> + </div> </div> <div className="flex flex-col px-lg py-sm"> <div className="flex w-full flex-col items-center justify-center space-y-4 pt-4"> diff --git a/apps/wallet-dashboard/app/page.tsx b/apps/wallet-dashboard/app/page.tsx index 3392c231d31..d6b8fde2f65 100644 --- a/apps/wallet-dashboard/app/page.tsx +++ b/apps/wallet-dashboard/app/page.tsx @@ -5,7 +5,7 @@ import { ConnectButton, useCurrentWallet, useAutoConnectWallet } from '@iota/dapp-kit'; import { redirect } from 'next/navigation'; -import { IotaLogoWeb } from '@iota/ui-icons'; +import { IotaLogoWeb } from '@iota/apps-ui-icons'; import { HOMEPAGE_ROUTE } from '@/lib/constants/routes.constants'; import { Theme, ThemeSwitcher, useTheme } from '@iota/core'; import { LoadingIndicator } from '@iota/apps-ui-kit'; diff --git a/apps/wallet-dashboard/components/AmountBox.tsx b/apps/wallet-dashboard/components/AmountBox.tsx index 8db7bb609d0..a59926b1357 100644 --- a/apps/wallet-dashboard/components/AmountBox.tsx +++ b/apps/wallet-dashboard/components/AmountBox.tsx @@ -8,7 +8,7 @@ interface AmountBoxProps { amount: string; } -function AmountBox({ title, amount }: AmountBoxProps): JSX.Element { +export function AmountBox({ title, amount }: AmountBoxProps): JSX.Element { return ( <div className="flex items-center justify-center gap-4 pt-12"> <Box title={title}> @@ -17,5 +17,3 @@ function AmountBox({ title, amount }: AmountBoxProps): JSX.Element { </div> ); } - -export default AmountBox; diff --git a/apps/wallet-dashboard/components/AssetsList.tsx b/apps/wallet-dashboard/components/AssetsList.tsx deleted file mode 100644 index adb9e251581..00000000000 --- a/apps/wallet-dashboard/components/AssetsList.tsx +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright (c) 2024 IOTA Stiftung -// SPDX-License-Identifier: Apache-2.0 - -import { AssetCategory } from '@/lib/enums'; -import { IotaObjectData } from '@iota/iota-sdk/client'; -import { AssetTileLink } from '@/components'; -import { LoadingIndicator } from '@iota/apps-ui-kit'; -import { useEffect, useRef } from 'react'; -import { useOnScreen } from '@iota/core'; -import cl from 'clsx'; - -interface AssetListProps { - assets: IotaObjectData[]; - selectedCategory: AssetCategory; - hasNextPage: boolean; - isFetchingNextPage: boolean; - fetchNextPage: () => void; - onClick: (asset: IotaObjectData) => void; -} - -const ASSET_LAYOUT: Record<AssetCategory, string> = { - [AssetCategory.Visual]: - 'grid-template-visual-assets grid max-h-[600px] gap-md overflow-auto py-sm', - [AssetCategory.Other]: 'flex flex-col overflow-auto py-sm', -}; - -export function AssetList({ - assets, - selectedCategory, - hasNextPage, - isFetchingNextPage, - fetchNextPage, - onClick, -}: AssetListProps): React.JSX.Element { - const observerElem = useRef<HTMLDivElement | null>(null); - const { isIntersecting } = useOnScreen(observerElem); - const isSpinnerVisible = isFetchingNextPage && hasNextPage; - - useEffect(() => { - if (isIntersecting && hasNextPage && !isFetchingNextPage && fetchNextPage) { - fetchNextPage(); - } - }, [isIntersecting, fetchNextPage, hasNextPage, isFetchingNextPage]); - - return ( - <div className={cl('max-h-[600px]', ASSET_LAYOUT[selectedCategory])}> - {assets.map((asset) => ( - <AssetTileLink - key={asset.digest} - asset={asset} - type={selectedCategory} - onClick={onClick} - /> - ))} - <div ref={observerElem}> - {isSpinnerVisible ? ( - <div className="mt-1 flex h-full w-full justify-center"> - <LoadingIndicator /> - </div> - ) : null} - </div> - </div> - ); -} diff --git a/apps/wallet-dashboard/components/Banner.tsx b/apps/wallet-dashboard/components/Banner.tsx index aa697f9f7b5..93a828b5732 100644 --- a/apps/wallet-dashboard/components/Banner.tsx +++ b/apps/wallet-dashboard/components/Banner.tsx @@ -2,7 +2,6 @@ // SPDX-License-Identifier: Apache-2.0 import { Button, ButtonSize, ButtonType, Panel } from '@iota/apps-ui-kit'; -import React from 'react'; interface BannerProps { videoSrc: string; @@ -10,8 +9,16 @@ interface BannerProps { subtitle?: string; onButtonClick: () => void; buttonText: string; + disabled?: boolean; } -export function Banner({ videoSrc, title, subtitle, onButtonClick, buttonText }: BannerProps) { +export function Banner({ + videoSrc, + title, + subtitle, + onButtonClick, + buttonText, + disabled, +}: BannerProps) { return ( <Panel bgColor="bg-secondary-90 dark:bg-secondary-10"> <div className="flex h-full w-full justify-between "> @@ -30,6 +37,7 @@ export function Banner({ videoSrc, title, subtitle, onButtonClick, buttonText }: size={ButtonSize.Small} type={ButtonType.Outlined} text={buttonText} + disabled={disabled} /> </div> </div> diff --git a/apps/wallet-dashboard/components/Box.tsx b/apps/wallet-dashboard/components/Box.tsx index 3b9b285ea6e..7ffda69c41c 100644 --- a/apps/wallet-dashboard/components/Box.tsx +++ b/apps/wallet-dashboard/components/Box.tsx @@ -1,14 +1,14 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import React from 'react'; +import { ReactNode } from 'react'; interface BoxProps { - children: React.ReactNode; + children: ReactNode; title?: string; } -function Box({ children, title }: BoxProps): JSX.Element { +export function Box({ children, title }: BoxProps): JSX.Element { return ( <div className="flex flex-col items-center gap-2 rounded-lg border border-white p-4"> {title && <h2>{title}</h2>} @@ -16,5 +16,3 @@ function Box({ children, title }: BoxProps): JSX.Element { </div> ); } - -export default Box; diff --git a/apps/wallet-dashboard/components/Dialogs/Assets/AssetDialog.tsx b/apps/wallet-dashboard/components/Dialogs/Assets/AssetDialog.tsx deleted file mode 100644 index c71390a33aa..00000000000 --- a/apps/wallet-dashboard/components/Dialogs/Assets/AssetDialog.tsx +++ /dev/null @@ -1,102 +0,0 @@ -// Copyright (c) 2024 IOTA Stiftung -// SPDX-License-Identifier: Apache-2.0 - -import React, { useState } from 'react'; -import { Dialog } from '@iota/apps-ui-kit'; -import { FormikProvider, useFormik } from 'formik'; -import { useIotaClient, useCurrentAccount } from '@iota/dapp-kit'; -import { createNftSendValidationSchema } from '@iota/core'; -import { DetailsView, SendView } from './views'; -import { IotaObjectData } from '@iota/iota-sdk/client'; -import { AssetsDialogView } from './constants'; -import { useCreateSendAssetTransaction, useNotifications } from '@/hooks'; -import { NotificationType } from '@/stores/notificationStore'; -import { TransactionDetailsView } from '../SendToken'; -import { DialogLayout } from '../layout'; - -interface AssetsDialogProps { - onClose: () => void; - asset: IotaObjectData; - refetchAssets: () => void; -} - -interface FormValues { - to: string; -} - -const INITIAL_VALUES: FormValues = { - to: '', -}; - -export function AssetDialog({ onClose, asset, refetchAssets }: AssetsDialogProps): JSX.Element { - const [view, setView] = useState<AssetsDialogView>(AssetsDialogView.Details); - const account = useCurrentAccount(); - const [digest, setDigest] = useState<string>(''); - const activeAddress = account?.address ?? ''; - const objectId = asset?.objectId ?? ''; - const { addNotification } = useNotifications(); - const iotaClient = useIotaClient(); - const validationSchema = createNftSendValidationSchema(activeAddress, objectId); - - const { mutation: sendAsset } = useCreateSendAssetTransaction(objectId); - - const formik = useFormik<FormValues>({ - initialValues: INITIAL_VALUES, - validationSchema: validationSchema, - onSubmit: onSubmit, - validateOnChange: true, - }); - - async function onSubmit(values: FormValues) { - try { - const executed = await sendAsset.mutateAsync(values.to); - - const tx = await iotaClient.waitForTransaction({ - digest: executed.digest, - }); - - setDigest(tx.digest); - refetchAssets(); - addNotification('Transfer transaction successful', NotificationType.Success); - setView(AssetsDialogView.TransactionDetails); - } catch { - addNotification('Transfer transaction failed', NotificationType.Error); - } - } - - function onDetailsSend() { - setView(AssetsDialogView.Send); - } - - function onSendViewBack() { - setView(AssetsDialogView.Details); - } - function onOpenChange() { - setView(AssetsDialogView.Details); - onClose(); - } - return ( - <Dialog open onOpenChange={onOpenChange}> - <DialogLayout> - <> - {view === AssetsDialogView.Details && ( - <DetailsView asset={asset} onClose={onOpenChange} onSend={onDetailsSend} /> - )} - {view === AssetsDialogView.Send && ( - <FormikProvider value={formik}> - <SendView - asset={asset} - onClose={onOpenChange} - onBack={onSendViewBack} - /> - </FormikProvider> - )} - - {view === AssetsDialogView.TransactionDetails && !!digest ? ( - <TransactionDetailsView digest={digest} onClose={onOpenChange} /> - ) : null} - </> - </DialogLayout> - </Dialog> - ); -} diff --git a/apps/wallet-dashboard/components/Dialogs/MigrationDialog.tsx b/apps/wallet-dashboard/components/Dialogs/MigrationDialog.tsx deleted file mode 100644 index f1f661c2db4..00000000000 --- a/apps/wallet-dashboard/components/Dialogs/MigrationDialog.tsx +++ /dev/null @@ -1,176 +0,0 @@ -// Copyright (c) 2024 IOTA Stiftung -// SPDX-License-Identifier: Apache-2.0 - -import React from 'react'; -import { VirtualList } from '@/components'; -import { useCurrentAccount, useSignAndExecuteTransaction } from '@iota/dapp-kit'; -import { IotaObjectData } from '@iota/iota-sdk/client'; -import { useMigrationTransaction } from '@/hooks/useMigrationTransaction'; -import { - Button, - Dialog, - Header, - InfoBox, - InfoBoxStyle, - InfoBoxType, - KeyValueInfo, - LoadingIndicator, - Panel, - Title, - TitleSize, -} from '@iota/apps-ui-kit'; -import { useGroupedMigrationObjectsByExpirationDate } from '@/hooks'; -import { Loader, Warning } from '@iota/ui-icons'; -import { DialogLayout, DialogLayoutBody, DialogLayoutFooter } from './layout'; -import { MigrationObjectDetailsCard } from '../migration/migration-object-details-card'; -import { Collapsible, useFormatCoin } from '@iota/core'; -import { IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; -import { summarizeMigratableObjectValues } from '@/lib/utils'; -import toast from 'react-hot-toast'; - -interface MigrationDialogProps { - basicOutputObjects: IotaObjectData[] | undefined; - nftOutputObjects: IotaObjectData[] | undefined; - onSuccess: (digest: string) => void; - setOpen: (bool: boolean) => void; - open: boolean; - isTimelocked: boolean; -} - -export function MigrationDialog({ - basicOutputObjects = [], - nftOutputObjects = [], - onSuccess, - open, - setOpen, - isTimelocked, -}: MigrationDialogProps): JSX.Element { - const account = useCurrentAccount(); - const { - data: migrateData, - isPending: isMigrationPending, - isError: isMigrationError, - } = useMigrationTransaction(account?.address || '', basicOutputObjects, nftOutputObjects); - - const { - data: resolvedObjects = [], - isLoading, - error: isGroupedMigrationError, - } = useGroupedMigrationObjectsByExpirationDate( - [...basicOutputObjects, ...nftOutputObjects], - isTimelocked, - ); - - const { mutateAsync: signAndExecuteTransaction, isPending: isSendingTransaction } = - useSignAndExecuteTransaction(); - const { totalNotOwnedStorageDepositReturnAmount } = summarizeMigratableObjectValues({ - basicOutputs: basicOutputObjects, - nftOutputs: nftOutputObjects, - address: account?.address || '', - }); - - const [gasFee, gasFeeSymbol] = useFormatCoin(migrateData?.gasBudget, IOTA_TYPE_ARG); - const [totalStorageDepositReturnAmountFormatted, totalStorageDepositReturnAmountSymbol] = - useFormatCoin(totalNotOwnedStorageDepositReturnAmount.toString(), IOTA_TYPE_ARG); - - async function handleMigrate(): Promise<void> { - if (!migrateData) return; - signAndExecuteTransaction( - { - transaction: migrateData.transaction, - }, - { - onSuccess: (tx) => { - onSuccess(tx.digest); - }, - }, - ) - .then(() => { - toast.success('Migration transaction has been sent'); - }) - .catch(() => { - toast.error('Migration transaction was not sent'); - }); - } - - return ( - <Dialog open={open} onOpenChange={setOpen}> - <DialogLayout> - <Header title="Confirmation" onClose={() => setOpen(false)} titleCentered /> - <DialogLayoutBody> - <div className="flex h-full flex-col gap-y-md overflow-y-auto"> - {isGroupedMigrationError && !isLoading && ( - <InfoBox - title="Error" - supportingText="Failed to load migration objects" - style={InfoBoxStyle.Elevated} - type={InfoBoxType.Error} - icon={<Warning />} - /> - )} - {isLoading ? ( - <LoadingIndicator text="Loading migration objects" /> - ) : ( - <> - <Collapsible - defaultOpen - render={() => ( - <Title size={TitleSize.Small} title="Assets to Migrate" /> - )} - > - <div className="h-[600px] pb-md--rs"> - <VirtualList - heightClassName="h-full" - overflowClassName="overflow-y-auto" - items={resolvedObjects} - estimateSize={() => 58} - render={(migrationObject) => ( - <MigrationObjectDetailsCard - migrationObject={migrationObject} - isTimelocked={isTimelocked} - /> - )} - /> - </div> - </Collapsible> - <Panel hasBorder> - <div className="flex flex-col gap-y-sm p-md"> - <KeyValueInfo - keyText="Legacy storage deposit" - value={totalStorageDepositReturnAmountFormatted || '-'} - supportingLabel={totalStorageDepositReturnAmountSymbol} - fullwidth - /> - <KeyValueInfo - keyText="Gas Fees" - value={gasFee || '-'} - supportingLabel={gasFeeSymbol} - fullwidth - /> - </div> - </Panel> - </> - )} - </div> - </DialogLayoutBody> - <DialogLayoutFooter> - <Button - text="Migrate" - disabled={isMigrationPending || isMigrationError || isSendingTransaction} - onClick={handleMigrate} - icon={ - isMigrationPending || isSendingTransaction ? ( - <Loader - className="h-4 w-4 animate-spin" - data-testid="loading-indicator" - /> - ) : null - } - iconAfterText - fullWidth - /> - </DialogLayoutFooter> - </DialogLayout> - </Dialog> - ); -} diff --git a/apps/wallet-dashboard/components/Dialogs/Staking/views/index.ts b/apps/wallet-dashboard/components/Dialogs/Staking/views/index.ts deleted file mode 100644 index 5a0ffed2be6..00000000000 --- a/apps/wallet-dashboard/components/Dialogs/Staking/views/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright (c) 2024 IOTA Stiftung -// SPDX-License-Identifier: Apache-2.0 - -export { default as EnterAmountView } from './EnterAmountView'; -export { default as EnterTimelockedAmountView } from './EnterTimelockedAmountView'; -export { default as EnterAmountDialogLayout } from './EnterAmountDialogLayout'; -export { default as SelectValidatorView } from './SelectValidatorView'; -export * from './DetailsView'; diff --git a/apps/wallet-dashboard/components/ExternalImage.tsx b/apps/wallet-dashboard/components/ExternalImage.tsx index 8e23c5a8d08..8f582018f15 100644 --- a/apps/wallet-dashboard/components/ExternalImage.tsx +++ b/apps/wallet-dashboard/components/ExternalImage.tsx @@ -1,7 +1,7 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -export default function ExternalImage({ +export function ExternalImage({ ...imageProps }: React.ImgHTMLAttributes<HTMLImageElement>): JSX.Element { // eslint-disable-next-line @next/next/no-img-element diff --git a/apps/wallet-dashboard/components/Input.tsx b/apps/wallet-dashboard/components/Input.tsx index 40463e507ce..6216f607aa8 100644 --- a/apps/wallet-dashboard/components/Input.tsx +++ b/apps/wallet-dashboard/components/Input.tsx @@ -1,8 +1,6 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import React from 'react'; - interface InputProps { label?: string; value: string; @@ -12,7 +10,7 @@ interface InputProps { error?: string; } -function Input({ +export function Input({ label, value, onChange, @@ -34,5 +32,3 @@ function Input({ </div> ); } - -export default Input; diff --git a/apps/wallet-dashboard/components/Notifications/Notifications.tsx b/apps/wallet-dashboard/components/Notifications/Notifications.tsx deleted file mode 100644 index 77493b164d9..00000000000 --- a/apps/wallet-dashboard/components/Notifications/Notifications.tsx +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright (c) 2024 IOTA Stiftung -// SPDX-License-Identifier: Apache-2.0 - -'use client'; - -import { useEffect, useState } from 'react'; - -import { - NotificationData, - NotificationType, - useNotificationStore, -} from '@/stores/notificationStore'; - -const ALERT_FADE_OUT_DURATION = 700; - -const NOTIFICATION_TYPE_TO_COLOR = { - [NotificationType.Info]: 'bg-blue-500', - [NotificationType.Success]: 'bg-green-500', - [NotificationType.Error]: 'bg-red-500', - [NotificationType.Warning]: 'bg-yellow-500', -}; - -function Notification(props: { notification: NotificationData }): JSX.Element { - const clearNotification = useNotificationStore((state) => state.clearNotification); - const [transition, setTransition] = useState('opacity-100'); - - const { notification } = props; - - const bgColor = NOTIFICATION_TYPE_TO_COLOR[notification.type]; - - useEffect(() => { - const fadeOutputTimeout = setTimeout(() => { - setTransition('opacity-0'); - }, notification.duration - ALERT_FADE_OUT_DURATION); - - const removeTimeout = setTimeout(() => { - clearNotification(notification.index); - }, notification.duration); - - return () => { - clearTimeout(fadeOutputTimeout); - clearTimeout(removeTimeout); - }; - }, [notification, clearNotification]); - - return ( - <div - className={`flex items-center justify-center rounded-xl text-center ${bgColor} mt-1 w-[300px] p-2 transition-opacity duration-[${ALERT_FADE_OUT_DURATION}] ease-in ${transition}`} - > - {notification.message} - </div> - ); -} - -export default function Notifications(): JSX.Element { - const notifications = useNotificationStore((state) => state.notifications); - return ( - <div className="fixed right-2 top-1 z-[99999]"> - {notifications.map((notification) => ( - <Notification key={`${notification.index}`} notification={notification} /> - ))} - </div> - ); -} diff --git a/apps/wallet-dashboard/components/PaginationOptions.tsx b/apps/wallet-dashboard/components/PaginationOptions.tsx index eba852565cb..baa17a1f178 100644 --- a/apps/wallet-dashboard/components/PaginationOptions.tsx +++ b/apps/wallet-dashboard/components/PaginationOptions.tsx @@ -2,7 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 import { Button, ButtonType, ButtonSize } from '@iota/apps-ui-kit'; -import { ArrowLeft, ArrowRight, DoubleArrowLeft, DoubleArrowRight } from '@iota/ui-icons'; +import { ArrowLeft, ArrowRight, DoubleArrowLeft, DoubleArrowRight } from '@iota/apps-ui-icons'; interface PaginationOptionsProps { pagination: { diff --git a/apps/wallet-dashboard/components/RouteLink.tsx b/apps/wallet-dashboard/components/RouteLink.tsx index f4395dcd421..73c0d94e954 100644 --- a/apps/wallet-dashboard/components/RouteLink.tsx +++ b/apps/wallet-dashboard/components/RouteLink.tsx @@ -4,7 +4,6 @@ 'use client'; import { usePathname } from 'next/navigation'; -import React from 'react'; import Link from 'next/link'; interface RouteLinkProps { @@ -12,7 +11,7 @@ interface RouteLinkProps { path: string; } -function RouteLink({ title, path }: RouteLinkProps): JSX.Element { +export function RouteLink({ title, path }: RouteLinkProps): JSX.Element { const currentPath = usePathname(); const isActive = currentPath && (path === currentPath || path.startsWith(currentPath)); @@ -29,5 +28,3 @@ function RouteLink({ title, path }: RouteLinkProps): JSX.Element { </Link> ); } - -export default RouteLink; diff --git a/apps/wallet-dashboard/components/SupplyIncreaseVestingOverview.tsx b/apps/wallet-dashboard/components/SupplyIncreaseVestingOverview.tsx index 7608bda1a3a..3f9ba046256 100644 --- a/apps/wallet-dashboard/components/SupplyIncreaseVestingOverview.tsx +++ b/apps/wallet-dashboard/components/SupplyIncreaseVestingOverview.tsx @@ -15,10 +15,10 @@ import { Panel, Title, } from '@iota/apps-ui-kit'; -import { StakeDialog, useStakeDialog } from './Dialogs'; +import { StakeDialog, useStakeDialog } from './dialogs'; import { TIMELOCK_IOTA_TYPE, useCountdownByTimestamp, useFormatCoin } from '@iota/core'; import { IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; -import SvgClock from '@iota/ui-icons/src/Clock'; +import { Clock } from '@iota/apps-ui-icons'; import { useQueryClient } from '@tanstack/react-query'; export function SupplyIncreaseVestingOverview() { @@ -29,7 +29,7 @@ export function SupplyIncreaseVestingOverview() { const { nextPayout, supplyIncreaseVestingSchedule, - supplyIncreaseVestingMapped, + isSupplyIncreaseVestingScheduleEmpty, supplyIncreaseVestingStakedMapped, } = useGetSupplyIncreaseVestingObjects(address); @@ -57,9 +57,6 @@ export function SupplyIncreaseVestingOverview() { IOTA_TYPE_ARG, ); - const showSupplyIncreaseVestingOverview = - supplyIncreaseVestingMapped.length > 0 || supplyIncreaseVestingStakedMapped.length > 0; - function handleOnSuccess(digest: string): void { iotaClient .waitForTransaction({ @@ -81,7 +78,7 @@ export function SupplyIncreaseVestingOverview() { }); } - return showSupplyIncreaseVestingOverview ? ( + return !isSupplyIncreaseVestingScheduleEmpty || supplyIncreaseVestingStakedMapped.length > 0 ? ( <div style={{ gridArea: 'vesting' }} className="with-vesting flex grow overflow-hidden"> <Panel> <Title title="Vesting" /> @@ -107,7 +104,7 @@ export function SupplyIncreaseVestingOverview() { type={CardActionType.Button} buttonType={ButtonType.Ghost} title={formattedLastPayoutExpirationTime} - icon={<SvgClock />} + icon={<Clock />} /> </Card> </div> diff --git a/apps/wallet-dashboard/components/VirtualList.tsx b/apps/wallet-dashboard/components/VirtualList.tsx index 58dc598a364..667cef76df3 100644 --- a/apps/wallet-dashboard/components/VirtualList.tsx +++ b/apps/wallet-dashboard/components/VirtualList.tsx @@ -3,7 +3,7 @@ 'use client'; -import React, { ReactNode, useEffect } from 'react'; +import { ReactNode, useEffect, useRef } from 'react'; import { useVirtualizer } from '@tanstack/react-virtual'; import clsx from 'clsx'; @@ -19,7 +19,7 @@ interface VirtualListProps<T> { overflowClassName?: string; } -function VirtualList<T>({ +export function VirtualList<T>({ items, hasNextPage = false, isFetchingNextPage = false, @@ -30,7 +30,7 @@ function VirtualList<T>({ heightClassName = 'h-fit', overflowClassName, }: VirtualListProps<T>): JSX.Element { - const containerRef = React.useRef<HTMLDivElement | null>(null); + const containerRef = useRef<HTMLDivElement | null>(null); const virtualizer = useVirtualizer({ // Render one more item if there is still pages to be fetched count: hasNextPage ? items.length + 1 : items.length, @@ -98,5 +98,3 @@ function VirtualList<T>({ </div> ); } - -export default VirtualList; diff --git a/apps/wallet-dashboard/components/account-balance/AccountBalance.tsx b/apps/wallet-dashboard/components/account-balance/AccountBalance.tsx index 9bb3f297b27..b84dec37910 100644 --- a/apps/wallet-dashboard/components/account-balance/AccountBalance.tsx +++ b/apps/wallet-dashboard/components/account-balance/AccountBalance.tsx @@ -6,7 +6,7 @@ import { formatAddress, IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; import { useBalance, useFormatCoin } from '@iota/core'; import { Address, Button, ButtonSize, ButtonType, Panel } from '@iota/apps-ui-kit'; import { getNetwork } from '@iota/iota-sdk/client'; -import { ReceiveFundsDialog, SendTokenDialog } from '../Dialogs'; +import { ReceiveFundsDialog, SendTokenDialog } from '../dialogs'; import toast from 'react-hot-toast'; import { useState } from 'react'; diff --git a/apps/wallet-dashboard/components/AppList/AppList.tsx b/apps/wallet-dashboard/components/app-list/AppList.tsx similarity index 95% rename from apps/wallet-dashboard/components/AppList/AppList.tsx rename to apps/wallet-dashboard/components/app-list/AppList.tsx index 0ccd665cf95..a3e1b487d03 100644 --- a/apps/wallet-dashboard/components/AppList/AppList.tsx +++ b/apps/wallet-dashboard/components/app-list/AppList.tsx @@ -1,11 +1,10 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import React from 'react'; import Image from 'next/image'; import { useAppsBackend } from '@iota/core'; import { useQuery } from '@tanstack/react-query'; -import { type AppListItem } from './AppList.types'; +import { type AppListItem } from './appList.types'; import { getDefaultNetwork } from '@iota/iota-sdk/client'; const AppListItem = (props: AppListItem) => { diff --git a/apps/wallet-dashboard/components/AppList/AppList.types.ts b/apps/wallet-dashboard/components/app-list/appList.types.ts similarity index 100% rename from apps/wallet-dashboard/components/AppList/AppList.types.ts rename to apps/wallet-dashboard/components/app-list/appList.types.ts diff --git a/apps/wallet-dashboard/components/AppList/index.ts b/apps/wallet-dashboard/components/app-list/index.ts similarity index 100% rename from apps/wallet-dashboard/components/AppList/index.ts rename to apps/wallet-dashboard/components/app-list/index.ts diff --git a/apps/wallet-dashboard/components/Buttons/Button.tsx b/apps/wallet-dashboard/components/buttons/Button.tsx similarity index 79% rename from apps/wallet-dashboard/components/Buttons/Button.tsx rename to apps/wallet-dashboard/components/buttons/Button.tsx index b15149e1201..d8bc2efca2d 100644 --- a/apps/wallet-dashboard/components/Buttons/Button.tsx +++ b/apps/wallet-dashboard/components/buttons/Button.tsx @@ -1,15 +1,13 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import React from 'react'; - interface ButtonProps { onClick?: (event: React.MouseEvent<HTMLButtonElement, MouseEvent>) => void; children: React.ReactNode; disabled?: boolean; } -function Button({ onClick, children, disabled }: ButtonProps): JSX.Element { +export function Button({ onClick, children, disabled }: ButtonProps): JSX.Element { return ( <button onClick={onClick} @@ -20,5 +18,3 @@ function Button({ onClick, children, disabled }: ButtonProps): JSX.Element { </button> ); } - -export default Button; diff --git a/apps/wallet-dashboard/components/buttons/index.ts b/apps/wallet-dashboard/components/buttons/index.ts new file mode 100644 index 00000000000..0ecf88b8b19 --- /dev/null +++ b/apps/wallet-dashboard/components/buttons/index.ts @@ -0,0 +1,4 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +export * from './Button'; diff --git a/apps/wallet-dashboard/components/Cards/VisualAssetDetailsCard.tsx b/apps/wallet-dashboard/components/cards/VisualAssetDetailsCard.tsx similarity index 100% rename from apps/wallet-dashboard/components/Cards/VisualAssetDetailsCard.tsx rename to apps/wallet-dashboard/components/cards/VisualAssetDetailsCard.tsx diff --git a/apps/wallet-dashboard/components/Cards/index.ts b/apps/wallet-dashboard/components/cards/index.ts similarity index 100% rename from apps/wallet-dashboard/components/Cards/index.ts rename to apps/wallet-dashboard/components/cards/index.ts diff --git a/apps/wallet-dashboard/components/coins/MyCoins.tsx b/apps/wallet-dashboard/components/coins/MyCoins.tsx index 411d7cdc702..d9d1c0f6f23 100644 --- a/apps/wallet-dashboard/components/coins/MyCoins.tsx +++ b/apps/wallet-dashboard/components/coins/MyCoins.tsx @@ -1,7 +1,7 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import React, { useState } from 'react'; +import { useState } from 'react'; import { useCurrentAccount, useIotaClientQuery } from '@iota/dapp-kit'; import { CoinBalance } from '@iota/iota-sdk/client'; import { @@ -18,7 +18,7 @@ import { SegmentedButtonType, Title, } from '@iota/apps-ui-kit'; -import { RecognizedBadge } from '@iota/ui-icons'; +import { RecognizedBadge } from '@iota/apps-ui-icons'; import { SendTokenDialog } from '@/components'; enum TokenCategory { @@ -42,7 +42,7 @@ const TOKEN_CATEGORIES = [ }, ]; -function MyCoins(): React.JSX.Element { +export function MyCoins(): React.JSX.Element { const [selectedTokenCategory, setSelectedTokenCategory] = useState(TokenCategory.All); const [isSendTokenDialogOpen, setIsSendTokenDialogOpen] = useState(false); const [selectedCoin, setSelectedCoin] = useState<CoinBalance>(); @@ -138,5 +138,3 @@ function MyCoins(): React.JSX.Element { </Panel> ); } - -export default MyCoins; diff --git a/apps/wallet-dashboard/components/coins/index.ts b/apps/wallet-dashboard/components/coins/index.ts index 2ff5894ab77..1bdbadc6356 100644 --- a/apps/wallet-dashboard/components/coins/index.ts +++ b/apps/wallet-dashboard/components/coins/index.ts @@ -1,4 +1,4 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -export { default as MyCoins } from './MyCoins'; +export * from './MyCoins'; diff --git a/apps/wallet-dashboard/components/Dialogs/ReceiveFundsDialog.tsx b/apps/wallet-dashboard/components/dialogs/ReceiveFundsDialog.tsx similarity index 100% rename from apps/wallet-dashboard/components/Dialogs/ReceiveFundsDialog.tsx rename to apps/wallet-dashboard/components/dialogs/ReceiveFundsDialog.tsx diff --git a/apps/wallet-dashboard/components/Dialogs/TransactionDialog.tsx b/apps/wallet-dashboard/components/dialogs/TransactionDialog.tsx similarity index 94% rename from apps/wallet-dashboard/components/Dialogs/TransactionDialog.tsx rename to apps/wallet-dashboard/components/dialogs/TransactionDialog.tsx index 8b78f53d190..71418f1b673 100644 --- a/apps/wallet-dashboard/components/Dialogs/TransactionDialog.tsx +++ b/apps/wallet-dashboard/components/dialogs/TransactionDialog.tsx @@ -11,7 +11,6 @@ import { ViewTxnOnExplorerButton, } from '@iota/core'; import { useCurrentAccount } from '@iota/dapp-kit'; -import { Validator } from './Staking/views/Validator'; interface SharedProps { txDigest?: string | null; @@ -43,7 +42,6 @@ export function TransactionDialogView({ activeAddress={activeAddress} summary={summary} renderExplorerLink={ExplorerLink} - renderValidatorLogo={Validator} /> ) : ( <div className="flex h-full w-full justify-center"> diff --git a/apps/wallet-dashboard/components/dialogs/assets/AssetDialog.tsx b/apps/wallet-dashboard/components/dialogs/assets/AssetDialog.tsx new file mode 100644 index 00000000000..f2190f2b713 --- /dev/null +++ b/apps/wallet-dashboard/components/dialogs/assets/AssetDialog.tsx @@ -0,0 +1,151 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +import { useState } from 'react'; +import { Dialog } from '@iota/apps-ui-kit'; +import { FormikProvider, useFormik } from 'formik'; +import { useIotaClient, useCurrentAccount, useSignAndExecuteTransaction } from '@iota/dapp-kit'; +import { + createNftSendValidationSchema, + useTransferAsset, + isKioskOwnerToken, + useKioskClient, + useNftDetails, +} from '@iota/core'; +import { DetailsView, SendView, KioskDetailsView } from './views'; +import { IotaObjectData, IotaTransactionBlockResponse } from '@iota/iota-sdk/client'; +import { AssetsDialogView } from './constants'; +import { TransactionDetailsView } from '../send-token'; +import { DialogLayout } from '../layout'; +import toast from 'react-hot-toast'; + +interface AssetsDialogProps { + onClose: () => void; + asset: IotaObjectData; + refetchAssets: () => void; +} + +interface FormValues { + to: string; +} + +const INITIAL_VALUES: FormValues = { + to: '', +}; + +export function AssetDialog({ onClose, asset, refetchAssets }: AssetsDialogProps): JSX.Element { + const kioskClient = useKioskClient(); + const account = useCurrentAccount(); + const iotaClient = useIotaClient(); + const { mutateAsync: signAndExecuteTransaction } = + useSignAndExecuteTransaction<IotaTransactionBlockResponse>(); + + const isTokenOwnedByKiosk = isKioskOwnerToken(kioskClient.network, asset); + const activeAddress = account?.address ?? ''; + + const initView = isTokenOwnedByKiosk ? AssetsDialogView.KioskDetails : AssetsDialogView.Details; + + const [view, setView] = useState<AssetsDialogView>(initView); + const [chosenKioskAsset, setChoosenKioskAsset] = useState<IotaObjectData | null>(null); + const [digest, setDigest] = useState<string>(''); + + const activeAsset = chosenKioskAsset || asset; + const objectId = chosenKioskAsset ? chosenKioskAsset.objectId : asset ? asset.objectId : ''; + const validationSchema = createNftSendValidationSchema(activeAddress, objectId); + const { objectData } = useNftDetails(objectId, activeAddress); + + const { mutateAsync: sendAsset } = useTransferAsset({ + objectId, + objectType: objectData?.type, + activeAddress: activeAddress, + executeFn: signAndExecuteTransaction, + }); + + const formik = useFormik<FormValues>({ + initialValues: INITIAL_VALUES, + validationSchema: validationSchema, + onSubmit: onSubmit, + validateOnChange: true, + }); + + async function onSubmit(values: FormValues) { + try { + const executed = await sendAsset(values.to); + + const tx = await iotaClient.waitForTransaction({ + digest: executed.digest, + }); + + setDigest(tx.digest); + refetchAssets(); + toast.success('Transfer transaction successful'); + setView(AssetsDialogView.TransactionDetails); + } catch { + toast.error('Transfer transaction failed'); + } + } + + function onDetailsSend() { + setView(AssetsDialogView.Send); + } + + function onSendViewBack() { + setView(AssetsDialogView.Details); + } + function onOpenChange() { + setView(AssetsDialogView.Details); + setChoosenKioskAsset(null); + onClose(); + } + + function onKioskItemClick(item: IotaObjectData) { + setChoosenKioskAsset(item); + setView(AssetsDialogView.Details); + } + + function onBack() { + if (!chosenKioskAsset) { + return; + } + setChoosenKioskAsset(null); + setView(AssetsDialogView.KioskDetails); + } + + return ( + <Dialog open onOpenChange={onOpenChange}> + <DialogLayout> + <> + {view === AssetsDialogView.KioskDetails && ( + <KioskDetailsView + asset={activeAsset} + onClose={onOpenChange} + onItemClick={onKioskItemClick} + /> + )} + {view === AssetsDialogView.Details && ( + <DetailsView + asset={activeAsset} + onClose={onOpenChange} + onSend={onDetailsSend} + onBack={onBack} + /> + )} + {view === AssetsDialogView.Send && ( + <FormikProvider value={formik}> + <SendView + objectId={objectId} + senderAddress={activeAddress} + onClose={onOpenChange} + onBack={onSendViewBack} + /> + </FormikProvider> + )} + + {view === AssetsDialogView.TransactionDetails && !!digest ? ( + <TransactionDetailsView digest={digest} onClose={onOpenChange} /> + ) : null} + </> + </DialogLayout> + </Dialog> + ); +} diff --git a/apps/wallet-dashboard/components/Dialogs/Assets/constants/AssetsDialogView.ts b/apps/wallet-dashboard/components/dialogs/assets/constants/assetsDialogView.ts similarity index 85% rename from apps/wallet-dashboard/components/Dialogs/Assets/constants/AssetsDialogView.ts rename to apps/wallet-dashboard/components/dialogs/assets/constants/assetsDialogView.ts index 242da33c2c3..8b4221c98a7 100644 --- a/apps/wallet-dashboard/components/Dialogs/Assets/constants/AssetsDialogView.ts +++ b/apps/wallet-dashboard/components/dialogs/assets/constants/assetsDialogView.ts @@ -5,4 +5,5 @@ export enum AssetsDialogView { Details = 'Details', Send = 'Send', TransactionDetails = 'TransactionDetails', + KioskDetails = 'KioskDetails', } diff --git a/apps/wallet-dashboard/components/dialogs/assets/constants/index.ts b/apps/wallet-dashboard/components/dialogs/assets/constants/index.ts new file mode 100644 index 00000000000..84f36d56cf4 --- /dev/null +++ b/apps/wallet-dashboard/components/dialogs/assets/constants/index.ts @@ -0,0 +1,4 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +export * from './assetsDialogView'; diff --git a/apps/wallet-dashboard/components/Dialogs/Assets/index.ts b/apps/wallet-dashboard/components/dialogs/assets/index.ts similarity index 100% rename from apps/wallet-dashboard/components/Dialogs/Assets/index.ts rename to apps/wallet-dashboard/components/dialogs/assets/index.ts diff --git a/apps/wallet-dashboard/components/Dialogs/Assets/views/DetailsView.tsx b/apps/wallet-dashboard/components/dialogs/assets/views/DetailsView.tsx similarity index 79% rename from apps/wallet-dashboard/components/Dialogs/Assets/views/DetailsView.tsx rename to apps/wallet-dashboard/components/dialogs/assets/views/DetailsView.tsx index 8520d62a484..9c4575681dc 100644 --- a/apps/wallet-dashboard/components/Dialogs/Assets/views/DetailsView.tsx +++ b/apps/wallet-dashboard/components/dialogs/assets/views/DetailsView.tsx @@ -1,17 +1,14 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import React from 'react'; -import { ExplorerLinkType, useNftDetails, Collapsible, useNFTBasicData } from '@iota/core'; import { - Button, - ButtonType, - Header, - KeyValueInfo, - VisualAssetCard, - VisualAssetType, -} from '@iota/apps-ui-kit'; -import Link from 'next/link'; + ExplorerLinkType, + useNftDetails, + Collapsible, + useNFTBasicData, + NftImage, +} from '@iota/core'; +import { Button, ButtonType, Header, KeyValueInfo } from '@iota/apps-ui-kit'; import { formatAddress } from '@iota/iota-sdk/utils'; import { DialogLayoutBody, DialogLayoutFooter } from '../../layout'; import { IotaObjectData } from '@iota/iota-sdk/client'; @@ -22,9 +19,10 @@ interface DetailsViewProps { asset: IotaObjectData; onClose: () => void; onSend: () => void; + onBack?: () => void; } -export function DetailsView({ onClose, asset, onSend }: DetailsViewProps) { +export function DetailsView({ onClose, asset, onSend, onBack }: DetailsViewProps) { const account = useCurrentAccount(); const senderAddress = account?.address ?? ''; @@ -38,7 +36,6 @@ export function DetailsView({ onClose, asset, onSend }: DetailsViewProps) { isAssetTransferable, metaKeys, metaValues, - formatMetaValue, isContainedInKiosk, kioskItem, objectData, @@ -46,27 +43,21 @@ export function DetailsView({ onClose, asset, onSend }: DetailsViewProps) { const { fileExtensionType, filePath } = useNFTBasicData(objectData); function handleMoreAboutKiosk() { - window.open('https://docs.iota.org/references/ts-sdk/kiosk/', '_blank'); + window.open('https://docs.iota.org/ts-sdk/kiosk/', '_blank'); } function handleMarketplace() { // TODO: https://github.com/iotaledger/iota/issues/4024 - window.open('https://docs.iota.org/references/ts-sdk/kiosk/', '_blank'); + window.open('https://docs.iota.org/ts-sdk/kiosk/', '_blank'); } return ( <> - <Header title="Asset" onClose={onClose} titleCentered /> + <Header title="Asset" onClose={onClose} titleCentered onBack={onBack} /> <DialogLayoutBody> <div className="flex w-full flex-col items-center justify-center gap-xs"> <div className="w-[172px]"> - <VisualAssetCard - assetSrc={nftImageUrl} - assetTitle={nftName} - assetType={VisualAssetType.Image} - altText={nftName || 'NFT'} - isHoverable={false} - /> + <NftImage src={nftImageUrl} title={nftName || 'NFT'} isHoverable={false} /> </div> <ExplorerLink type={ExplorerLinkType.Object} objectID={objectId}> <Button type={ButtonType.Ghost} text="View on Explorer" /> @@ -88,11 +79,7 @@ export function DetailsView({ onClose, asset, onSend }: DetailsViewProps) { {nftDisplayData?.projectUrl && ( <KeyValueInfo keyText="Website" - value={ - <Link href={nftDisplayData?.projectUrl}> - {nftDisplayData?.projectUrl} - </Link> - } + value={nftDisplayData?.projectUrl} fullwidth /> )} @@ -144,21 +131,14 @@ export function DetailsView({ onClose, asset, onSend }: DetailsViewProps) { <Collapsible defaultOpen title="Attributes"> <div className="flex flex-col gap-xs px-md pb-xs pt-sm"> {metaKeys.map((aKey, idx) => { - const { value, valueLink } = formatMetaValue( - metaValues[idx], - ); return ( <KeyValueInfo key={idx} keyText={aKey} value={ - valueLink ? ( - <Link key={aKey} href={valueLink || ''}> - {value} - </Link> - ) : ( - value - ) + typeof metaValues[idx] === 'object' + ? JSON.stringify(metaValues[idx]) + : metaValues[idx] } fullwidth /> diff --git a/apps/wallet-dashboard/components/dialogs/assets/views/KioskDetailsView.tsx b/apps/wallet-dashboard/components/dialogs/assets/views/KioskDetailsView.tsx new file mode 100644 index 00000000000..c259b170a39 --- /dev/null +++ b/apps/wallet-dashboard/components/dialogs/assets/views/KioskDetailsView.tsx @@ -0,0 +1,85 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +import { + useGetKioskContents, + getKioskIdFromOwnerCap, + useNftDetails, + NftImage, + ExplorerLinkType, + ViewTxnOnExplorerButton, +} from '@iota/core'; +import { Badge, BadgeType, Header, LoadingIndicator } from '@iota/apps-ui-kit'; +import { DialogLayoutBody, DialogLayoutFooter } from '../../layout'; +import { IotaObjectData } from '@iota/iota-sdk/client'; +import { useCurrentAccount } from '@iota/dapp-kit'; +import { ExplorerLink } from '@/components/ExplorerLink'; + +interface DetailsViewProps { + asset: IotaObjectData; + onClose: () => void; + onItemClick: (asset: IotaObjectData) => void; +} + +export function KioskDetailsView({ onClose, asset, onItemClick }: DetailsViewProps) { + const account = useCurrentAccount(); + const senderAddress = account?.address ?? ''; + const objectId = getKioskIdFromOwnerCap(asset); + const { data: kioskData, isPending } = useGetKioskContents(account?.address); + const kiosk = kioskData?.kiosks.get(objectId); + const items = kiosk?.items; + + if (isPending) { + return ( + <div className="flex h-full items-center justify-center"> + <LoadingIndicator /> + </div> + ); + } + + return ( + <> + <Header title="Kiosk" onClose={onClose} titleCentered /> + <DialogLayoutBody> + <div className="flex flex-col gap-md"> + <div className="flex flex-row gap-x-sm"> + <span className="text-title-lg text-neutral-10 dark:text-neutral-92"> + Kiosk items + </span> + <Badge type={BadgeType.Neutral} label={items?.length.toString() ?? '0'} /> + </div> + <div className="grid grid-cols-3 items-center justify-center gap-sm"> + {items?.map((item) => { + return item.data?.objectId ? ( + <div + onClick={() => { + item.data && onItemClick(item.data); + }} + key={item.data?.objectId} + > + <KioskItem object={item.data} address={senderAddress} /> + </div> + ) : null; + })} + </div> + </div> + </DialogLayoutBody> + <DialogLayoutFooter> + <ExplorerLink objectID={objectId} type={ExplorerLinkType.Object}> + <ViewTxnOnExplorerButton digest={objectId} /> + </ExplorerLink> + </DialogLayoutFooter> + </> + ); +} + +interface KioskItemProps { + object: IotaObjectData; + address: string; +} + +function KioskItem({ object, address }: KioskItemProps) { + const { nftName, nftImageUrl } = useNftDetails(object.objectId, address); + + return <NftImage title={nftName} src={nftImageUrl} isHoverable />; +} diff --git a/apps/wallet-dashboard/components/Dialogs/Assets/views/SendView.tsx b/apps/wallet-dashboard/components/dialogs/assets/views/SendView.tsx similarity index 63% rename from apps/wallet-dashboard/components/Dialogs/Assets/views/SendView.tsx rename to apps/wallet-dashboard/components/dialogs/assets/views/SendView.tsx index 3d0350478ac..f73f850a118 100644 --- a/apps/wallet-dashboard/components/Dialogs/Assets/views/SendView.tsx +++ b/apps/wallet-dashboard/components/dialogs/assets/views/SendView.tsx @@ -1,50 +1,30 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import React from 'react'; -import { AddressInput, useNftDetails } from '@iota/core'; +import { AddressInput, NftImage, useNftDetails } from '@iota/core'; import { useFormikContext } from 'formik'; import { DialogLayoutFooter, DialogLayoutBody } from '../../layout'; -import { - Button, - ButtonHtmlType, - Header, - VisualAssetCard, - VisualAssetType, - Title, -} from '@iota/apps-ui-kit'; -import { Loader } from '@iota/ui-icons'; -import { useCurrentAccount } from '@iota/dapp-kit'; -import { IotaObjectData } from '@iota/iota-sdk/client'; +import { Button, ButtonHtmlType, Header, Title } from '@iota/apps-ui-kit'; +import { Loader } from '@iota/apps-ui-icons'; interface SendViewProps { - asset: IotaObjectData; + objectId: string; + senderAddress: string; onClose: () => void; onBack: () => void; } -export function SendView({ asset, onClose, onBack }: SendViewProps) { +export function SendView({ objectId, senderAddress, onClose, onBack }: SendViewProps) { const { isValid, dirty, isSubmitting, submitForm } = useFormikContext(); - - const account = useCurrentAccount(); - - const senderAddress = account?.address ?? ''; - const objectId = asset?.objectId || ''; - const { nftName, nftImageUrl } = useNftDetails(objectId, senderAddress); + return ( <> <Header title="Send asset" onClose={onClose} titleCentered onBack={onBack} /> <DialogLayoutBody> <div className="flex w-full flex-col items-center justify-center gap-xs"> <div className="w-[172px]"> - <VisualAssetCard - assetSrc={nftImageUrl} - assetTitle={nftName} - assetType={VisualAssetType.Image} - altText={nftName || 'NFT'} - isHoverable={false} - /> + <NftImage src={nftImageUrl} title={nftName || 'NFT'} isHoverable={false} /> </div> <div className="flex w-full flex-col gap-md"> <div className="flex flex-col items-center gap-xxxs"> diff --git a/apps/wallet-dashboard/components/Dialogs/Assets/views/index.ts b/apps/wallet-dashboard/components/dialogs/assets/views/index.ts similarity index 78% rename from apps/wallet-dashboard/components/Dialogs/Assets/views/index.ts rename to apps/wallet-dashboard/components/dialogs/assets/views/index.ts index fcc3856cac3..20ad446cf93 100644 --- a/apps/wallet-dashboard/components/Dialogs/Assets/views/index.ts +++ b/apps/wallet-dashboard/components/dialogs/assets/views/index.ts @@ -3,3 +3,4 @@ export * from './DetailsView'; export * from './SendView'; +export * from './KioskDetailsView'; diff --git a/apps/wallet-dashboard/components/Dialogs/index.ts b/apps/wallet-dashboard/components/dialogs/index.ts similarity index 68% rename from apps/wallet-dashboard/components/Dialogs/index.ts rename to apps/wallet-dashboard/components/dialogs/index.ts index db380d17927..88c9e90c332 100644 --- a/apps/wallet-dashboard/components/Dialogs/index.ts +++ b/apps/wallet-dashboard/components/dialogs/index.ts @@ -1,10 +1,10 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -export * from './SendToken'; +export * from './send-token'; export * from './ReceiveFundsDialog'; -export * from './Staking'; +export * from './staking'; export * from './unstake'; export * from './vesting'; export * from './settings'; -export * from './MigrationDialog'; +export * from './migration'; diff --git a/apps/wallet-dashboard/components/Dialogs/layout/DialogLayout.tsx b/apps/wallet-dashboard/components/dialogs/layout/DialogLayout.tsx similarity index 100% rename from apps/wallet-dashboard/components/Dialogs/layout/DialogLayout.tsx rename to apps/wallet-dashboard/components/dialogs/layout/DialogLayout.tsx diff --git a/apps/wallet-dashboard/components/Dialogs/layout/index.ts b/apps/wallet-dashboard/components/dialogs/layout/index.ts similarity index 100% rename from apps/wallet-dashboard/components/Dialogs/layout/index.ts rename to apps/wallet-dashboard/components/dialogs/layout/index.ts diff --git a/apps/wallet-dashboard/components/dialogs/migration/MigrationDialog.tsx b/apps/wallet-dashboard/components/dialogs/migration/MigrationDialog.tsx new file mode 100644 index 00000000000..e3e9cd19541 --- /dev/null +++ b/apps/wallet-dashboard/components/dialogs/migration/MigrationDialog.tsx @@ -0,0 +1,88 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +import { useState } from 'react'; +import { useCurrentAccount, useSignAndExecuteTransaction } from '@iota/dapp-kit'; +import { IotaObjectData } from '@iota/iota-sdk/client'; +import { useMigrationTransaction } from '@/hooks/useMigrationTransaction'; +import { Dialog } from '@iota/apps-ui-kit'; +import toast from 'react-hot-toast'; +import { TransactionDialogView } from '../TransactionDialog'; +import { MigrationDialogView } from './enums'; +import { ConfirmMigrationView } from './views'; + +interface MigrationDialogProps { + handleClose: () => void; + basicOutputObjects: IotaObjectData[] | undefined; + nftOutputObjects: IotaObjectData[] | undefined; + onSuccess: (digest: string) => void; + setOpen: (bool: boolean) => void; + open: boolean; + isTimelocked: boolean; +} + +export function MigrationDialog({ + handleClose, + basicOutputObjects = [], + nftOutputObjects = [], + onSuccess, + open, + setOpen, + isTimelocked, +}: MigrationDialogProps): JSX.Element { + const account = useCurrentAccount(); + const [txDigest, setTxDigest] = useState<string>(''); + const [view, setView] = useState<MigrationDialogView>(MigrationDialogView.Confirmation); + + const { + data: migrateData, + isPending: isMigrationPending, + isError: isMigrationError, + } = useMigrationTransaction(account?.address || '', basicOutputObjects, nftOutputObjects); + + const { mutateAsync: signAndExecuteTransaction, isPending: isSendingTransaction } = + useSignAndExecuteTransaction(); + + async function handleMigrate(): Promise<void> { + if (!migrateData) return; + signAndExecuteTransaction( + { + transaction: migrateData.transaction, + }, + { + onSuccess: (tx) => { + onSuccess(tx.digest); + setTxDigest(tx.digest); + setView(MigrationDialogView.TransactionDetails); + }, + }, + ) + .then(() => { + toast.success('Migration transaction has been sent'); + }) + .catch(() => { + toast.error('Migration transaction was not sent'); + }); + } + + return ( + <Dialog open={open} onOpenChange={setOpen}> + {view === MigrationDialogView.Confirmation && ( + <ConfirmMigrationView + basicOutputObjects={basicOutputObjects} + nftOutputObjects={nftOutputObjects} + onSuccess={handleMigrate} + setOpen={setOpen} + groupByTimelockUC={isTimelocked} + migrateData={migrateData} + isMigrationPending={isMigrationPending} + isMigrationError={isMigrationError} + isSendingTransaction={isSendingTransaction} + /> + )} + {view === MigrationDialogView.TransactionDetails && ( + <TransactionDialogView txDigest={txDigest} onClose={handleClose} /> + )} + </Dialog> + ); +} diff --git a/apps/wallet-dashboard/components/Dialogs/Staking/enums/index.ts b/apps/wallet-dashboard/components/dialogs/migration/enums/index.ts similarity index 100% rename from apps/wallet-dashboard/components/Dialogs/Staking/enums/index.ts rename to apps/wallet-dashboard/components/dialogs/migration/enums/index.ts diff --git a/apps/wallet-dashboard/components/dialogs/migration/enums/view.enums.ts b/apps/wallet-dashboard/components/dialogs/migration/enums/view.enums.ts new file mode 100644 index 00000000000..5b16d31b836 --- /dev/null +++ b/apps/wallet-dashboard/components/dialogs/migration/enums/view.enums.ts @@ -0,0 +1,7 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +export enum MigrationDialogView { + Confirmation = 'Confirmation', + TransactionDetails = 'TransactionDetails', +} diff --git a/apps/wallet-dashboard/components/dialogs/migration/index.ts b/apps/wallet-dashboard/components/dialogs/migration/index.ts new file mode 100644 index 00000000000..41dd3ff2b30 --- /dev/null +++ b/apps/wallet-dashboard/components/dialogs/migration/index.ts @@ -0,0 +1,6 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +export * from './MigrationDialog'; + +export * from './views'; diff --git a/apps/wallet-dashboard/components/dialogs/migration/views/ConfirmMigrationView.tsx b/apps/wallet-dashboard/components/dialogs/migration/views/ConfirmMigrationView.tsx new file mode 100644 index 00000000000..6e95aa85d46 --- /dev/null +++ b/apps/wallet-dashboard/components/dialogs/migration/views/ConfirmMigrationView.tsx @@ -0,0 +1,215 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +import { MigrationObjectLoading, VirtualList, MigrationObjectDetailsCard } from '@/components'; +import { useCurrentAccount } from '@iota/dapp-kit'; +import { IotaObjectData } from '@iota/iota-sdk/client'; +import { + Button, + Header, + InfoBox, + InfoBoxStyle, + InfoBoxType, + KeyValueInfo, + Panel, + Skeleton, + Title, + TitleSize, +} from '@iota/apps-ui-kit'; +import { useGroupedStardustObjects } from '@/hooks'; +import { Loader, Warning } from '@iota/apps-ui-icons'; +import { Collapsible, useFormatCoin } from '@iota/core'; +import { IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; +import { getStardustObjectsTotals, filterMigrationObjects } from '@/lib/utils'; +import { DialogLayout, DialogLayoutBody, DialogLayoutFooter } from '../../layout'; +import { Transaction } from '@iota/iota-sdk/transactions'; +import { StardustOutputDetailsFilter } from '@/lib/enums'; + +interface ConfirmMigrationViewProps { + basicOutputObjects: IotaObjectData[] | undefined; + nftOutputObjects: IotaObjectData[] | undefined; + onSuccess: () => void; + setOpen: (bool: boolean) => void; + groupByTimelockUC: boolean; + migrateData: + | { + transaction: Transaction; + gasBudget: string | number | null; + } + | undefined; + isMigrationPending: boolean; + isMigrationError: boolean; + isSendingTransaction: boolean; +} + +export function ConfirmMigrationView({ + basicOutputObjects = [], + nftOutputObjects = [], + onSuccess, + setOpen, + groupByTimelockUC, + migrateData, + isMigrationPending, + isMigrationError, + isSendingTransaction, +}: ConfirmMigrationViewProps): JSX.Element { + const account = useCurrentAccount(); + + const { + data: resolvedObjects = [], + isLoading, + error: isGroupedMigrationError, + } = useGroupedStardustObjects([...basicOutputObjects, ...nftOutputObjects], groupByTimelockUC); + + const { + totalIotaAmount, + totalNativeTokens: migratableNativeTokens, + totalVisualAssets: migratableVisualAssets, + totalNotOwnedStorageDepositReturnAmount, + } = getStardustObjectsTotals({ + basicOutputs: basicOutputObjects, + nftOutputs: nftOutputObjects, + address: account?.address || '', + resolvedObjects: resolvedObjects, + }); + + const [timelockedIotaTokens, symbol] = useFormatCoin(totalIotaAmount, IOTA_TYPE_ARG); + const [gasFee, gasFeeSymbol] = useFormatCoin(migrateData?.gasBudget, IOTA_TYPE_ARG); + const [totalStorageDepositReturnAmountFormatted, totalStorageDepositReturnAmountSymbol] = + useFormatCoin(totalNotOwnedStorageDepositReturnAmount.toString(), IOTA_TYPE_ARG); + + const filteredIotaObjects = filterMigrationObjects( + resolvedObjects, + StardustOutputDetailsFilter.IOTA, + ); + const filteredNativeTokens = filterMigrationObjects( + resolvedObjects, + StardustOutputDetailsFilter.NativeTokens, + ); + const filteredVisualAssets = filterMigrationObjects( + resolvedObjects, + StardustOutputDetailsFilter.VisualAssets, + ); + + const assetsToMigrateCategories = [ + { + title: 'IOTA Tokens', + subtitle: `${timelockedIotaTokens} ${symbol}`, + filteredObjects: filteredIotaObjects, + }, + { + title: 'Native Tokens', + subtitle: `${migratableNativeTokens} Types`, + filteredObjects: filteredNativeTokens, + }, + { + title: 'Visual Assets', + subtitle: `${migratableVisualAssets} Assets`, + filteredObjects: filteredVisualAssets, + }, + ]; + const filteredAssetsToMigrateCategories = assetsToMigrateCategories.filter( + ({ filteredObjects }) => filteredObjects.length > 0, + ); + return ( + <DialogLayout> + <Header title="Migrate Your Assets" onClose={() => setOpen(false)} titleCentered /> + <DialogLayoutBody> + <div className="flex h-full flex-col gap-y-md"> + {isGroupedMigrationError && !isLoading && ( + <InfoBox + title="Error" + supportingText="Failed to load migration objects" + style={InfoBoxStyle.Elevated} + type={InfoBoxType.Error} + icon={<Warning />} + /> + )} + {isLoading ? ( + <> + <Panel hasBorder> + <div className="flex flex-col gap-y-sm p-md"> + <Skeleton widthClass="w-40" heightClass="h-3.5" /> + <MigrationObjectLoading /> + </div> + </Panel> + <Panel hasBorder> + <div className="flex flex-col gap-y-md p-md"> + <Skeleton widthClass="w-full" heightClass="h-3.5" /> + <Skeleton widthClass="w-full" heightClass="h-3.5" /> + </div> + </Panel> + </> + ) : ( + <> + <div className="flex flex-col gap-y-sm"> + {filteredAssetsToMigrateCategories.map( + ({ title, subtitle, filteredObjects }) => ( + <Collapsible + key={title} + render={() => ( + <Title + size={TitleSize.Small} + title={title} + subtitle={subtitle} + /> + )} + > + <div className="flex h-full max-h-[300px] flex-col gap-y-sm pb-sm"> + <VirtualList + heightClassName="h-full" + overflowClassName="overflow-y-auto" + items={filteredObjects} + estimateSize={() => 58} + render={(migrationObject) => ( + <MigrationObjectDetailsCard + migrationObject={migrationObject} + isTimelocked={groupByTimelockUC} + /> + )} + /> + </div> + </Collapsible> + ), + )} + </div> + <Panel hasBorder> + <div className="flex flex-col gap-y-sm p-md"> + <KeyValueInfo + keyText="Legacy storage deposit" + value={totalStorageDepositReturnAmountFormatted || '-'} + supportingLabel={totalStorageDepositReturnAmountSymbol} + fullwidth + /> + <KeyValueInfo + keyText="Gas Fees" + value={gasFee || '-'} + supportingLabel={gasFeeSymbol} + fullwidth + /> + </div> + </Panel> + </> + )} + </div> + </DialogLayoutBody> + <DialogLayoutFooter> + <Button + text="Migrate" + disabled={isMigrationPending || isMigrationError || isSendingTransaction} + onClick={onSuccess} + icon={ + isMigrationPending || isSendingTransaction ? ( + <Loader + className="h-4 w-4 animate-spin" + data-testid="loading-indicator" + /> + ) : null + } + iconAfterText + fullWidth + /> + </DialogLayoutFooter> + </DialogLayout> + ); +} diff --git a/apps/wallet-dashboard/components/dialogs/migration/views/index.ts b/apps/wallet-dashboard/components/dialogs/migration/views/index.ts new file mode 100644 index 00000000000..b5a03528f1e --- /dev/null +++ b/apps/wallet-dashboard/components/dialogs/migration/views/index.ts @@ -0,0 +1,4 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +export * from './ConfirmMigrationView'; diff --git a/apps/wallet-dashboard/components/Dialogs/SendToken/SendTokenDialog.tsx b/apps/wallet-dashboard/components/dialogs/send-token/SendTokenDialog.tsx similarity index 89% rename from apps/wallet-dashboard/components/Dialogs/SendToken/SendTokenDialog.tsx rename to apps/wallet-dashboard/components/dialogs/send-token/SendTokenDialog.tsx index a33f018a09c..217540c0fa6 100644 --- a/apps/wallet-dashboard/components/Dialogs/SendToken/SendTokenDialog.tsx +++ b/apps/wallet-dashboard/components/dialogs/send-token/SendTokenDialog.tsx @@ -1,17 +1,18 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import React, { useState } from 'react'; +import { useState } from 'react'; import { EnterValuesFormView, ReviewValuesFormView, TransactionDetailsView } from './views'; import { CoinBalance } from '@iota/iota-sdk/client'; -import { useSendCoinTransaction, useNotifications } from '@/hooks'; -import { NotificationType } from '@/stores/notificationStore'; +import { useSendCoinTransaction } from '@/hooks'; import { CoinFormat, useFormatCoin, useGetAllCoins } from '@iota/core'; import { Dialog, DialogContent, DialogPosition } from '@iota/apps-ui-kit'; import { FormDataValues } from './interfaces'; 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 { useQueryClient } from '@tanstack/react-query'; interface SendCoinDialogProps { coin: CoinBalance; @@ -36,8 +37,8 @@ function SendTokenDialogBody({ const [formData, setFormData] = useState<FormDataValues>(INITIAL_VALUES); const [fullAmount] = useFormatCoin(formData.amount, selectedCoin.coinType, CoinFormat.FULL); const { data: coinsData } = useGetAllCoins(selectedCoin.coinType, activeAddress); + const queryClient = useQueryClient(); - const { addNotification } = useNotifications(); const isPayAllIota = selectedCoin.totalBalance === formData.amount && selectedCoin.coinType === IOTA_TYPE_ARG; @@ -58,18 +59,20 @@ function SendTokenDialogBody({ async function handleTransfer() { if (!transaction) { - addNotification('There was an error with the transaction', NotificationType.Error); + toast.error('There was an error with the transaction'); return; } transfer(transaction, { onSuccess: () => { + queryClient.invalidateQueries({ queryKey: [activeAddress] }); + setStep(FormStep.TransactionDetails); - addNotification('Transfer transaction has been sent', NotificationType.Success); + toast.success('Transfer transaction has been sent'); }, onError: () => { setOpen(false); - addNotification('Transfer transaction failed', NotificationType.Error); + toast.error('Transfer transaction failed'); }, }); } diff --git a/apps/wallet-dashboard/components/Dialogs/SendToken/constants/index.ts b/apps/wallet-dashboard/components/dialogs/send-token/constants/index.ts similarity index 100% rename from apps/wallet-dashboard/components/Dialogs/SendToken/constants/index.ts rename to apps/wallet-dashboard/components/dialogs/send-token/constants/index.ts diff --git a/apps/wallet-dashboard/components/Dialogs/SendToken/index.ts b/apps/wallet-dashboard/components/dialogs/send-token/index.ts similarity index 100% rename from apps/wallet-dashboard/components/Dialogs/SendToken/index.ts rename to apps/wallet-dashboard/components/dialogs/send-token/index.ts diff --git a/apps/wallet-dashboard/components/Dialogs/SendToken/interfaces/index.ts b/apps/wallet-dashboard/components/dialogs/send-token/interfaces/index.ts similarity index 100% rename from apps/wallet-dashboard/components/Dialogs/SendToken/interfaces/index.ts rename to apps/wallet-dashboard/components/dialogs/send-token/interfaces/index.ts diff --git a/apps/wallet-dashboard/components/Dialogs/SendToken/views/EnterValuesFormView.tsx b/apps/wallet-dashboard/components/dialogs/send-token/views/EnterValuesFormView.tsx similarity index 99% rename from apps/wallet-dashboard/components/Dialogs/SendToken/views/EnterValuesFormView.tsx rename to apps/wallet-dashboard/components/dialogs/send-token/views/EnterValuesFormView.tsx index f33ddbc8fef..93c3b3711d5 100644 --- a/apps/wallet-dashboard/components/Dialogs/SendToken/views/EnterValuesFormView.tsx +++ b/apps/wallet-dashboard/components/dialogs/send-token/views/EnterValuesFormView.tsx @@ -29,7 +29,7 @@ import { import { useIotaClientQuery } from '@iota/dapp-kit'; import { IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; import { Form, FormikProvider, useFormik, useFormikContext } from 'formik'; -import { Exclamation } from '@iota/ui-icons'; +import { Exclamation } from '@iota/apps-ui-icons'; import { UseQueryResult } from '@tanstack/react-query'; import { FormDataValues } from '../interfaces'; import { INITIAL_VALUES } from '../constants'; diff --git a/apps/wallet-dashboard/components/Dialogs/SendToken/views/ReviewValuesFormView.tsx b/apps/wallet-dashboard/components/dialogs/send-token/views/ReviewValuesFormView.tsx similarity index 98% rename from apps/wallet-dashboard/components/Dialogs/SendToken/views/ReviewValuesFormView.tsx rename to apps/wallet-dashboard/components/dialogs/send-token/views/ReviewValuesFormView.tsx index d4d82d1ccad..874a078cd82 100644 --- a/apps/wallet-dashboard/components/Dialogs/SendToken/views/ReviewValuesFormView.tsx +++ b/apps/wallet-dashboard/components/dialogs/send-token/views/ReviewValuesFormView.tsx @@ -20,7 +20,7 @@ import { } from '@iota/apps-ui-kit'; import { formatAddress, IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; import { CoinIcon, ImageIconSize, useFormatCoin, ExplorerLinkType, CoinFormat } from '@iota/core'; -import { Loader } from '@iota/ui-icons'; +import { Loader } from '@iota/apps-ui-icons'; import { ExplorerLink } from '@/components'; import { DialogLayoutBody, DialogLayoutFooter } from '../../layout'; diff --git a/apps/wallet-dashboard/components/Dialogs/SendToken/views/TransactionDetailsView.tsx b/apps/wallet-dashboard/components/dialogs/send-token/views/TransactionDetailsView.tsx similarity index 96% rename from apps/wallet-dashboard/components/Dialogs/SendToken/views/TransactionDetailsView.tsx rename to apps/wallet-dashboard/components/dialogs/send-token/views/TransactionDetailsView.tsx index f534f72e387..430bb921c00 100644 --- a/apps/wallet-dashboard/components/Dialogs/SendToken/views/TransactionDetailsView.tsx +++ b/apps/wallet-dashboard/components/dialogs/send-token/views/TransactionDetailsView.tsx @@ -3,7 +3,7 @@ import { useGetTransaction } from '@iota/core'; import { InfoBoxType, InfoBox, InfoBoxStyle } from '@iota/apps-ui-kit'; -import { Warning, Loader } from '@iota/ui-icons'; +import { Warning, Loader } from '@iota/apps-ui-icons'; import { getExtendedTransaction } from '@/lib/utils'; import { useCurrentAccount } from '@iota/dapp-kit'; import { TransactionDetailsLayout } from '../../transaction'; diff --git a/apps/wallet-dashboard/components/Dialogs/SendToken/views/index.ts b/apps/wallet-dashboard/components/dialogs/send-token/views/index.ts similarity index 100% rename from apps/wallet-dashboard/components/Dialogs/SendToken/views/index.ts rename to apps/wallet-dashboard/components/dialogs/send-token/views/index.ts diff --git a/apps/wallet-dashboard/components/Dialogs/settings/SettingsDialog.tsx b/apps/wallet-dashboard/components/dialogs/settings/SettingsDialog.tsx similarity index 97% rename from apps/wallet-dashboard/components/Dialogs/settings/SettingsDialog.tsx rename to apps/wallet-dashboard/components/dialogs/settings/SettingsDialog.tsx index 447c3e3a4e9..75c40efaf9d 100644 --- a/apps/wallet-dashboard/components/Dialogs/settings/SettingsDialog.tsx +++ b/apps/wallet-dashboard/components/dialogs/settings/SettingsDialog.tsx @@ -1,7 +1,6 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import React from 'react'; import { Dialog } from '@iota/apps-ui-kit'; import { SettingsDialogView } from './enums'; import { SettingsListView, NetworkSelectorView } from './views'; diff --git a/apps/wallet-dashboard/components/Dialogs/settings/enums/index.ts b/apps/wallet-dashboard/components/dialogs/settings/enums/index.ts similarity index 100% rename from apps/wallet-dashboard/components/Dialogs/settings/enums/index.ts rename to apps/wallet-dashboard/components/dialogs/settings/enums/index.ts diff --git a/apps/wallet-dashboard/components/Dialogs/settings/enums/view.enums.ts b/apps/wallet-dashboard/components/dialogs/settings/enums/view.enums.ts similarity index 100% rename from apps/wallet-dashboard/components/Dialogs/settings/enums/view.enums.ts rename to apps/wallet-dashboard/components/dialogs/settings/enums/view.enums.ts diff --git a/apps/wallet-dashboard/components/Dialogs/settings/hooks/index.ts b/apps/wallet-dashboard/components/dialogs/settings/hooks/index.ts similarity index 100% rename from apps/wallet-dashboard/components/Dialogs/settings/hooks/index.ts rename to apps/wallet-dashboard/components/dialogs/settings/hooks/index.ts diff --git a/apps/wallet-dashboard/components/Dialogs/settings/hooks/useSettingsDialog.ts b/apps/wallet-dashboard/components/dialogs/settings/hooks/useSettingsDialog.ts similarity index 100% rename from apps/wallet-dashboard/components/Dialogs/settings/hooks/useSettingsDialog.ts rename to apps/wallet-dashboard/components/dialogs/settings/hooks/useSettingsDialog.ts diff --git a/apps/wallet-dashboard/components/Dialogs/settings/index.ts b/apps/wallet-dashboard/components/dialogs/settings/index.ts similarity index 100% rename from apps/wallet-dashboard/components/Dialogs/settings/index.ts rename to apps/wallet-dashboard/components/dialogs/settings/index.ts diff --git a/apps/wallet-dashboard/components/Dialogs/settings/views/NetworkSelectorView.tsx b/apps/wallet-dashboard/components/dialogs/settings/views/NetworkSelectorView.tsx similarity index 75% rename from apps/wallet-dashboard/components/Dialogs/settings/views/NetworkSelectorView.tsx rename to apps/wallet-dashboard/components/dialogs/settings/views/NetworkSelectorView.tsx index 9eb2d3a80d4..f3336f8fb01 100644 --- a/apps/wallet-dashboard/components/Dialogs/settings/views/NetworkSelectorView.tsx +++ b/apps/wallet-dashboard/components/dialogs/settings/views/NetworkSelectorView.tsx @@ -1,12 +1,11 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import React from 'react'; import { Header, RadioButton } from '@iota/apps-ui-kit'; import { DialogLayout, DialogLayoutBody } from '../../layout'; import { NetworkConfiguration } from '@iota/iota-sdk/client'; import { useIotaClientContext } from '@iota/dapp-kit'; -import toast from 'react-hot-toast'; +import { usePersistedNetwork } from '@/hooks'; interface NetworkSelectorViewProps { handleClose: () => void; @@ -18,17 +17,10 @@ export function NetworkSelectorView({ onBack, }: NetworkSelectorViewProps): JSX.Element { const clientContext = useIotaClientContext(); - const activeNetwork = clientContext.network; // Dashboard doesn't support RPCs yet const networks = clientContext.networks as Record<string, NetworkConfiguration>; - async function handleNetworkChange(network: NetworkConfiguration) { - if (activeNetwork === network.id) { - return; - } - clientContext.selectNetwork(network.id); - toast.success(`Switched to ${network.name}`); - } + const { persistedNetwork, handleNetworkChange } = usePersistedNetwork(); return ( <DialogLayout> @@ -39,7 +31,7 @@ export function NetworkSelectorView({ <div className="px-md" key={network.id}> <RadioButton label={network.name} - isChecked={activeNetwork === network.id} + isChecked={persistedNetwork === network.id} onChange={() => handleNetworkChange(network)} /> </div> diff --git a/apps/wallet-dashboard/components/Dialogs/settings/views/SettingsListView.tsx b/apps/wallet-dashboard/components/dialogs/settings/views/SettingsListView.tsx similarity index 86% rename from apps/wallet-dashboard/components/Dialogs/settings/views/SettingsListView.tsx rename to apps/wallet-dashboard/components/dialogs/settings/views/SettingsListView.tsx index 7e9d484de73..0621134fe17 100644 --- a/apps/wallet-dashboard/components/Dialogs/settings/views/SettingsListView.tsx +++ b/apps/wallet-dashboard/components/dialogs/settings/views/SettingsListView.tsx @@ -1,7 +1,6 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import React from 'react'; import { Card, CardAction, @@ -14,9 +13,9 @@ import { } from '@iota/apps-ui-kit'; import { DialogLayout, DialogLayoutBody } from '../../layout'; import { SettingsDialogView } from '../enums'; -import { getNetwork } from '@iota/iota-sdk/client'; -import { useIotaClientContext } from '@iota/dapp-kit'; -import { Globe } from '@iota/ui-icons'; +import { Globe } from '@iota/apps-ui-icons'; +import { usePersistedNetwork } from '@/hooks'; +import { toTitleCase } from '@iota/core'; interface SettingsListViewProps { handleClose: () => void; @@ -24,13 +23,11 @@ interface SettingsListViewProps { } export function SettingsListView({ handleClose, setView }: SettingsListViewProps): JSX.Element { - const { network } = useIotaClientContext(); - const { name: networkName } = getNetwork(network); - + const { persistedNetwork } = usePersistedNetwork(); const MENU_ITEMS = [ { title: 'Network', - subtitle: networkName, + subtitle: toTitleCase(persistedNetwork), icon: <Globe />, onClick: () => setView(SettingsDialogView.NetworkSettings), }, diff --git a/apps/wallet-dashboard/components/Dialogs/settings/views/index.ts b/apps/wallet-dashboard/components/dialogs/settings/views/index.ts similarity index 100% rename from apps/wallet-dashboard/components/Dialogs/settings/views/index.ts rename to apps/wallet-dashboard/components/dialogs/settings/views/index.ts diff --git a/apps/wallet-dashboard/components/Dialogs/Staking/StakeDialog.tsx b/apps/wallet-dashboard/components/dialogs/staking/StakeDialog.tsx similarity index 99% rename from apps/wallet-dashboard/components/Dialogs/Staking/StakeDialog.tsx rename to apps/wallet-dashboard/components/dialogs/staking/StakeDialog.tsx index 6829097f6c3..66ded41a559 100644 --- a/apps/wallet-dashboard/components/Dialogs/Staking/StakeDialog.tsx +++ b/apps/wallet-dashboard/components/dialogs/staking/StakeDialog.tsx @@ -1,7 +1,7 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import React, { useMemo, useState } from 'react'; +import { useMemo, useState } from 'react'; import { EnterAmountView, EnterTimelockedAmountView, SelectValidatorView } from './views'; import { ExtendedDelegatedStake, diff --git a/apps/wallet-dashboard/components/dialogs/staking/enums/index.ts b/apps/wallet-dashboard/components/dialogs/staking/enums/index.ts new file mode 100644 index 00000000000..6f408e39b8c --- /dev/null +++ b/apps/wallet-dashboard/components/dialogs/staking/enums/index.ts @@ -0,0 +1,4 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +export * from './view.enums'; diff --git a/apps/wallet-dashboard/components/Dialogs/Staking/enums/view.enums.ts b/apps/wallet-dashboard/components/dialogs/staking/enums/view.enums.ts similarity index 100% rename from apps/wallet-dashboard/components/Dialogs/Staking/enums/view.enums.ts rename to apps/wallet-dashboard/components/dialogs/staking/enums/view.enums.ts diff --git a/apps/wallet-dashboard/components/Dialogs/Staking/hooks/index.ts b/apps/wallet-dashboard/components/dialogs/staking/hooks/index.ts similarity index 100% rename from apps/wallet-dashboard/components/Dialogs/Staking/hooks/index.ts rename to apps/wallet-dashboard/components/dialogs/staking/hooks/index.ts diff --git a/apps/wallet-dashboard/components/Dialogs/Staking/hooks/useStakeDialog.ts b/apps/wallet-dashboard/components/dialogs/staking/hooks/useStakeDialog.ts similarity index 100% rename from apps/wallet-dashboard/components/Dialogs/Staking/hooks/useStakeDialog.ts rename to apps/wallet-dashboard/components/dialogs/staking/hooks/useStakeDialog.ts diff --git a/apps/wallet-dashboard/components/Dialogs/Staking/index.ts b/apps/wallet-dashboard/components/dialogs/staking/index.ts similarity index 100% rename from apps/wallet-dashboard/components/Dialogs/Staking/index.ts rename to apps/wallet-dashboard/components/dialogs/staking/index.ts diff --git a/apps/wallet-dashboard/components/Dialogs/Staking/views/DetailsView.tsx b/apps/wallet-dashboard/components/dialogs/staking/views/DetailsView.tsx similarity index 88% rename from apps/wallet-dashboard/components/Dialogs/Staking/views/DetailsView.tsx rename to apps/wallet-dashboard/components/dialogs/staking/views/DetailsView.tsx index 48ebf1b4f3c..8feb22b96c8 100644 --- a/apps/wallet-dashboard/components/Dialogs/Staking/views/DetailsView.tsx +++ b/apps/wallet-dashboard/components/dialogs/staking/views/DetailsView.tsx @@ -1,7 +1,6 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import React from 'react'; import { ExtendedDelegatedStake, ImageIcon, @@ -23,14 +22,11 @@ import { Badge, BadgeType, Divider, - InfoBox, - InfoBoxStyle, - InfoBoxType, LoadingIndicator, } from '@iota/apps-ui-kit'; -import { Warning } from '@iota/ui-icons'; import { formatAddress, IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; import { DialogLayout, DialogLayoutFooter, DialogLayoutBody } from '../../layout'; +import toast from 'react-hot-toast'; interface StakeDialogProps { handleClose: () => void; @@ -66,7 +62,7 @@ export function DetailsView({ const [iotaEarnedFormatted, iotaEarnedSymbol] = useFormatCoin(iotaEarned, IOTA_TYPE_ARG); const [totalStakeFormatted, totalStakeSymbol] = useFormatCoin(totalStake, IOTA_TYPE_ARG); - const validatorName = validatorSummary?.name || ''; + const validatorName = validatorSummary?.name || '--'; const subtitle = showActiveStatus ? ( <div className="flex items-center gap-1"> @@ -87,17 +83,7 @@ export function DetailsView({ } if (errorValidators) { - return ( - <div className="mb-2 flex h-full w-full items-center justify-center p-2"> - <InfoBox - title="Something went wrong" - supportingText={'An error occurred'} - style={InfoBoxStyle.Default} - type={InfoBoxType.Error} - icon={<Warning />} - /> - </div> - ); + toast.error('An error occurred fetching validator information'); } return ( @@ -138,7 +124,7 @@ export function DetailsView({ /> <KeyValueInfo keyText="Commission" - value={`${commission.toString()}%`} + value={`${commission ? commission.toString() : '--'}%`} fullwidth /> </div> diff --git a/apps/wallet-dashboard/components/Dialogs/Staking/views/EnterAmountDialogLayout.tsx b/apps/wallet-dashboard/components/dialogs/staking/views/EnterAmountDialogLayout.tsx similarity index 95% rename from apps/wallet-dashboard/components/Dialogs/Staking/views/EnterAmountDialogLayout.tsx rename to apps/wallet-dashboard/components/dialogs/staking/views/EnterAmountDialogLayout.tsx index 9ec233b1838..dc59e18ac07 100644 --- a/apps/wallet-dashboard/components/Dialogs/Staking/views/EnterAmountDialogLayout.tsx +++ b/apps/wallet-dashboard/components/dialogs/staking/views/EnterAmountDialogLayout.tsx @@ -1,8 +1,7 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import React from 'react'; -import { useFormatCoin, useStakeTxnInfo } from '@iota/core'; +import { useFormatCoin, useStakeTxnInfo, Validator } from '@iota/core'; import { IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; import { Button, @@ -18,14 +17,12 @@ import { InfoBox, } from '@iota/apps-ui-kit'; import { Field, type FieldProps, useFormikContext } from 'formik'; -import { Exclamation, Loader } from '@iota/ui-icons'; +import { Exclamation, Loader } from '@iota/apps-ui-icons'; import { useIotaClientQuery } from '@iota/dapp-kit'; - -import { Validator } from './Validator'; import { StakedInfo } from './StakedInfo'; import { DialogLayout, DialogLayoutBody, DialogLayoutFooter } from '../../layout'; -export interface FormValues { +interface FormValues { amount: string; } @@ -43,7 +40,7 @@ interface EnterAmountDialogLayoutProps { gasBudget?: string | number | null; } -function EnterAmountDialogLayout({ +export function EnterAmountDialogLayout({ selectedValidator, gasBudget, senderAddress, @@ -73,7 +70,7 @@ function EnterAmountDialogLayout({ <div className="flex w-full flex-col justify-between"> <div> <div className="mb-md"> - <Validator address={selectedValidator} isSelected showAction={false} /> + <Validator address={selectedValidator} isSelected showApy={false} /> </div> <StakedInfo validatorAddress={selectedValidator} @@ -162,5 +159,3 @@ function EnterAmountDialogLayout({ </DialogLayout> ); } - -export default EnterAmountDialogLayout; diff --git a/apps/wallet-dashboard/components/Dialogs/Staking/views/EnterAmountView.tsx b/apps/wallet-dashboard/components/dialogs/staking/views/EnterAmountView.tsx similarity index 83% rename from apps/wallet-dashboard/components/Dialogs/Staking/views/EnterAmountView.tsx rename to apps/wallet-dashboard/components/dialogs/staking/views/EnterAmountView.tsx index b90de664794..297ecba4e17 100644 --- a/apps/wallet-dashboard/components/Dialogs/Staking/views/EnterAmountView.tsx +++ b/apps/wallet-dashboard/components/dialogs/staking/views/EnterAmountView.tsx @@ -1,14 +1,13 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import React from 'react'; import { useFormatCoin, useBalance, CoinFormat, parseAmount, useCoinMetadata } from '@iota/core'; import { IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; import { useFormikContext } from 'formik'; import { useSignAndExecuteTransaction } from '@iota/dapp-kit'; -import { useNewStakeTransaction, useNotifications } from '@/hooks'; -import { NotificationType } from '@/stores/notificationStore'; -import EnterAmountDialogLayout from './EnterAmountDialogLayout'; +import { useNewStakeTransaction } from '@/hooks'; +import { EnterAmountDialogLayout } from './EnterAmountDialogLayout'; +import toast from 'react-hot-toast'; export interface FormValues { amount: string; @@ -24,7 +23,7 @@ interface EnterAmountViewProps { onSuccess: (digest: string) => void; } -function EnterAmountView({ +export function EnterAmountView({ selectedValidator, onBack, handleClose, @@ -32,7 +31,6 @@ function EnterAmountView({ senderAddress, onSuccess, }: EnterAmountViewProps): JSX.Element { - const { addNotification } = useNotifications(); const { mutateAsync: signAndExecuteTransaction } = useSignAndExecuteTransaction(); const { values, resetForm } = useFormikContext<FormValues>(); @@ -65,7 +63,7 @@ function EnterAmountView({ function handleStake(): void { if (!newStakeData?.transaction) { - addNotification('Stake transaction was not created', NotificationType.Error); + toast.error('Stake transaction was not created'); return; } signAndExecuteTransaction( @@ -75,11 +73,11 @@ function EnterAmountView({ { onSuccess: (tx) => { onSuccess(tx.digest); - addNotification('Stake transaction has been sent'); + toast.success('Stake transaction has been sent'); resetForm(); }, onError: () => { - addNotification('Stake transaction was not sent', NotificationType.Error); + toast.error('Stake transaction was not sent'); }, }, ); @@ -100,5 +98,3 @@ function EnterAmountView({ /> ); } - -export default EnterAmountView; diff --git a/apps/wallet-dashboard/components/Dialogs/Staking/views/EnterTimelockedAmountView.tsx b/apps/wallet-dashboard/components/dialogs/staking/views/EnterTimelockedAmountView.tsx similarity index 81% rename from apps/wallet-dashboard/components/Dialogs/Staking/views/EnterTimelockedAmountView.tsx rename to apps/wallet-dashboard/components/dialogs/staking/views/EnterTimelockedAmountView.tsx index b21a6ad3bd1..9ef12ac726d 100644 --- a/apps/wallet-dashboard/components/Dialogs/Staking/views/EnterTimelockedAmountView.tsx +++ b/apps/wallet-dashboard/components/dialogs/staking/views/EnterTimelockedAmountView.tsx @@ -1,7 +1,7 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import React, { useEffect, useState } from 'react'; +import { useEffect, useState } from 'react'; import { useFormatCoin, CoinFormat, @@ -12,16 +12,12 @@ import { import { IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; import { useFormikContext } from 'formik'; import { useSignAndExecuteTransaction } from '@iota/dapp-kit'; -import { - useGetCurrentEpochStartTimestamp, - useNewStakeTimelockedTransaction, - useNotifications, -} from '@/hooks'; -import { NotificationType } from '@/stores/notificationStore'; +import { useGetCurrentEpochStartTimestamp, useNewStakeTimelockedTransaction } from '@/hooks'; import { prepareObjectsForTimelockedStakingTransaction } from '@/lib/utils'; -import EnterAmountDialogLayout from './EnterAmountDialogLayout'; +import { EnterAmountDialogLayout } from './EnterAmountDialogLayout'; +import toast from 'react-hot-toast'; -export interface FormValues { +interface FormValues { amount: string; } @@ -35,7 +31,7 @@ interface EnterTimelockedAmountViewProps { onSuccess: (digest: string) => void; } -function EnterTimelockedAmountView({ +export function EnterTimelockedAmountView({ selectedValidator, maxStakableTimelockedAmount, amountWithoutDecimals, @@ -44,7 +40,6 @@ function EnterTimelockedAmountView({ handleClose, onSuccess, }: EnterTimelockedAmountViewProps): JSX.Element { - const { addNotification } = useNotifications(); const { mutateAsync: signAndExecuteTransaction } = useSignAndExecuteTransaction(); const { resetForm } = useFormikContext<FormValues>(); @@ -84,11 +79,11 @@ function EnterTimelockedAmountView({ function handleStake(): void { if (groupedTimelockObjects.length === 0) { - addNotification('Invalid stake amount. Please try again.', NotificationType.Error); + toast.error('Invalid stake amount. Please try again.'); return; } if (!newStakeData?.transaction) { - addNotification('Stake transaction was not created', NotificationType.Error); + toast.error('Stake transaction was not created'); return; } signAndExecuteTransaction( @@ -98,11 +93,11 @@ function EnterTimelockedAmountView({ { onSuccess: (tx) => { onSuccess?.(tx.digest); - addNotification('Stake transaction has been sent'); + toast.success('Stake transaction has been sent'); resetForm(); }, onError: () => { - addNotification('Stake transaction was not sent', NotificationType.Error); + toast.error('Stake transaction was not sent'); }, }, ); @@ -124,5 +119,3 @@ function EnterTimelockedAmountView({ /> ); } - -export default EnterTimelockedAmountView; diff --git a/apps/wallet-dashboard/components/Dialogs/Staking/views/SelectValidatorView.tsx b/apps/wallet-dashboard/components/dialogs/staking/views/SelectValidatorView.tsx similarity index 89% rename from apps/wallet-dashboard/components/Dialogs/Staking/views/SelectValidatorView.tsx rename to apps/wallet-dashboard/components/dialogs/staking/views/SelectValidatorView.tsx index 626cbf05990..75032c10690 100644 --- a/apps/wallet-dashboard/components/Dialogs/Staking/views/SelectValidatorView.tsx +++ b/apps/wallet-dashboard/components/dialogs/staking/views/SelectValidatorView.tsx @@ -1,10 +1,8 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import React from 'react'; import { Button, Header } from '@iota/apps-ui-kit'; - -import { Validator } from './Validator'; +import { Validator } from '@iota/core'; import { DialogLayout, DialogLayoutBody, DialogLayoutFooter } from '../../layout'; interface SelectValidatorViewProps { @@ -15,7 +13,7 @@ interface SelectValidatorViewProps { handleClose: () => void; } -function SelectValidatorView({ +export function SelectValidatorView({ validators, onSelect, onNext, @@ -32,7 +30,7 @@ function SelectValidatorView({ <Validator key={validator} address={validator} - onClick={onSelect} + onClick={() => onSelect(validator)} isSelected={selectedValidator === validator} /> ))} @@ -52,5 +50,3 @@ function SelectValidatorView({ </DialogLayout> ); } - -export default SelectValidatorView; diff --git a/apps/wallet-dashboard/components/Dialogs/Staking/views/StakedInfo.tsx b/apps/wallet-dashboard/components/dialogs/staking/views/StakedInfo.tsx similarity index 100% rename from apps/wallet-dashboard/components/Dialogs/Staking/views/StakedInfo.tsx rename to apps/wallet-dashboard/components/dialogs/staking/views/StakedInfo.tsx diff --git a/apps/wallet-dashboard/components/dialogs/staking/views/index.ts b/apps/wallet-dashboard/components/dialogs/staking/views/index.ts new file mode 100644 index 00000000000..fcddce54bca --- /dev/null +++ b/apps/wallet-dashboard/components/dialogs/staking/views/index.ts @@ -0,0 +1,8 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +export * from './EnterAmountView'; +export * from './EnterTimelockedAmountView'; +export * from './EnterAmountDialogLayout'; +export * from './SelectValidatorView'; +export * from './DetailsView'; diff --git a/apps/wallet-dashboard/components/Dialogs/transaction/TransactionDetailsLayout.tsx b/apps/wallet-dashboard/components/dialogs/transaction/TransactionDetailsLayout.tsx similarity index 90% rename from apps/wallet-dashboard/components/Dialogs/transaction/TransactionDetailsLayout.tsx rename to apps/wallet-dashboard/components/dialogs/transaction/TransactionDetailsLayout.tsx index 44bc9474a6a..8b7d9cfa6a2 100644 --- a/apps/wallet-dashboard/components/Dialogs/transaction/TransactionDetailsLayout.tsx +++ b/apps/wallet-dashboard/components/dialogs/transaction/TransactionDetailsLayout.tsx @@ -1,8 +1,7 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import React from 'react'; + import { ExplorerLink } from '@/components'; -import { ExtendedTransaction } from '@/lib/interfaces'; import { Header, LoadingIndicator } from '@iota/apps-ui-kit'; import { useTransactionSummary, @@ -10,10 +9,10 @@ import { ExplorerLinkType, TransactionReceipt, useRecognizedPackages, + ExtendedTransaction, } from '@iota/core'; import { useCurrentAccount, useIotaClientContext } from '@iota/dapp-kit'; import { DialogLayoutBody, DialogLayoutFooter } from '../layout'; -import { Validator } from '../Staking/views/Validator'; import { Network } from '@iota/iota-sdk/client'; interface TransactionDialogDetailsProps { @@ -42,7 +41,6 @@ export function TransactionDetailsLayout({ transaction, onClose }: TransactionDi activeAddress={address} summary={summary} renderExplorerLink={ExplorerLink} - renderValidatorLogo={Validator} /> </DialogLayoutBody> <DialogLayoutFooter> diff --git a/apps/wallet-dashboard/components/Dialogs/transaction/index.ts b/apps/wallet-dashboard/components/dialogs/transaction/index.ts similarity index 100% rename from apps/wallet-dashboard/components/Dialogs/transaction/index.ts rename to apps/wallet-dashboard/components/dialogs/transaction/index.ts diff --git a/apps/wallet-dashboard/components/Dialogs/unstake/UnstakeDialog.tsx b/apps/wallet-dashboard/components/dialogs/unstake/UnstakeDialog.tsx similarity index 100% rename from apps/wallet-dashboard/components/Dialogs/unstake/UnstakeDialog.tsx rename to apps/wallet-dashboard/components/dialogs/unstake/UnstakeDialog.tsx diff --git a/apps/wallet-dashboard/components/Dialogs/unstake/enums/index.ts b/apps/wallet-dashboard/components/dialogs/unstake/enums/index.ts similarity index 100% rename from apps/wallet-dashboard/components/Dialogs/unstake/enums/index.ts rename to apps/wallet-dashboard/components/dialogs/unstake/enums/index.ts diff --git a/apps/wallet-dashboard/components/Dialogs/unstake/enums/views.enums.ts b/apps/wallet-dashboard/components/dialogs/unstake/enums/views.enums.ts similarity index 100% rename from apps/wallet-dashboard/components/Dialogs/unstake/enums/views.enums.ts rename to apps/wallet-dashboard/components/dialogs/unstake/enums/views.enums.ts diff --git a/apps/wallet-dashboard/components/Dialogs/unstake/hooks/index.ts b/apps/wallet-dashboard/components/dialogs/unstake/hooks/index.ts similarity index 100% rename from apps/wallet-dashboard/components/Dialogs/unstake/hooks/index.ts rename to apps/wallet-dashboard/components/dialogs/unstake/hooks/index.ts diff --git a/apps/wallet-dashboard/components/Dialogs/unstake/hooks/useUnstakeDialog.ts b/apps/wallet-dashboard/components/dialogs/unstake/hooks/useUnstakeDialog.ts similarity index 100% rename from apps/wallet-dashboard/components/Dialogs/unstake/hooks/useUnstakeDialog.ts rename to apps/wallet-dashboard/components/dialogs/unstake/hooks/useUnstakeDialog.ts diff --git a/apps/wallet-dashboard/components/Dialogs/unstake/index.ts b/apps/wallet-dashboard/components/dialogs/unstake/index.ts similarity index 100% rename from apps/wallet-dashboard/components/Dialogs/unstake/index.ts rename to apps/wallet-dashboard/components/dialogs/unstake/index.ts diff --git a/apps/wallet-dashboard/components/Dialogs/unstake/views/UnstakeTimelockedObjectsView.tsx b/apps/wallet-dashboard/components/dialogs/unstake/views/UnstakeTimelockedObjectsView.tsx similarity index 94% rename from apps/wallet-dashboard/components/Dialogs/unstake/views/UnstakeTimelockedObjectsView.tsx rename to apps/wallet-dashboard/components/dialogs/unstake/views/UnstakeTimelockedObjectsView.tsx index 45e34ee5cf0..d023d8528b2 100644 --- a/apps/wallet-dashboard/components/Dialogs/unstake/views/UnstakeTimelockedObjectsView.tsx +++ b/apps/wallet-dashboard/components/dialogs/unstake/views/UnstakeTimelockedObjectsView.tsx @@ -3,8 +3,8 @@ import { StakeRewardsPanel, ValidatorStakingData } from '@/components'; import { DialogLayout, DialogLayoutBody, DialogLayoutFooter } from '../../layout'; -import { Validator } from '../../Staking/views/Validator'; -import { useNewUnstakeTimelockedTransaction, useNotifications } from '@/hooks'; +import { Validator } from '@iota/core'; +import { useNewUnstakeTimelockedTransaction } from '@/hooks'; import { Collapsible, TimeUnit, @@ -24,7 +24,7 @@ import { } from '@iota/apps-ui-kit'; import { useCurrentAccount, useSignAndExecuteTransaction } from '@iota/dapp-kit'; import { IotaSignAndExecuteTransactionOutput } from '@iota/wallet-standard'; -import { NotificationType } from '@/stores/notificationStore'; +import toast from 'react-hot-toast'; interface UnstakeTimelockedObjectsViewProps { onClose: () => void; @@ -39,7 +39,6 @@ export function UnstakeTimelockedObjectsView({ onBack, onSuccess, }: UnstakeTimelockedObjectsViewProps) { - const { addNotification } = useNotifications(); const activeAddress = useCurrentAccount()?.address ?? ''; const { data: activeValidators } = useGetActiveValidatorsInfo(); @@ -71,7 +70,7 @@ export function UnstakeTimelockedObjectsView({ ); function handleCopySuccess() { - addNotification('Copied to clipboard'); + toast.success('Copied to clipboard'); } async function handleUnstake(): Promise<void> { @@ -83,12 +82,12 @@ export function UnstakeTimelockedObjectsView({ }, { onSuccess: (tx) => { - addNotification('Unstake transaction has been sent'); + toast.success('Unstake transaction has been sent'); onSuccess(tx); }, }, ).catch(() => { - addNotification('Unstake transaction was not sent', NotificationType.Error); + toast.error('Unstake transaction was not sent'); }); } diff --git a/apps/wallet-dashboard/components/Dialogs/unstake/views/UnstakeView.tsx b/apps/wallet-dashboard/components/dialogs/unstake/views/UnstakeView.tsx similarity index 92% rename from apps/wallet-dashboard/components/Dialogs/unstake/views/UnstakeView.tsx rename to apps/wallet-dashboard/components/dialogs/unstake/views/UnstakeView.tsx index 5d07eadcec3..41e5d3b11f4 100644 --- a/apps/wallet-dashboard/components/Dialogs/unstake/views/UnstakeView.tsx +++ b/apps/wallet-dashboard/components/dialogs/unstake/views/UnstakeView.tsx @@ -17,16 +17,17 @@ import { GAS_SYMBOL, useFormatCoin, useGetStakingValidatorDetails, + Validator, } from '@iota/core'; import { IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; import { useCurrentAccount, useSignAndExecuteTransaction } from '@iota/dapp-kit'; -import { Warning } from '@iota/ui-icons'; +import { Warning } from '@iota/apps-ui-icons'; import { StakeRewardsPanel, ValidatorStakingData } from '@/components'; import { DialogLayout, DialogLayoutFooter, DialogLayoutBody } from '../../layout'; -import { Validator } from '../../Staking/views/Validator'; -import { useNewUnstakeTransaction, useNotifications } from '@/hooks'; + +import { useNewUnstakeTransaction } from '@/hooks'; import { IotaSignAndExecuteTransactionOutput } from '@iota/wallet-standard'; -import { NotificationType } from '@/stores/notificationStore'; +import toast from 'react-hot-toast'; interface UnstakeDialogProps { extendedStake: ExtendedDelegatedStake; @@ -44,7 +45,6 @@ export function UnstakeView({ showActiveStatus, }: UnstakeDialogProps): JSX.Element { const activeAddress = useCurrentAccount()?.address ?? ''; - const { addNotification } = useNotifications(); const { data: unstakeData, isPending: isUnstakeTxPending } = useNewUnstakeTransaction( activeAddress, extendedStake.stakedIotaId, @@ -81,12 +81,12 @@ export function UnstakeView({ }, { onSuccess: (tx) => { - addNotification('Unstake transaction has been sent'); + toast.success('Unstake transaction has been sent'); onSuccess(tx); }, }, ).catch(() => { - addNotification('Unstake transaction was not sent', NotificationType.Error); + toast.error('Unstake transaction was not sent'); }); } diff --git a/apps/wallet-dashboard/components/Dialogs/unstake/views/index.ts b/apps/wallet-dashboard/components/dialogs/unstake/views/index.ts similarity index 100% rename from apps/wallet-dashboard/components/Dialogs/unstake/views/index.ts rename to apps/wallet-dashboard/components/dialogs/unstake/views/index.ts diff --git a/apps/wallet-dashboard/components/Dialogs/vesting/VestingScheduleBox.tsx b/apps/wallet-dashboard/components/dialogs/vesting/VestingScheduleBox.tsx similarity index 76% rename from apps/wallet-dashboard/components/Dialogs/vesting/VestingScheduleBox.tsx rename to apps/wallet-dashboard/components/dialogs/vesting/VestingScheduleBox.tsx index d9a93fc8d7c..5e789b3da45 100644 --- a/apps/wallet-dashboard/components/Dialogs/vesting/VestingScheduleBox.tsx +++ b/apps/wallet-dashboard/components/dialogs/vesting/VestingScheduleBox.tsx @@ -3,9 +3,9 @@ import { useGetCurrentEpochStartTimestamp } from '@/hooks'; import { DisplayStats, DisplayStatsType } from '@iota/apps-ui-kit'; -import { useFormatCoin } from '@iota/core'; +import { formatDate, useFormatCoin } from '@iota/core'; import { IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; -import { LockLocked } from '@iota/ui-icons'; +import { LockLocked } from '@iota/apps-ui-icons'; interface VestingScheduleBoxProps { amount: bigint; @@ -20,9 +20,16 @@ export function VestingScheduleBox({ const { data: currentEpochMs } = useGetCurrentEpochStartTimestamp(); const isLocked = expirationTimestampMs > Number(currentEpochMs); + const transactionDate = formatDate(Number(expirationTimestampMs), [ + 'day', + 'month', + 'year', + 'hour', + 'minute', + ]); return ( <DisplayStats - label={new Date(expirationTimestampMs).toLocaleDateString()} + label={transactionDate} value={`${formattedAmountVested} ${amountVestedSymbol}`} type={isLocked ? DisplayStatsType.Default : DisplayStatsType.Secondary} icon={isLocked && <LockLocked className="h-4 w-4" />} diff --git a/apps/wallet-dashboard/components/Dialogs/vesting/VestingScheduleDialog.tsx b/apps/wallet-dashboard/components/dialogs/vesting/VestingScheduleDialog.tsx similarity index 100% rename from apps/wallet-dashboard/components/Dialogs/vesting/VestingScheduleDialog.tsx rename to apps/wallet-dashboard/components/dialogs/vesting/VestingScheduleDialog.tsx diff --git a/apps/wallet-dashboard/components/Dialogs/vesting/index.ts b/apps/wallet-dashboard/components/dialogs/vesting/index.ts similarity index 100% rename from apps/wallet-dashboard/components/Dialogs/vesting/index.ts rename to apps/wallet-dashboard/components/dialogs/vesting/index.ts diff --git a/apps/wallet-dashboard/components/index.ts b/apps/wallet-dashboard/components/index.ts index fcccf7b3a95..0a713ba5fb6 100644 --- a/apps/wallet-dashboard/components/index.ts +++ b/apps/wallet-dashboard/components/index.ts @@ -1,25 +1,24 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -export { default as RouteLink } from './RouteLink'; -export { default as Notifications } from './Notifications/Notifications'; -export { default as Box } from './Box'; -export { default as AmountBox } from './AmountBox'; -export { default as Input } from './Input'; -export { default as VirtualList } from './VirtualList'; -export { default as ExternalImage } from './ExternalImage'; +export * from './RouteLink'; +export * from './Box'; +export * from './AmountBox'; +export * from './Input'; +export * from './VirtualList'; +export * from './ExternalImage'; export * from './PageSizeSelector'; export * from './PaginationOptions'; export * from './account-balance/AccountBalance'; export * from './coins'; -export * from './AppList'; -export * from './Cards'; -export * from './Buttons'; +export * from './app-list'; +export * from './cards'; +export * from './buttons'; export * from './transactions'; export * from './staking-overview'; export * from './ExplorerLink'; -export * from './Dialogs'; +export * from './dialogs'; export * from './ValidatorStakingData'; export * from './tiles'; export * from './migration'; @@ -29,3 +28,4 @@ export * from './StakeRewardsPanel'; export * from './MigrationOverview'; export * from './SupplyIncreaseVestingOverview'; export * from './staked-timelock-object'; +export * from './loading'; diff --git a/apps/wallet-dashboard/components/loading/Loading.tsx b/apps/wallet-dashboard/components/loading/Loading.tsx new file mode 100644 index 00000000000..cea927d254c --- /dev/null +++ b/apps/wallet-dashboard/components/loading/Loading.tsx @@ -0,0 +1,20 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +import { LoadingIndicator, type LoadingIndicatorProps } from '@iota/apps-ui-kit'; +import type { ReactNode } from 'react'; + +interface LoadingProps extends LoadingIndicatorProps { + loading: boolean; + children: ReactNode | ReactNode[]; +} + +export function Loading({ loading, children, ...indicatorProps }: LoadingProps) { + return loading ? ( + <div className="flex h-full w-full items-center justify-center"> + <LoadingIndicator {...indicatorProps} /> + </div> + ) : ( + <>{children}</> + ); +} diff --git a/apps/wallet-dashboard/components/loading/index.ts b/apps/wallet-dashboard/components/loading/index.ts new file mode 100644 index 00000000000..0c903d2dc5e --- /dev/null +++ b/apps/wallet-dashboard/components/loading/index.ts @@ -0,0 +1,4 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +export * from './Loading'; diff --git a/apps/wallet-dashboard/components/migration/MigrationObjectLoading.tsx b/apps/wallet-dashboard/components/migration/MigrationObjectLoading.tsx new file mode 100644 index 00000000000..297d1a8fa81 --- /dev/null +++ b/apps/wallet-dashboard/components/migration/MigrationObjectLoading.tsx @@ -0,0 +1,27 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +import { Card, CardImage, ImageShape, Skeleton } from '@iota/apps-ui-kit'; + +export function MigrationObjectLoading() { + return ( + <div className="flex h-full max-h-full w-full flex-col overflow-hidden"> + {new Array(10).fill(0).map((_, index) => ( + <Card key={index}> + <CardImage shape={ImageShape.SquareRounded}> + <div className="h-10 w-10 animate-pulse bg-neutral-90 dark:bg-neutral-12" /> + <Skeleton widthClass="w-10" heightClass="h-10" isRounded={false} /> + </CardImage> + <div className="flex flex-col gap-y-xs"> + <Skeleton widthClass="w-40" heightClass="h-3.5" /> + <Skeleton widthClass="w-32" heightClass="h-3" hasSecondaryColors /> + </div> + <div className="ml-auto flex flex-col gap-y-xs"> + <Skeleton widthClass="w-20" heightClass="h-3.5" /> + <Skeleton widthClass="w-16" heightClass="h-3" hasSecondaryColors /> + </div> + </Card> + ))} + </div> + ); +} diff --git a/apps/wallet-dashboard/components/migration/MigrationObjectsPanel.tsx b/apps/wallet-dashboard/components/migration/MigrationObjectsPanel.tsx index 915cc56dda5..05d28f17ae1 100644 --- a/apps/wallet-dashboard/components/migration/MigrationObjectsPanel.tsx +++ b/apps/wallet-dashboard/components/migration/MigrationObjectsPanel.tsx @@ -3,7 +3,7 @@ 'use client'; -import { useGroupedMigrationObjectsByExpirationDate } from '@/hooks'; +import { useGroupedStardustObjects } from '@/hooks'; import { STARDUST_MIGRATABLE_OBJECTS_FILTER_LIST, STARDUST_TIMELOCKED_OBJECTS_FILTER_LIST, @@ -12,24 +12,21 @@ import { StardustOutputDetailsFilter } from '@/lib/enums'; import { Button, ButtonType, - Card, - CardImage, Chip, - ImageShape, InfoBox, InfoBoxStyle, InfoBoxType, Panel, - Skeleton, Title, } from '@iota/apps-ui-kit'; import type { IotaObjectData } from '@iota/iota-sdk/client'; -import { Close, Warning } from '@iota/ui-icons'; +import { Close, Warning } from '@iota/apps-ui-icons'; import clsx from 'clsx'; import { useState } from 'react'; import { MigrationObjectDetailsCard } from './migration-object-details-card'; -import VirtualList from '../VirtualList'; +import { VirtualList } from '../VirtualList'; import { filterMigrationObjects } from '@/lib/utils'; +import { MigrationObjectLoading } from './MigrationObjectLoading'; const FILTERS = { migratable: STARDUST_MIGRATABLE_OBJECTS_FILTER_LIST, @@ -39,13 +36,13 @@ const FILTERS = { interface MigrationObjectsPanelProps { selectedObjects: IotaObjectData[]; onClose: () => void; - isTimelocked: boolean; + groupByTimelockUC: boolean; } export function MigrationObjectsPanel({ selectedObjects, onClose, - isTimelocked, + groupByTimelockUC, }: MigrationObjectsPanelProps): React.JSX.Element { const [stardustOutputDetailsFilter, setStardustOutputDetailsFilter] = useState<StardustOutputDetailsFilter>(StardustOutputDetailsFilter.All); @@ -54,11 +51,11 @@ export function MigrationObjectsPanel({ data: resolvedObjects = [], isLoading, error: isErrored, - } = useGroupedMigrationObjectsByExpirationDate(selectedObjects, isTimelocked); + } = useGroupedStardustObjects(selectedObjects, groupByTimelockUC); const filteredObjects = filterMigrationObjects(resolvedObjects, stardustOutputDetailsFilter); - const filters = isTimelocked ? FILTERS.timelocked : FILTERS.migratable; + const filters = groupByTimelockUC ? FILTERS.timelocked : FILTERS.migratable; const isHidden = selectedObjects.length === 0; return ( @@ -83,7 +80,7 @@ export function MigrationObjectsPanel({ </div> <div className="flex min-h-0 flex-col py-sm"> <div className="h-full flex-1 overflow-auto"> - {isLoading && <LoadingPanel />} + {isLoading && <MigrationObjectLoading />} {isErrored && !isLoading && ( <div className="flex h-full max-h-full w-full flex-col items-center"> <InfoBox @@ -104,7 +101,7 @@ export function MigrationObjectsPanel({ render={(migrationObject) => ( <MigrationObjectDetailsCard migrationObject={migrationObject} - isTimelocked={isTimelocked} + isTimelocked={groupByTimelockUC} /> )} /> @@ -116,26 +113,3 @@ export function MigrationObjectsPanel({ </div> ); } - -function LoadingPanel() { - return ( - <div className="flex h-full max-h-full w-full flex-col overflow-hidden"> - {new Array(10).fill(0).map((_, index) => ( - <Card key={index}> - <CardImage shape={ImageShape.SquareRounded}> - <div className="h-10 w-10 animate-pulse bg-neutral-90 dark:bg-neutral-12" /> - <Skeleton widthClass="w-10" heightClass="h-10" isRounded={false} /> - </CardImage> - <div className="flex flex-col gap-y-xs"> - <Skeleton widthClass="w-40" heightClass="h-3.5" /> - <Skeleton widthClass="w-32" heightClass="h-3" hasSecondaryColors /> - </div> - <div className="ml-auto flex flex-col gap-y-xs"> - <Skeleton widthClass="w-20" heightClass="h-3.5" /> - <Skeleton widthClass="w-16" heightClass="h-3" hasSecondaryColors /> - </div> - </Card> - ))} - </div> - ); -} diff --git a/apps/wallet-dashboard/components/migration/index.ts b/apps/wallet-dashboard/components/migration/index.ts index cf43709989c..be5fbb96d1a 100644 --- a/apps/wallet-dashboard/components/migration/index.ts +++ b/apps/wallet-dashboard/components/migration/index.ts @@ -2,3 +2,5 @@ // SPDX-License-Identifier: Apache-2.0 export * from './MigrationObjectsPanel'; +export * from './MigrationObjectLoading'; +export * from './migration-object-details-card'; diff --git a/apps/wallet-dashboard/components/migration/migration-object-details-card/MigrationObjectDetailsCard.tsx b/apps/wallet-dashboard/components/migration/migration-object-details-card/MigrationObjectDetailsCard.tsx index 599e58dbd21..424ea81df5d 100644 --- a/apps/wallet-dashboard/components/migration/migration-object-details-card/MigrationObjectDetailsCard.tsx +++ b/apps/wallet-dashboard/components/migration/migration-object-details-card/MigrationObjectDetailsCard.tsx @@ -8,9 +8,9 @@ import { MIGRATION_OBJECT_WITHOUT_UC_KEY } from '@/lib/constants'; import { CommonMigrationObjectType } from '@/lib/enums'; import { ResolvedObjectTypes } from '@/lib/types'; import { Card, CardBody, CardImage, ImageShape, LabelText, LabelTextSize } from '@iota/apps-ui-kit'; -import { MILLISECONDS_PER_SECOND, TimeUnit, useFormatCoin, useTimeAgo } from '@iota/core'; +import { MILLISECONDS_PER_SECOND, useCountdownByTimestamp, useFormatCoin } from '@iota/core'; import { IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; -import { Assets, DataStack, IotaLogoMark } from '@iota/ui-icons'; +import { Assets, DataStack, IotaLogoMark } from '@iota/apps-ui-icons'; import { useState } from 'react'; interface MigrationObjectDetailsCardProps { @@ -129,27 +129,22 @@ function UnlockConditionLabel({ groupKey, isTimelocked: isTimelocked }: UnlockCo !isLoadingEpochStart && unlockConditionTimestampMs < parseInt(epochStartMs); // TODO: https://github.com/iotaledger/iota/issues/4369 const isInAFutureEpoch = !isLoadingEpochEnd && unlockConditionTimestampMs > epochEndMs; - const outputTimestampMs = isInAFutureEpoch ? unlockConditionTimestampMs : epochEndMs; - const timeLabel = useTimeAgo({ - timeFrom: outputTimestampMs, - shortedTimeLabel: true, - shouldEnd: true, - maxTimeUnit: TimeUnit.ONE_DAY, + const formattedLastPayoutExpirationTime = useCountdownByTimestamp(Number(outputTimestampMs), { + showSeconds: false, }); - const showLabel = !isFromPreviousEpoch && outputTimestampMs > currentDateMs; return ( - <div className="ml-auto h-full whitespace-nowrap"> - {showLabel && ( + showLabel && ( + <div className="h-full w-1/4 whitespace-nowrap"> <LabelText size={LabelTextSize.Small} - text={timeLabel} + text={formattedLastPayoutExpirationTime} label={isTimelocked ? 'Unlocks in' : 'Expires in'} /> - )} - </div> + </div> + ) ); } diff --git a/apps/wallet-dashboard/components/staking-overview/StartStaking.tsx b/apps/wallet-dashboard/components/staking-overview/StartStaking.tsx index 573a254a3d2..ab99da76411 100644 --- a/apps/wallet-dashboard/components/staking-overview/StartStaking.tsx +++ b/apps/wallet-dashboard/components/staking-overview/StartStaking.tsx @@ -1,7 +1,7 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { StakeDialog, useStakeDialog } from '../Dialogs'; +import { StakeDialog, useStakeDialog } from '../dialogs'; import { Theme, useTheme } from '@iota/core'; import { Banner } from '../Banner'; diff --git a/apps/wallet-dashboard/components/tiles/AssetTileLink.tsx b/apps/wallet-dashboard/components/tiles/AssetTileLink.tsx index 64c4d805513..1c5ab567df8 100644 --- a/apps/wallet-dashboard/components/tiles/AssetTileLink.tsx +++ b/apps/wallet-dashboard/components/tiles/AssetTileLink.tsx @@ -3,29 +3,35 @@ 'use client'; -import { AssetCategory } from '@/lib/enums'; -import { VisibilityOff } from '@iota/ui-icons'; +import { isKioskOwnerToken, useKioskClient, KioskTile, AssetCategory } from '@iota/core'; +import { VisibilityOff } from '@iota/apps-ui-icons'; import { VisualAssetTile } from '.'; import { IotaObjectData } from '@iota/iota-sdk/client'; import { NonVisualAssetCard } from './NonVisualAssetTile'; +import { useCurrentAccount } from '@iota/dapp-kit'; interface AssetTileLinkProps { asset: IotaObjectData; - type: AssetCategory; + type: AssetCategory | null; onClick: (asset: IotaObjectData) => void; } export function AssetTileLink({ asset, type, onClick }: AssetTileLinkProps): React.JSX.Element { + const account = useCurrentAccount(); + const kioskClient = useKioskClient(); + const isTokenOwnedByKiosk = isKioskOwnerToken(kioskClient.network, asset); function handleClick() { onClick(asset); } return ( <> - {type === AssetCategory.Visual ? ( + {type === AssetCategory.Visual && isTokenOwnedByKiosk ? ( + <KioskTile object={asset} address={account?.address} onClick={handleClick} /> + ) : type === AssetCategory.Visual ? ( <VisualAssetTile asset={asset} icon={<VisibilityOff />} onClick={handleClick} /> ) : ( - <NonVisualAssetCard asset={asset} onClick={handleClick} /> + <NonVisualAssetCard asset={asset} /> )} </> ); diff --git a/apps/wallet-dashboard/components/tiles/NonVisualAssetTile.tsx b/apps/wallet-dashboard/components/tiles/NonVisualAssetTile.tsx index 0758714510e..d1f52415989 100644 --- a/apps/wallet-dashboard/components/tiles/NonVisualAssetTile.tsx +++ b/apps/wallet-dashboard/components/tiles/NonVisualAssetTile.tsx @@ -4,22 +4,26 @@ import { Card, CardAction, CardActionType, CardBody, CardType } from '@iota/apps-ui-kit'; import { IotaObjectData } from '@iota/iota-sdk/client'; import { formatAddress, parseStructTag } from '@iota/iota-sdk/utils'; -import { ArrowTopRight } from '@iota/ui-icons'; +import { ArrowTopRight } from '@iota/apps-ui-icons'; +import { ExplorerLink } from '../ExplorerLink'; +import { ExplorerLinkType } from '@iota/core'; type NonVisualAssetCardProps = { asset: IotaObjectData; -} & Pick<React.ComponentProps<typeof Card>, 'onClick'>; +} & React.ComponentProps<typeof Card>; -export function NonVisualAssetCard({ asset, onClick }: NonVisualAssetCardProps): React.JSX.Element { +export function NonVisualAssetCard({ asset }: NonVisualAssetCardProps): React.JSX.Element { const { address, module, name } = parseStructTag(asset.type!); return ( - <Card type={CardType.Default} isHoverable onClick={onClick}> - <CardBody - title={formatAddress(asset.objectId!)} - subtitle={`${formatAddress(address)}::${module}::${name}`} - isTextTruncated - /> - <CardAction type={CardActionType.Link} icon={<ArrowTopRight />} /> - </Card> + <ExplorerLink objectID={asset.objectId} type={ExplorerLinkType.Object}> + <Card type={CardType.Default} isHoverable> + <CardBody + title={formatAddress(asset.objectId!)} + subtitle={`${formatAddress(address)}::${module}::${name}`} + isTextTruncated + /> + <CardAction type={CardActionType.Link} icon={<ArrowTopRight />} /> + </Card> + </ExplorerLink> ); } diff --git a/apps/wallet-dashboard/components/tiles/VisualAssetTile.tsx b/apps/wallet-dashboard/components/tiles/VisualAssetTile.tsx index 642d06daff0..8103bc6fdc7 100644 --- a/apps/wallet-dashboard/components/tiles/VisualAssetTile.tsx +++ b/apps/wallet-dashboard/components/tiles/VisualAssetTile.tsx @@ -4,7 +4,6 @@ 'use client'; import { IotaObjectData } from '@iota/iota-sdk/client'; -import React from 'react'; import { useGetNFTDisplay } from '@iota/core'; import { FlexDirection } from '@/lib/ui/enums'; import { VisualAssetCard, VisualAssetType, type VisualAssetCardProps } from '@iota/apps-ui-kit'; diff --git a/apps/wallet-dashboard/components/transactions/TransactionAmount.tsx b/apps/wallet-dashboard/components/transactions/TransactionAmount.tsx index 498ebc19522..b04e409d977 100644 --- a/apps/wallet-dashboard/components/transactions/TransactionAmount.tsx +++ b/apps/wallet-dashboard/components/transactions/TransactionAmount.tsx @@ -11,7 +11,7 @@ interface TransactionAmountProps { approximation?: boolean; } -export default function TransactionAmount({ +export function TransactionAmount({ amount, coinType, label, diff --git a/apps/wallet-dashboard/components/transactions/TransactionIcon.tsx b/apps/wallet-dashboard/components/transactions/TransactionIcon.tsx deleted file mode 100644 index 8e04e154f13..00000000000 --- a/apps/wallet-dashboard/components/transactions/TransactionIcon.tsx +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright (c) 2024 IOTA Stiftung -// SPDX-License-Identifier: Apache-2.0 - -import { LoadingIndicator } from '@iota/apps-ui-kit'; -import { ArrowBottomLeft, ArrowTopRight, Info, IotaLogoMark, Person, Stake } from '@iota/ui-icons'; - -const ICON_COLORS = { - primary: 'text-primary-30', - error: 'text-error-30', -}; - -const icons = { - Send: <ArrowTopRight className={ICON_COLORS.primary} />, - Receive: <ArrowBottomLeft className={ICON_COLORS.primary} />, - Transaction: <ArrowTopRight className={ICON_COLORS.primary} />, - Staked: <Stake className={ICON_COLORS.primary} />, - Unstaked: <Stake className={ICON_COLORS.primary} />, - Rewards: <IotaLogoMark className={ICON_COLORS.primary} />, - Failed: <Info className={ICON_COLORS.error} />, - Loading: <LoadingIndicator />, - PersonalMessage: <Person className={ICON_COLORS.primary} />, -}; - -interface TransactionIconProps { - txnFailed?: boolean; - variant: keyof typeof icons; -} - -function TransactionIcon({ txnFailed, variant }: TransactionIconProps) { - return <div className="[&_svg]:h-5 [&_svg]:w-5">{icons[txnFailed ? 'Failed' : variant]}</div>; -} -export default TransactionIcon; diff --git a/apps/wallet-dashboard/components/transactions/TransactionSummary.tsx b/apps/wallet-dashboard/components/transactions/TransactionSummary.tsx index 6cca89942ca..c76614db006 100644 --- a/apps/wallet-dashboard/components/transactions/TransactionSummary.tsx +++ b/apps/wallet-dashboard/components/transactions/TransactionSummary.tsx @@ -13,7 +13,7 @@ interface TransactionSummaryProps { showGasSummary?: boolean; } -export default function TransactionSummary({ +export function TransactionSummary({ summary, isLoading, isError, diff --git a/apps/wallet-dashboard/components/transactions/TransactionTile.tsx b/apps/wallet-dashboard/components/transactions/TransactionTile.tsx index 0c76c27ceb1..e845dd0c870 100644 --- a/apps/wallet-dashboard/components/transactions/TransactionTile.tsx +++ b/apps/wallet-dashboard/components/transactions/TransactionTile.tsx @@ -3,10 +3,7 @@ 'use client'; -import React, { useState } from 'react'; -import TransactionIcon from './TransactionIcon'; -import formatTimestamp from '@/lib/utils/time'; -import { ExtendedTransaction, TransactionState } from '@/lib/interfaces'; +import { useState } from 'react'; import { Card, CardType, @@ -18,11 +15,21 @@ import { CardActionType, Dialog, } from '@iota/apps-ui-kit'; -import { useFormatCoin, getLabel, useTransactionSummary } from '@iota/core'; +import { + useFormatCoin, + getTransactionAction, + useTransactionSummary, + ExtendedTransaction, + TransactionState, + TransactionIcon, + checkIfIsTimelockedStaking, + getTransactionAmountForTimelocked, + formatDate, +} from '@iota/core'; import { IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; import { useCurrentAccount } from '@iota/dapp-kit'; -import { TransactionDetailsLayout } from '../Dialogs/transaction/TransactionDetailsLayout'; -import { DialogLayout } from '../Dialogs/layout'; +import { TransactionDetailsLayout } from '../dialogs/transaction/TransactionDetailsLayout'; +import { DialogLayout } from '../dialogs/layout'; interface TransactionTileProps { transaction: ExtendedTransaction; @@ -38,16 +45,33 @@ export function TransactionTile({ transaction }: TransactionTileProps): JSX.Elem currentAddress: account?.address, recognizedPackagesList: [], }); - const [formatAmount, symbol] = useFormatCoin( - Math.abs(Number(address ? transactionSummary?.balanceChanges?.[address]?.[0]?.amount : 0)), - IOTA_TYPE_ARG, + + const { isTimelockedStaking, isTimelockedUnstaking } = checkIfIsTimelockedStaking( + transaction.raw?.events, ); + const balanceChanges = transactionSummary?.balanceChanges; + + function getAmount(tx: ExtendedTransaction) { + if ((isTimelockedStaking || isTimelockedUnstaking) && tx.raw.events) { + return getTransactionAmountForTimelocked(tx.raw.events); + } else { + return address && balanceChanges?.[address]?.[0]?.amount + ? Math.abs(Number(balanceChanges?.[address]?.[0]?.amount)) + : 0; + } + } + + const transactionAmount = getAmount(transaction); + const [formatAmount, symbol] = useFormatCoin(transactionAmount, IOTA_TYPE_ARG); + function openDetailsDialog() { setOpen(true); } - const transactionDate = transaction?.timestamp && formatTimestamp(transaction.timestamp); + const transactionDate = + transaction?.timestamp && + formatDate(Number(transaction?.timestamp), ['day', 'month', 'year', 'hour', 'minute']); return ( <> @@ -55,7 +79,7 @@ export function TransactionTile({ transaction }: TransactionTileProps): JSX.Elem <CardImage type={ImageType.BgSolid} shape={ImageShape.SquareRounded}> <TransactionIcon txnFailed={transaction.state === TransactionState.Failed} - variant={getLabel(transaction?.raw, address)} + variant={getTransactionAction(transaction?.raw, address)} /> </CardImage> <CardBody diff --git a/apps/wallet-dashboard/components/transactions/TransactionsList.tsx b/apps/wallet-dashboard/components/transactions/TransactionsList.tsx index 526329aed43..bc3f0da5fce 100644 --- a/apps/wallet-dashboard/components/transactions/TransactionsList.tsx +++ b/apps/wallet-dashboard/components/transactions/TransactionsList.tsx @@ -1,14 +1,13 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import React from 'react'; import { useCurrentAccount } from '@iota/dapp-kit'; import { VirtualList, TransactionTile } from '@/components'; import { useQueryTransactionsByAddress } from '@iota/core'; import { getExtendedTransaction } from '@/lib/utils/transaction'; import { IotaTransactionBlockResponse } from '@iota/iota-sdk/client'; -function TransactionsList() { +export function TransactionsList() { const currentAccount = useCurrentAccount(); const { data: transactions, error } = useQueryTransactionsByAddress(currentAccount?.address); @@ -23,5 +22,3 @@ function TransactionsList() { return <VirtualList items={transactions || []} estimateSize={() => 60} render={virtualItem} />; } - -export default TransactionsList; diff --git a/apps/wallet-dashboard/components/transactions/TransactionsOverview.tsx b/apps/wallet-dashboard/components/transactions/TransactionsOverview.tsx index fcaf74eddaa..e01628377bc 100644 --- a/apps/wallet-dashboard/components/transactions/TransactionsOverview.tsx +++ b/apps/wallet-dashboard/components/transactions/TransactionsOverview.tsx @@ -3,9 +3,9 @@ 'use client'; import { Panel, Title } from '@iota/apps-ui-kit'; -import TransactionsList from './TransactionsList'; +import { TransactionsList } from './TransactionsList'; -function TransactionsOverview() { +export function TransactionsOverview() { return ( <Panel> <Title title="Activity" /> @@ -15,5 +15,3 @@ function TransactionsOverview() { </Panel> ); } - -export default TransactionsOverview; diff --git a/apps/wallet-dashboard/components/transactions/index.ts b/apps/wallet-dashboard/components/transactions/index.ts index 1dc714be773..276bc9ee5f6 100644 --- a/apps/wallet-dashboard/components/transactions/index.ts +++ b/apps/wallet-dashboard/components/transactions/index.ts @@ -1,9 +1,8 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -export { default as TransactionAmount } from './TransactionAmount'; -export { default as TransactionSummary } from './TransactionSummary'; +export * from './TransactionAmount'; +export * from './TransactionSummary'; export * from './TransactionTile'; -export { default as TransactionIcon } from './TransactionIcon'; -export { default as TransactionsList } from './TransactionsList'; -export { default as TransactionsOverview } from './TransactionsOverview'; +export * from './TransactionsList'; +export * from './TransactionsOverview'; diff --git a/apps/wallet-dashboard/hooks/index.ts b/apps/wallet-dashboard/hooks/index.ts index 5ad872afeed..2d59a8c3d89 100644 --- a/apps/wallet-dashboard/hooks/index.ts +++ b/apps/wallet-dashboard/hooks/index.ts @@ -3,13 +3,12 @@ export * from './useNewUnstakeTransaction'; export * from './useNewStakeTransaction'; -export * from './useNotifications'; export * from './useSendCoinTransaction'; -export * from './useCreateSendAssetTransaction'; export * from './useGetCurrentEpochStartTimestamp'; export * from './useTimelockedUnstakeTransaction'; export * from './useExplorerLinkGetter'; export * from './useGetStardustMigratableObjects'; export * from './useGetSupplyIncreaseVestingObjects'; -export * from './useGroupedMigrationObjectsByExpirationDate'; +export * from './useGroupedStardustObjects'; export * from './useTransferTransaction'; +export * from './usePersistedNetwork'; diff --git a/apps/wallet-dashboard/hooks/useCreateSendAssetTransaction.ts b/apps/wallet-dashboard/hooks/useCreateSendAssetTransaction.ts deleted file mode 100644 index aa50c4fac7c..00000000000 --- a/apps/wallet-dashboard/hooks/useCreateSendAssetTransaction.ts +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) 2024 IOTA Stiftung -// SPDX-License-Identifier: Apache-2.0 - -import { useSignAndExecuteTransaction } from '@iota/dapp-kit'; -import { Transaction } from '@iota/iota-sdk/transactions'; -import { useMutation } from '@tanstack/react-query'; - -export function useCreateSendAssetTransaction( - objectId: string, - onSuccess?: () => void, - onError?: (error: unknown) => void, -) { - const { mutateAsync: signAndExecuteTransaction } = useSignAndExecuteTransaction(); - const mutation = useMutation({ - mutationFn: async (to: string) => { - if (!to) { - throw new Error('Missing data'); - } - - const tx = new Transaction(); - tx.transferObjects([tx.object(objectId)], to); - - return signAndExecuteTransaction({ - transaction: tx, - options: { - showEffects: true, - showEvents: true, - showInput: true, - }, - }); - }, - onSuccess, - onError, - }); - - return { mutation }; -} diff --git a/apps/wallet-dashboard/hooks/useGetSupplyIncreaseVestingObjects.ts b/apps/wallet-dashboard/hooks/useGetSupplyIncreaseVestingObjects.ts index 58d19d63641..e086333e4ce 100644 --- a/apps/wallet-dashboard/hooks/useGetSupplyIncreaseVestingObjects.ts +++ b/apps/wallet-dashboard/hooks/useGetSupplyIncreaseVestingObjects.ts @@ -26,7 +26,7 @@ import { } from '@iota/core'; import { Transaction } from '@iota/iota-sdk/transactions'; -export function useGetSupplyIncreaseVestingObjects(address: string): { +interface SupplyIncreaseVestingObject { nextPayout: SupplyIncreaseVestingPayout | undefined; lastPayout: SupplyIncreaseVestingPayout | undefined; supplyIncreaseVestingSchedule: VestingOverview; @@ -40,7 +40,10 @@ export function useGetSupplyIncreaseVestingObjects(address: string): { } | undefined; refreshStakeList: () => void; -} { + isSupplyIncreaseVestingScheduleEmpty: boolean; +} + +export function useGetSupplyIncreaseVestingObjects(address: string): SupplyIncreaseVestingObject { const { data: currentEpochMs } = useGetCurrentEpochStartTimestamp(); const { data: timelockedObjects, refetch: refetchGetAllOwnedObjects } = useGetAllOwnedObjects( @@ -93,6 +96,13 @@ export function useGetSupplyIncreaseVestingObjects(address: string): { supplyIncreaseVestingUnlockedObjectIds, ); + const isSupplyIncreaseVestingScheduleEmpty = + !supplyIncreaseVestingSchedule.totalVested && + !supplyIncreaseVestingSchedule.totalLocked && + !supplyIncreaseVestingSchedule.availableClaiming && + !supplyIncreaseVestingSchedule.totalStaked && + !supplyIncreaseVestingSchedule.totalEarned; + function refreshStakeList() { refetchTimelockedStakedObjects(); refetchGetAllOwnedObjects(); @@ -108,5 +118,6 @@ export function useGetSupplyIncreaseVestingObjects(address: string): { isTimelockedStakedObjectsLoading, unlockAllSupplyIncreaseVesting, refreshStakeList, + isSupplyIncreaseVestingScheduleEmpty, }; } diff --git a/apps/wallet-dashboard/hooks/useGroupedMigrationObjectsByExpirationDate.ts b/apps/wallet-dashboard/hooks/useGroupedStardustObjects.ts similarity index 91% rename from apps/wallet-dashboard/hooks/useGroupedMigrationObjectsByExpirationDate.ts rename to apps/wallet-dashboard/hooks/useGroupedStardustObjects.ts index d9d96816fd2..9bf3b9ba79f 100644 --- a/apps/wallet-dashboard/hooks/useGroupedMigrationObjectsByExpirationDate.ts +++ b/apps/wallet-dashboard/hooks/useGroupedStardustObjects.ts @@ -13,9 +13,9 @@ import { useQuery } from '@tanstack/react-query'; import { useGetCurrentEpochStartTimestamp } from './useGetCurrentEpochStartTimestamp'; import { useGetCurrentEpochEndTimestamp } from './useGetCurrentEpochEndTimestamp'; -export function useGroupedMigrationObjectsByExpirationDate( +export function useGroupedStardustObjects( objects: IotaObjectData[], - isTimelockUnlockCondition: boolean = false, + groupByTimelockUC: boolean = false, ) { const client = useIotaClient(); const address = useCurrentAccount()?.address; @@ -32,7 +32,7 @@ export function useGroupedMigrationObjectsByExpirationDate( 'grouped-migration-objects', objects, address, - isTimelockUnlockCondition, + groupByTimelockUC, epochStartMs, epochEndMs, ], @@ -44,7 +44,8 @@ export function useGroupedMigrationObjectsByExpirationDate( objects, client, address, - isTimelockUnlockCondition, + groupByTimelockUC, + epochStartMs, ); return sortStardustResolvedObjectsByExpiration( diff --git a/apps/wallet-dashboard/hooks/useNotifications.ts b/apps/wallet-dashboard/hooks/useNotifications.ts deleted file mode 100644 index c5ec455b886..00000000000 --- a/apps/wallet-dashboard/hooks/useNotifications.ts +++ /dev/null @@ -1,9 +0,0 @@ -// Copyright (c) 2024 IOTA Stiftung -// SPDX-License-Identifier: Apache-2.0 - -import { useNotificationStore } from '@/stores/notificationStore'; - -export function useNotifications() { - const addNotification = useNotificationStore((state) => state.addNotification); - return { addNotification }; -} diff --git a/apps/wallet-dashboard/hooks/usePersistedNetwork.ts b/apps/wallet-dashboard/hooks/usePersistedNetwork.ts new file mode 100644 index 00000000000..9b4bbbf3c03 --- /dev/null +++ b/apps/wallet-dashboard/hooks/usePersistedNetwork.ts @@ -0,0 +1,41 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +import { useIotaClientContext } from '@iota/dapp-kit'; +import { NetworkConfiguration } from '@iota/iota-sdk/client'; +import { useLocalStorage } from '@iota/core'; +import toast from 'react-hot-toast'; +import { useEffect } from 'react'; + +export function usePersistedNetwork() { + const clientContext = useIotaClientContext(); + const activeNetwork = clientContext.network; + + const LOCAL_STORAGE_KEY = 'network_iota-dashboard'; + + const [persistedNetwork, setPersistedNetwork] = useLocalStorage<string>( + LOCAL_STORAGE_KEY, + activeNetwork, + ); + + async function handleNetworkChange(network: NetworkConfiguration) { + if (persistedNetwork === network.id) { + return; + } + + clientContext.selectNetwork(network.id); + setPersistedNetwork(network.id); + toast.success(`Switched to ${network.name}`); + } + + useEffect(() => { + if (activeNetwork !== persistedNetwork) { + setPersistedNetwork(activeNetwork); + } + }, [persistedNetwork, activeNetwork, setPersistedNetwork]); + + return { + persistedNetwork, + handleNetworkChange, + }; +} diff --git a/apps/wallet-dashboard/lib/constants/routes.constants.ts b/apps/wallet-dashboard/lib/constants/routes.constants.ts index 5d8d27d33e3..983f86c4693 100644 --- a/apps/wallet-dashboard/lib/constants/routes.constants.ts +++ b/apps/wallet-dashboard/lib/constants/routes.constants.ts @@ -3,7 +3,7 @@ import type { ProtectedRoute } from '../interfaces'; import { ProtectedRouteTitle } from '../enums'; -import { Activity, Assets, Calendar, Home, Tokens, Vesting } from '@iota/ui-icons'; +import { Activity, Assets, Home, Migration, Stake, Vesting } from '@iota/apps-ui-icons'; export const HOMEPAGE_ROUTE: ProtectedRoute = { title: ProtectedRouteTitle.Home, @@ -20,18 +20,18 @@ export const ASSETS_ROUTE: ProtectedRoute = { export const STAKING_ROUTE: ProtectedRoute = { title: ProtectedRouteTitle.Staking, path: '/staking', - icon: Activity, + icon: Stake, }; export const ACTIVITY_ROUTE: ProtectedRoute = { title: ProtectedRouteTitle.Activity, path: '/activity', - icon: Tokens, + icon: Activity, }; export const MIGRATIONS_ROUTE: ProtectedRoute = { title: ProtectedRouteTitle.Migrations, path: '/migrations', - icon: Calendar, + icon: Migration, }; export const VESTING_ROUTE: ProtectedRoute = { title: ProtectedRouteTitle.Vesting, diff --git a/apps/wallet-dashboard/lib/constants/vesting.constants.ts b/apps/wallet-dashboard/lib/constants/vesting.constants.ts index 51ace2168a7..71937eb7d05 100644 --- a/apps/wallet-dashboard/lib/constants/vesting.constants.ts +++ b/apps/wallet-dashboard/lib/constants/vesting.constants.ts @@ -7,7 +7,10 @@ import { DAYS_PER_YEAR, } from '@iota/core/constants/time.constants'; import { TimelockedObject } from '../interfaces'; -import { getMockedTimelockedStakedObjectsWithDynamicDate } from '../utils/vesting/getMockedTimelockedStakedObjectsWithDynamicDate'; +import { + getMockedSupplyIncreaseVestingTimelockedObjectsWithDynamicDate, + getMockedVestingTimelockedStakedObjectsWithDynamicDate, +} from '../utils/vesting/buildMockedObjectsWithDynamicDateUtils'; import { DelegatedTimelockedStake } from '@iota/iota-sdk/client'; export const SUPPLY_INCREASE_VESTING_PAYOUT_SCHEDULE = 2 * DAYS_PER_WEEK; @@ -667,5 +670,12 @@ export const MOCKED_VESTING_TIMELOCKED_STAKED_OBJECTS: DelegatedTimelockedStake[ }, ]; -export const mockedTimelockedStackedObjectsWithDynamicDate = - getMockedTimelockedStakedObjectsWithDynamicDate(MOCKED_VESTING_TIMELOCKED_STAKED_OBJECTS); +export const mockedSupplyIncreaseVestingTimelockedObjectsWithDynamicDate = + getMockedSupplyIncreaseVestingTimelockedObjectsWithDynamicDate( + MOCKED_SUPPLY_INCREASE_VESTING_TIMELOCKED_OBJECTS, + ); + +export const mockedVestingTimelockedStakedObjectsWithDynamicDate = + getMockedVestingTimelockedStakedObjectsWithDynamicDate( + MOCKED_VESTING_TIMELOCKED_STAKED_OBJECTS, + ); diff --git a/apps/wallet-dashboard/lib/enums/assetCategory.enum.ts b/apps/wallet-dashboard/lib/enums/assetCategory.enums.ts similarity index 70% rename from apps/wallet-dashboard/lib/enums/assetCategory.enum.ts rename to apps/wallet-dashboard/lib/enums/assetCategory.enums.ts index bab9839ceaa..b7d45b16343 100644 --- a/apps/wallet-dashboard/lib/enums/assetCategory.enum.ts +++ b/apps/wallet-dashboard/lib/enums/assetCategory.enums.ts @@ -2,6 +2,6 @@ // SPDX-License-Identifier: Apache-2.0 export enum AssetCategory { - Visual = 'Visual', - Other = 'Other', + Visual = 'visual', + Other = 'other', } diff --git a/apps/wallet-dashboard/lib/enums/index.ts b/apps/wallet-dashboard/lib/enums/index.ts index 6d936d1ec45..8cac53c8275 100644 --- a/apps/wallet-dashboard/lib/enums/index.ts +++ b/apps/wallet-dashboard/lib/enums/index.ts @@ -1,8 +1,8 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -export * from './protectedRouteTitle.enum'; -export * from './assetCategory.enum'; +export * from './protectedRouteTitle.enums'; +export * from './assetCategory.enums'; export * from './commonMigrationObjectType.enums'; -export * from './stardustOutputDetailsFilter.enum'; -export * from './stardustOutputMigrationStatus.enum'; +export * from './stardustOutputDetailsFilter.enums'; +export * from './stardustOutputMigrationStatus.enums'; diff --git a/apps/wallet-dashboard/lib/enums/protectedRouteTitle.enum.ts b/apps/wallet-dashboard/lib/enums/protectedRouteTitle.enums.ts similarity index 100% rename from apps/wallet-dashboard/lib/enums/protectedRouteTitle.enum.ts rename to apps/wallet-dashboard/lib/enums/protectedRouteTitle.enums.ts diff --git a/apps/wallet-dashboard/lib/enums/stardustOutputDetailsFilter.enum.ts b/apps/wallet-dashboard/lib/enums/stardustOutputDetailsFilter.enums.ts similarity index 100% rename from apps/wallet-dashboard/lib/enums/stardustOutputDetailsFilter.enum.ts rename to apps/wallet-dashboard/lib/enums/stardustOutputDetailsFilter.enums.ts diff --git a/apps/wallet-dashboard/lib/enums/stardustOutputMigrationStatus.enum.ts b/apps/wallet-dashboard/lib/enums/stardustOutputMigrationStatus.enums.ts similarity index 100% rename from apps/wallet-dashboard/lib/enums/stardustOutputMigrationStatus.enum.ts rename to apps/wallet-dashboard/lib/enums/stardustOutputMigrationStatus.enums.ts diff --git a/apps/wallet-dashboard/lib/interfaces/appRoute.interface.ts b/apps/wallet-dashboard/lib/interfaces/appRoute.interfaces.ts similarity index 100% rename from apps/wallet-dashboard/lib/interfaces/appRoute.interface.ts rename to apps/wallet-dashboard/lib/interfaces/appRoute.interfaces.ts diff --git a/apps/wallet-dashboard/lib/interfaces/dialogView.interface.ts b/apps/wallet-dashboard/lib/interfaces/dialogView.interfaces.ts similarity index 100% rename from apps/wallet-dashboard/lib/interfaces/dialogView.interface.ts rename to apps/wallet-dashboard/lib/interfaces/dialogView.interfaces.ts diff --git a/apps/wallet-dashboard/lib/interfaces/index.ts b/apps/wallet-dashboard/lib/interfaces/index.ts index 6999e34dd61..8d652795abd 100644 --- a/apps/wallet-dashboard/lib/interfaces/index.ts +++ b/apps/wallet-dashboard/lib/interfaces/index.ts @@ -1,8 +1,7 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -export * from './transactions.interface'; -export * from './timelock.interface'; -export * from './vesting.interface'; -export * from './appRoute.interface'; -export * from './dialogView.interface'; +export * from './timelock.interfaces'; +export * from './vesting.interfaces'; +export * from './appRoute.interfaces'; +export * from './dialogView.interfaces'; diff --git a/apps/wallet-dashboard/lib/interfaces/timelock.interface.ts b/apps/wallet-dashboard/lib/interfaces/timelock.interfaces.ts similarity index 100% rename from apps/wallet-dashboard/lib/interfaces/timelock.interface.ts rename to apps/wallet-dashboard/lib/interfaces/timelock.interfaces.ts diff --git a/apps/wallet-dashboard/lib/interfaces/vesting.interface.ts b/apps/wallet-dashboard/lib/interfaces/vesting.interfaces.ts similarity index 100% rename from apps/wallet-dashboard/lib/interfaces/vesting.interface.ts rename to apps/wallet-dashboard/lib/interfaces/vesting.interfaces.ts diff --git a/apps/wallet-dashboard/lib/ui/enums/flex-direction.enums.ts b/apps/wallet-dashboard/lib/ui/enums/flexDirection.enums.ts similarity index 100% rename from apps/wallet-dashboard/lib/ui/enums/flex-direction.enums.ts rename to apps/wallet-dashboard/lib/ui/enums/flexDirection.enums.ts diff --git a/apps/wallet-dashboard/lib/ui/enums/index.ts b/apps/wallet-dashboard/lib/ui/enums/index.ts index 416ee72bd74..ac0d7e3ead5 100644 --- a/apps/wallet-dashboard/lib/ui/enums/index.ts +++ b/apps/wallet-dashboard/lib/ui/enums/index.ts @@ -1,4 +1,4 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -export * from './flex-direction.enums'; +export * from './flexDirection.enums'; diff --git a/apps/wallet-dashboard/lib/utils/migration/groupMigrationObjects.ts b/apps/wallet-dashboard/lib/utils/migration/groupMigrationObjects.ts index 73991f4ac09..b0be24e48f9 100644 --- a/apps/wallet-dashboard/lib/utils/migration/groupMigrationObjects.ts +++ b/apps/wallet-dashboard/lib/utils/migration/groupMigrationObjects.ts @@ -16,7 +16,7 @@ import { STARDUST_BASIC_OUTPUT_TYPE, STARDUST_NFT_OUTPUT_TYPE, } from '@iota/core'; -import { extractMigrationOutputFields, extractOwnedStorageDepositReturnAmount } from '.'; +import { extractOutputFields, extractOwnedStorageDepositReturnAmount } from '.'; import { IotaClient, IotaObjectData } from '@iota/iota-sdk/client'; import { MIGRATION_OBJECT_WITHOUT_UC_KEY } from '@/lib/constants'; @@ -24,7 +24,8 @@ export async function groupMigrationObjectsByUnlockCondition( objectsData: IotaObjectData[], client: IotaClient, currentAddress: string = '', - isTimelockUnlockCondition: boolean = false, + groupByTimelockUC: boolean = false, // If true, group by timelock unlock condition, else group by expiration unlock condition + currentEpochStartMs?: number, ): Promise<ResolvedObjectTypes[]> { const flatObjects: ResolvedObjectTypes[] = []; const basicObjectMap: Map<string, ResolvedBasicObject> = new Map(); @@ -37,49 +38,51 @@ export async function groupMigrationObjectsByUnlockCondition( const chunk = objectsData.slice(i, i + PROMISE_CHUNK_SIZE); const promises = chunk.map(async (object) => { - const objectFields = extractMigrationOutputFields(object); + const objectFields = extractOutputFields(object); let groupKey: string | undefined; - if (isTimelockUnlockCondition) { + if (groupByTimelockUC) { const timestamp = objectFields.timelock_uc?.fields.unix_time.toString(); groupKey = timestamp; } else { const timestamp = objectFields.expiration_uc?.fields.unix_time.toString(); // Timestamp can be undefined if the object was timelocked and is now unlocked // and it doesn't have an expiration unlock condition - groupKey = timestamp ?? MIGRATION_OBJECT_WITHOUT_UC_KEY; + groupKey = + timestamp && + currentEpochStartMs !== undefined && + Number(timestamp) >= currentEpochStartMs / MILLISECONDS_PER_SECOND + ? timestamp + : MIGRATION_OBJECT_WITHOUT_UC_KEY; } if (!groupKey) { return; } - if (object.type === STARDUST_BASIC_OUTPUT_TYPE) { - const existing = basicObjectMap.get(groupKey); - const gasReturn = extractOwnedStorageDepositReturnAmount( - objectFields, - currentAddress, - ); - const newBalance = - (existing ? existing.balance : 0n) + - BigInt(objectFields.balance) + - (gasReturn ?? 0n); + const existingBasicObject = basicObjectMap.get(groupKey); + const gasReturn = extractOwnedStorageDepositReturnAmount(objectFields, currentAddress); + const newBalance = + (existingBasicObject ? existingBasicObject.balance : 0n) + + BigInt(objectFields.balance) + + (gasReturn ?? 0n); - if (existing) { - existing.balance = newBalance; - } else { - const newBasicObject: ResolvedBasicObject = { - balance: newBalance, - unlockConditionTimestamp: groupKey, - type: object.type, - commonObjectType: CommonMigrationObjectType.Basic, - output: object, - uniqueId: objectFields.id.id, - }; - basicObjectMap.set(groupKey, newBasicObject); - flatObjects.push(newBasicObject); - } - } else if (object.type === STARDUST_NFT_OUTPUT_TYPE) { + if (existingBasicObject) { + existingBasicObject.balance = newBalance; + } else { + const newBasicObject: ResolvedBasicObject = { + balance: newBalance, + unlockConditionTimestamp: groupKey, + type: STARDUST_BASIC_OUTPUT_TYPE, + commonObjectType: CommonMigrationObjectType.Basic, + output: object, + uniqueId: objectFields.id.id, + }; + basicObjectMap.set(groupKey, newBasicObject); + flatObjects.push(newBasicObject); + } + + if (object.type === STARDUST_NFT_OUTPUT_TYPE) { const nftDetails = await getNftDetails(object, groupKey, client); flatObjects.push(...nftDetails); } @@ -160,7 +163,7 @@ async function getNftDetails( expirationKey: UnlockConditionTimestamp, client: IotaClient, ): Promise<ResolvedNftObject[]> { - const objectFields = extractMigrationOutputFields(object); + const objectFields = extractOutputFields(object); const nftOutputDynamicFields = await client.getDynamicFields({ parentId: objectFields.id.id, }); @@ -195,7 +198,7 @@ async function extractNativeTokensFromObject( client: IotaClient, expirationKey: UnlockConditionTimestamp, ): Promise<ResolvedNativeToken[]> { - const fields = extractMigrationOutputFields(object); + const fields = extractOutputFields(object); const bagId = fields.native_tokens.fields.id.id; const bagSize = Number(fields.native_tokens.fields.size); @@ -222,7 +225,9 @@ async function extractNativeTokensFromObject( result.push({ name: tokenName, balance, - coinType: nativeTokenFields.name, + coinType: nativeTokenFields.name.startsWith('0x') + ? nativeTokenFields.name + : `0x${nativeTokenFields.name}`, unlockConditionTimestamp: expirationKey, commonObjectType: CommonMigrationObjectType.NativeToken, output: object, diff --git a/apps/wallet-dashboard/lib/utils/migration/groupStardustObjectsByMigrationStatus.ts b/apps/wallet-dashboard/lib/utils/migration/groupStardustObjectsByMigrationStatus.ts index b10f1cf4218..5c0a20a824c 100644 --- a/apps/wallet-dashboard/lib/utils/migration/groupStardustObjectsByMigrationStatus.ts +++ b/apps/wallet-dashboard/lib/utils/migration/groupStardustObjectsByMigrationStatus.ts @@ -3,6 +3,9 @@ import { CommonOutputObjectWithUc, MILLISECONDS_PER_SECOND } from '@iota/core'; import { IotaObjectData } from '@iota/iota-sdk/client'; +import { filterMigrationObjects } from './filterMigrationObjectDetails'; +import { CommonMigrationObjectType, StardustOutputDetailsFilter } from '@/lib/enums'; +import { ResolvedObjectTypes } from '@/lib/types'; export type StardustMigrationGroupedObjects = { migratable: IotaObjectData[]; @@ -20,7 +23,7 @@ export function groupStardustObjectsByMigrationStatus( const epochUnix = epochTimestampMs / MILLISECONDS_PER_SECOND; for (const outputObject of stardustOutputObjects) { - const outputObjectFields = extractMigrationOutputFields(outputObject); + const outputObjectFields = extractOutputFields(outputObject); if ( outputObjectFields.timelock_uc && @@ -47,36 +50,46 @@ export function groupStardustObjectsByMigrationStatus( return { migratable, timelocked }; } -interface MigratableObjectsData { +interface StardustObjectsTotals { totalNativeTokens: number; totalVisualAssets: number; totalIotaAmount: bigint; totalNotOwnedStorageDepositReturnAmount: bigint; } -interface SummarizeMigrationObjectParams { +interface StardustObjectsTotalsParams { basicOutputs: IotaObjectData[] | undefined; nftOutputs: IotaObjectData[] | undefined; address: string; + resolvedObjects?: ResolvedObjectTypes[]; } -export function summarizeMigratableObjectValues({ +export function getStardustObjectsTotals({ basicOutputs = [], nftOutputs = [], address, -}: SummarizeMigrationObjectParams): MigratableObjectsData { + resolvedObjects, +}: StardustObjectsTotalsParams): StardustObjectsTotals { let totalNativeTokens = 0; let totalIotaAmount: bigint = 0n; let totalNotOwnedStorageDepositReturnAmount: bigint = 0n; + let filteredObjects: ResolvedObjectTypes[] = []; const totalVisualAssets = nftOutputs.length; const outputObjects = [...basicOutputs, ...nftOutputs]; + if (resolvedObjects) { + filteredObjects = filterMigrationObjects( + resolvedObjects, + StardustOutputDetailsFilter.NativeTokens, + ); + } + totalNativeTokens = getUniqueNativeTokensByCoinType(filteredObjects); + for (const output of outputObjects) { - const outputObjectFields = extractMigrationOutputFields(output); + const outputObjectFields = extractOutputFields(output); totalIotaAmount += BigInt(outputObjectFields.balance); - totalNativeTokens += parseInt(outputObjectFields.native_tokens.fields.size); totalIotaAmount += extractOwnedStorageDepositReturnAmount(outputObjectFields, address) || 0n; totalNotOwnedStorageDepositReturnAmount += @@ -91,29 +104,6 @@ export function summarizeMigratableObjectValues({ }; } -interface UnmmigratableObjectsData { - totalTimelockedObjects: number; -} - -export function summarizeTimelockedObjectValues({ - basicOutputs = [], - nftOutputs = [], -}: Omit<SummarizeMigrationObjectParams, 'address'>): UnmmigratableObjectsData { - const basicObjects = basicOutputs.length; - const nftObjects = nftOutputs.length; - let nativeTokens = 0; - - for (const output of [...basicOutputs, ...nftOutputs]) { - const outputObjectFields = extractMigrationOutputFields(output); - - nativeTokens += parseInt(outputObjectFields.native_tokens.fields.size); - } - - const totalTimelockedObjects = basicObjects + nativeTokens + nftObjects; - - return { totalTimelockedObjects }; -} - export function extractOwnedStorageDepositReturnAmount( { storage_deposit_return_uc }: CommonOutputObjectWithUc, address: string, @@ -127,9 +117,7 @@ export function extractOwnedStorageDepositReturnAmount( return null; } -export function extractMigrationOutputFields( - outputObject: IotaObjectData, -): CommonOutputObjectWithUc { +export function extractOutputFields(outputObject: IotaObjectData): CommonOutputObjectWithUc { return ( outputObject.content as unknown as { fields: CommonOutputObjectWithUc; @@ -149,3 +137,11 @@ export function extractNotOwnedStorageDepositReturnAmount( } return null; } + +export function getUniqueNativeTokensByCoinType(objects: ResolvedObjectTypes[]): number { + return new Set( + objects + .filter((obj) => obj.commonObjectType === CommonMigrationObjectType.NativeToken) + .map((obj) => obj.coinType), + ).size; +} diff --git a/apps/wallet-dashboard/lib/utils/time.ts b/apps/wallet-dashboard/lib/utils/time.ts index 8c66df0c883..9df8d1969f0 100644 --- a/apps/wallet-dashboard/lib/utils/time.ts +++ b/apps/wallet-dashboard/lib/utils/time.ts @@ -1,11 +1,6 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -export default function formatTimestamp(timeStamp: number): string { - const date = new Date(timeStamp); - return new Intl.DateTimeFormat('en-US').format(date); -} - export function parseTimestamp(timestampMs: string): number { const timestamp = parseInt(timestampMs, 10); if (!Number.isFinite(timestamp)) { diff --git a/apps/wallet-dashboard/lib/utils/transaction.ts b/apps/wallet-dashboard/lib/utils/transaction.ts index bc7f08c2756..f89f3281619 100644 --- a/apps/wallet-dashboard/lib/utils/transaction.ts +++ b/apps/wallet-dashboard/lib/utils/transaction.ts @@ -1,9 +1,9 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { ExtendedTransaction, TransactionAction, TransactionState } from '@/lib/interfaces'; import { IotaTransactionBlockResponse } from '@iota/iota-sdk/client'; import { parseTimestamp } from './time'; +import { TransactionState, ExtendedTransaction, getTransactionAction } from '@iota/core'; const getTransactionTransactionState = (tx: IotaTransactionBlockResponse): TransactionState => { const executionStatus = tx.effects?.status.status; @@ -20,14 +20,6 @@ const getTransactionTransactionState = (tx: IotaTransactionBlockResponse): Trans return TransactionState.Pending; }; -export const getTransactionAction = ( - transaction: IotaTransactionBlockResponse, - currentAddress: string, -) => { - const isSender = transaction.transaction?.data.sender === currentAddress; - return isSender ? TransactionAction.Send : TransactionAction.Receive; -}; - export const getExtendedTransaction = ( tx: IotaTransactionBlockResponse, address: string, diff --git a/apps/wallet-dashboard/lib/utils/vesting/getMockedTimelockedStakedObjectsWithDynamicDate.ts b/apps/wallet-dashboard/lib/utils/vesting/buildMockedObjectsWithDynamicDateUtils.ts similarity index 53% rename from apps/wallet-dashboard/lib/utils/vesting/getMockedTimelockedStakedObjectsWithDynamicDate.ts rename to apps/wallet-dashboard/lib/utils/vesting/buildMockedObjectsWithDynamicDateUtils.ts index 6a475e7251e..e51875647f3 100644 --- a/apps/wallet-dashboard/lib/utils/vesting/getMockedTimelockedStakedObjectsWithDynamicDate.ts +++ b/apps/wallet-dashboard/lib/utils/vesting/buildMockedObjectsWithDynamicDateUtils.ts @@ -1,14 +1,35 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { MILLISECONDS_PER_DAY } from '@iota/core/constants/time.constants'; +import { TimelockedObject } from '@/lib/interfaces'; +import { DAYS_PER_WEEK, MILLISECONDS_PER_DAY } from '@iota/core/constants/time.constants'; import { DelegatedTimelockedStake } from '@iota/iota-sdk/client'; +/** + * Maps the passed objects to a set of objects with modified expirationTimestampMs date. + * It spreads the dates from CURRENT datetime PLUS two weeks, + * so that the reference payout we use will always be with expiration of two weeks from now, + * then the rest are spread BACK up to array length with a STEP of two weeks (vesting schedule). + */ +export function getMockedSupplyIncreaseVestingTimelockedObjectsWithDynamicDate( + vestingObjects: TimelockedObject[], +): TimelockedObject[] { + const twoWeeksMs = 2 * DAYS_PER_WEEK * MILLISECONDS_PER_DAY; + const twoWeeksFromNow = Date.now() + twoWeeksMs; + + return structuredClone(vestingObjects) + .map((object, idx) => { + object.expirationTimestampMs = twoWeeksFromNow - idx * twoWeeksMs; + return object; + }) + .reverse(); +} + /** * Gets the objects in a distributed manner with half of the objects * being unlocked and the other half being locked. */ -export function getMockedTimelockedStakedObjectsWithDynamicDate( +export function getMockedVestingTimelockedStakedObjectsWithDynamicDate( delegatedObjects: DelegatedTimelockedStake[], ): DelegatedTimelockedStake[] { const now = Date.now(); diff --git a/apps/wallet-dashboard/lib/utils/vesting/vesting.spec.ts b/apps/wallet-dashboard/lib/utils/vesting/vesting.spec.ts index 3612418d48b..4bb594a8952 100644 --- a/apps/wallet-dashboard/lib/utils/vesting/vesting.spec.ts +++ b/apps/wallet-dashboard/lib/utils/vesting/vesting.spec.ts @@ -3,11 +3,12 @@ import { MILLISECONDS_PER_HOUR } from '@iota/core/constants/time.constants'; import { - mockedTimelockedStackedObjectsWithDynamicDate, + mockedVestingTimelockedStakedObjectsWithDynamicDate, MOCKED_SUPPLY_INCREASE_VESTING_TIMELOCKED_OBJECTS, MOCKED_VESTING_TIMELOCKED_STAKED_OBJECTS, SUPPLY_INCREASE_STAKER_VESTING_DURATION, SUPPLY_INCREASE_VESTING_PAYOUTS_IN_1_YEAR, + mockedSupplyIncreaseVestingTimelockedObjectsWithDynamicDate, } from '../../constants'; import { SupplyIncreaseUserType, SupplyIncreaseVestingPayout } from '../../interfaces'; import { formatDelegatedTimelockedStake, isTimelockedObject } from '../timelock'; @@ -23,12 +24,12 @@ const MOCKED_CURRENT_EPOCH_TIMESTAMP = Date.now() + MILLISECONDS_PER_HOUR * 6; / describe('get last supply increase vesting payout', () => { it('should get the object with highest expirationTimestampMs', () => { - const timelockedObjects = MOCKED_SUPPLY_INCREASE_VESTING_TIMELOCKED_OBJECTS; + const timelockedObjects = mockedSupplyIncreaseVestingTimelockedObjectsWithDynamicDate; // the last in the array is also the one with the latest expiration time const expectedObject = - MOCKED_SUPPLY_INCREASE_VESTING_TIMELOCKED_OBJECTS[ - MOCKED_SUPPLY_INCREASE_VESTING_TIMELOCKED_OBJECTS.length - 1 + mockedSupplyIncreaseVestingTimelockedObjectsWithDynamicDate[ + mockedSupplyIncreaseVestingTimelockedObjectsWithDynamicDate.length - 1 ]; const lastPayout = getLatestOrEarliestSupplyIncreaseVestingPayout( @@ -63,7 +64,7 @@ describe('get supply increase user type', () => { describe('build supply increase staker vesting portfolio', () => { it('should build with mocked timelocked objects', () => { - const timelockedObjects = MOCKED_SUPPLY_INCREASE_VESTING_TIMELOCKED_OBJECTS; + const timelockedObjects = mockedSupplyIncreaseVestingTimelockedObjectsWithDynamicDate; const lastPayout = getLatestOrEarliestSupplyIncreaseVestingPayout( timelockedObjects, @@ -80,7 +81,7 @@ describe('build supply increase staker vesting portfolio', () => { }); it('should build properly with mocked timelocked staked objects', () => { - const timelockedStakedObjects = mockedTimelockedStackedObjectsWithDynamicDate; + const timelockedStakedObjects = mockedVestingTimelockedStakedObjectsWithDynamicDate; const extendedTimelockedStakedObjects = formatDelegatedTimelockedStake(timelockedStakedObjects); const lastPayout = getLatestOrEarliestSupplyIncreaseVestingPayout( @@ -98,8 +99,8 @@ describe('build supply increase staker vesting portfolio', () => { }); it('should build properly with mix of mocked timelocked and timelocked staked objects', () => { - const timelockedObjects = MOCKED_SUPPLY_INCREASE_VESTING_TIMELOCKED_OBJECTS; - const timelockedStakedObjects = MOCKED_VESTING_TIMELOCKED_STAKED_OBJECTS; + const timelockedObjects = mockedSupplyIncreaseVestingTimelockedObjectsWithDynamicDate; + const timelockedStakedObjects = mockedVestingTimelockedStakedObjectsWithDynamicDate; const extendedTimelockedStakedObjects = formatDelegatedTimelockedStake(timelockedStakedObjects); const mixedObjects = [...timelockedObjects, ...extendedTimelockedStakedObjects]; diff --git a/apps/wallet-dashboard/package.json b/apps/wallet-dashboard/package.json index 9cff8865c4d..8f2ff1358dd 100644 --- a/apps/wallet-dashboard/package.json +++ b/apps/wallet-dashboard/package.json @@ -17,11 +17,11 @@ "dependencies": { "@growthbook/growthbook": "^1.0.0", "@growthbook/growthbook-react": "^1.0.0", + "@iota/apps-ui-icons": "workspace:*", "@iota/apps-ui-kit": "workspace:*", "@iota/core": "workspace:*", "@iota/dapp-kit": "workspace:*", "@iota/iota-sdk": "workspace:*", - "@iota/ui-icons": "workspace:*", "@iota/wallet-standard": "workspace:*", "@tanstack/react-query": "^5.50.1", "@tanstack/react-virtual": "^3.5.0", @@ -33,6 +33,7 @@ "zustand": "^4.4.1" }, "devDependencies": { + "@tanstack/react-query-devtools": "^5.58.0", "@types/jest": "^29.5.2", "@types/node": "^20.14.10", "@types/react": "^18.3.3", diff --git a/apps/wallet-dashboard/providers/AppProviders.tsx b/apps/wallet-dashboard/providers/AppProviders.tsx index 26be321a43b..f2af54c8658 100644 --- a/apps/wallet-dashboard/providers/AppProviders.tsx +++ b/apps/wallet-dashboard/providers/AppProviders.tsx @@ -8,8 +8,9 @@ import { GrowthBookProvider } from '@growthbook/growthbook-react'; import { IotaClientProvider, lightTheme, darkTheme, WalletProvider } from '@iota/dapp-kit'; 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 } from '@iota/core'; +import { KioskClientProvider, useLocalStorage } from '@iota/core'; import { growthbook } from '@/lib/utils'; import { ThemeProvider } from '@iota/core'; @@ -19,6 +20,8 @@ export function AppProviders({ children }: React.PropsWithChildren) { const [queryClient] = useState(() => new QueryClient()); const allNetworks = getAllNetworks(); const defaultNetwork = getDefaultNetwork(); + const [persistedNetwork] = useLocalStorage<string>('network_iota-dashboard', defaultNetwork); + function handleNetworkChange() { queryClient.resetQueries(); queryClient.clear(); @@ -28,7 +31,7 @@ export function AppProviders({ children }: React.PropsWithChildren) { <QueryClientProvider client={queryClient}> <IotaClientProvider networks={allNetworks} - defaultNetwork={defaultNetwork} + defaultNetwork={persistedNetwork} onNetworkChange={handleNetworkChange} > <KioskClientProvider> @@ -51,6 +54,7 @@ export function AppProviders({ children }: React.PropsWithChildren) { </WalletProvider> </KioskClientProvider> </IotaClientProvider> + <ReactQueryDevtools initialIsOpen={false} /> </QueryClientProvider> </GrowthBookProvider> ); diff --git a/apps/wallet-dashboard/stores/notificationStore.ts b/apps/wallet-dashboard/stores/notificationStore.ts deleted file mode 100644 index 08f48e32d1e..00000000000 --- a/apps/wallet-dashboard/stores/notificationStore.ts +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright (c) 2024 IOTA Stiftung -// SPDX-License-Identifier: Apache-2.0 - -import { indexGenerator } from '@/lib/utils'; -import { create } from 'zustand'; - -const indexGen = indexGenerator(200); - -export enum NotificationType { - Success = 'success', - Error = 'error', - Warning = 'warning', - Info = 'info', -} - -export type NotificationData = { - index: number; - message: string; - type: NotificationType; - duration: number; -}; - -interface NotificationsState { - notifications: NotificationData[]; - addNotification: (message: string, type?: NotificationType, duration?: number) => void; - clearNotification: (index: number) => void; -} - -export const useNotificationStore = create<NotificationsState>()((set) => ({ - notifications: [], - addNotification: ( - message: string, - type: NotificationType = NotificationType.Success, - duration: number = 3000, - ) => - set((state) => { - const index = indexGen.next().value; - - const newNotification: NotificationData = { - index, - message, - type, - duration, - }; - - return { - notifications: [...state.notifications, newNotification], - }; - }), - clearNotification: (index: number) => - set((state) => { - return { - notifications: [ - ...state.notifications.filter((notification) => notification.index !== index), - ], - }; - }), -})); diff --git a/apps/wallet-dashboard/tailwind.config.ts b/apps/wallet-dashboard/tailwind.config.ts index 2ca1f1c0824..720d34d31fd 100644 --- a/apps/wallet-dashboard/tailwind.config.ts +++ b/apps/wallet-dashboard/tailwind.config.ts @@ -3,7 +3,7 @@ import type { Config } from 'tailwindcss'; // Note: exception for the tailwind preset import -import uiKitResponsivePreset from '../../apps/ui-kit/src/lib/tailwind/responsive.preset'; +import uiKitResponsivePreset from '../../apps/ui-kit/src/lib/tailwind/responsive.presets'; export default { presets: [uiKitResponsivePreset], diff --git a/apps/wallet/package.json b/apps/wallet/package.json index 59ad3cd44ec..fd7d505cae2 100644 --- a/apps/wallet/package.json +++ b/apps/wallet/package.json @@ -94,13 +94,13 @@ "@growthbook/growthbook": "^1.0.0", "@growthbook/growthbook-react": "^1.0.0", "@headlessui/react": "^1.7.15", + "@iota/apps-ui-icons": "workspace:*", "@iota/apps-ui-kit": "workspace:*", "@iota/core": "workspace:*", "@iota/dapp-kit": "workspace:*", "@iota/iota-sdk": "workspace:*", "@iota/kiosk": "workspace:*", "@iota/ledgerjs-hw-app-iota": "workspace:*", - "@iota/ui-icons": "workspace:*", "@iota/wallet-standard": "workspace:*", "@ledgerhq/errors": "^6.12.4", "@ledgerhq/hw-transport": "^6.31.0", diff --git a/apps/wallet/src/background/account-sources/AccountSource.ts b/apps/wallet/src/background/account-sources/accountSource.ts similarity index 97% rename from apps/wallet/src/background/account-sources/AccountSource.ts rename to apps/wallet/src/background/account-sources/accountSource.ts index 47cf674fcb1..54d49e5be40 100644 --- a/apps/wallet/src/background/account-sources/AccountSource.ts +++ b/apps/wallet/src/background/account-sources/accountSource.ts @@ -9,7 +9,7 @@ import { clearEphemeralValue, getEphemeralValue, setEphemeralValue, -} from '../session-ephemeral-values'; +} from '../sessionEphemeralValues'; export enum AccountSourceType { Mnemonic = 'mnemonic', diff --git a/apps/wallet/src/background/account-sources/index.ts b/apps/wallet/src/background/account-sources/index.ts index e22684b6a71..9524d8d7e22 100644 --- a/apps/wallet/src/background/account-sources/index.ts +++ b/apps/wallet/src/background/account-sources/index.ts @@ -6,13 +6,13 @@ import { createMessage, type Message } from '_src/shared/messaging/messages'; import { isMethodPayload, type MethodPayload, -} from '_src/shared/messaging/messages/payloads/MethodPayload'; +} from '_src/shared/messaging/messages/payloads/methodPayload'; -import { type UiConnection } from '../connections/UiConnection'; +import { type UiConnection } from '../connections/uiConnection'; import { getDB } from '../db'; -import { AccountSourceType, type AccountSourceSerialized } from './AccountSource'; -import { MnemonicAccountSource } from './MnemonicAccountSource'; -import { SeedAccountSource } from './SeedAccountSource'; +import { AccountSourceType, type AccountSourceSerialized } from './accountSource'; +import { MnemonicAccountSource } from './mnemonicAccountSource'; +import { SeedAccountSource } from './seedAccountSource'; import { toEntropy } from '_src/shared/utils'; function toAccountSource(accountSource: AccountSourceSerialized) { diff --git a/apps/wallet/src/background/account-sources/MnemonicAccountSource.ts b/apps/wallet/src/background/account-sources/mnemonicAccountSource.ts similarity index 97% rename from apps/wallet/src/background/account-sources/MnemonicAccountSource.ts rename to apps/wallet/src/background/account-sources/mnemonicAccountSource.ts index 72820f4497b..4030b2ead83 100644 --- a/apps/wallet/src/background/account-sources/MnemonicAccountSource.ts +++ b/apps/wallet/src/background/account-sources/mnemonicAccountSource.ts @@ -19,16 +19,16 @@ import Dexie from 'dexie'; import { getAccountSources } from '.'; import { getAllAccounts } from '../accounts'; -import { MnemonicAccount, type MnemonicSerializedAccount } from '../accounts/MnemonicAccount'; -import { setupAutoLockAlarm } from '../auto-lock-accounts'; +import { MnemonicAccount, type MnemonicSerializedAccount } from '../accounts/mnemonicAccount'; +import { setupAutoLockAlarm } from '../autoLockAccounts'; import { backupDB, getDB } from '../db'; -import { makeUniqueKey } from '../storage-utils'; +import { makeUniqueKey } from '../storageUtils'; import { AccountSource, AccountSourceType, type AccountSourceSerialized, type AccountSourceSerializedUI, -} from './AccountSource'; +} from './accountSource'; import { accountSourcesEvents } from './events'; import { type MakeDerivationOptions, makeDerivationPath } from './bip44Path'; diff --git a/apps/wallet/src/background/account-sources/SeedAccountSource.ts b/apps/wallet/src/background/account-sources/seedAccountSource.ts similarity index 97% rename from apps/wallet/src/background/account-sources/SeedAccountSource.ts rename to apps/wallet/src/background/account-sources/seedAccountSource.ts index ff4b3e094b9..69a1a202e1e 100644 --- a/apps/wallet/src/background/account-sources/SeedAccountSource.ts +++ b/apps/wallet/src/background/account-sources/seedAccountSource.ts @@ -9,16 +9,16 @@ import Dexie from 'dexie'; import { getAccountSources } from '.'; import { getAllAccounts } from '../accounts'; -import { SeedAccount, type SeedSerializedAccount } from '../accounts/SeedAccount'; -import { setupAutoLockAlarm } from '../auto-lock-accounts'; +import { SeedAccount, type SeedSerializedAccount } from '../accounts/seedAccount'; +import { setupAutoLockAlarm } from '../autoLockAccounts'; import { backupDB, getDB } from '../db'; -import { makeUniqueKey } from '../storage-utils'; +import { makeUniqueKey } from '../storageUtils'; import { AccountSource, AccountSourceType, type AccountSourceSerialized, type AccountSourceSerializedUI, -} from './AccountSource'; +} from './accountSource'; import { accountSourcesEvents } from './events'; import { type MakeDerivationOptions, makeDerivationPath } from './bip44Path'; diff --git a/apps/wallet/src/background/accounts/Account.ts b/apps/wallet/src/background/accounts/account.ts similarity index 98% rename from apps/wallet/src/background/accounts/Account.ts rename to apps/wallet/src/background/accounts/account.ts index 9ab33a5d47c..59549cb4de6 100644 --- a/apps/wallet/src/background/accounts/Account.ts +++ b/apps/wallet/src/background/accounts/account.ts @@ -6,13 +6,13 @@ import { type Serializable } from '_src/shared/cryptography/keystore'; import { toSerializedSignature, type Keypair } from '@iota/iota-sdk/cryptography'; import { blake2b } from '@noble/hashes/blake2b'; -import { setupAutoLockAlarm } from '../auto-lock-accounts'; +import { setupAutoLockAlarm } from '../autoLockAccounts'; import { getDB } from '../db'; import { clearEphemeralValue, getEphemeralValue, setEphemeralValue, -} from '../session-ephemeral-values'; +} from '../sessionEphemeralValues'; import { accountsEvents } from './events'; export enum AccountType { diff --git a/apps/wallet/src/background/accounts/ImportedAccount.ts b/apps/wallet/src/background/accounts/importedAccount.ts similarity index 99% rename from apps/wallet/src/background/accounts/ImportedAccount.ts rename to apps/wallet/src/background/accounts/importedAccount.ts index ac44a31282f..303dfed2de3 100644 --- a/apps/wallet/src/background/accounts/ImportedAccount.ts +++ b/apps/wallet/src/background/accounts/importedAccount.ts @@ -13,7 +13,7 @@ import { type SerializedAccount, type SerializedUIAccount, type SigningAccount, -} from './Account'; +} from './account'; type SessionStorageData = { keyPair: string }; type EncryptedData = { keyPair: string }; diff --git a/apps/wallet/src/background/accounts/index.ts b/apps/wallet/src/background/accounts/index.ts index 665a7b9eddb..189b6e1f1b4 100644 --- a/apps/wallet/src/background/accounts/index.ts +++ b/apps/wallet/src/background/accounts/index.ts @@ -6,30 +6,30 @@ import { createMessage, type Message } from '_src/shared/messaging/messages'; import { isMethodPayload, type MethodPayload, -} from '_src/shared/messaging/messages/payloads/MethodPayload'; +} from '_src/shared/messaging/messages/payloads/methodPayload'; import { type WalletStatusChange } from '_src/shared/messaging/messages/payloads/wallet-status-change'; import { fromB64 } from '@iota/iota-sdk/utils'; import Dexie from 'dexie'; import { getAccountSourceByID } from '../account-sources'; import { accountSourcesEvents } from '../account-sources/events'; -import { MnemonicAccountSource } from '../account-sources/MnemonicAccountSource'; -import { SeedAccountSource } from '../account-sources/SeedAccountSource'; -import { type UiConnection } from '../connections/UiConnection'; +import { MnemonicAccountSource } from '../account-sources/mnemonicAccountSource'; +import { SeedAccountSource } from '../account-sources/seedAccountSource'; +import { type UiConnection } from '../connections/uiConnection'; import { backupDB, getDB } from '../db'; -import { makeUniqueKey } from '../storage-utils'; +import { makeUniqueKey } from '../storageUtils'; import { AccountType, isKeyPairExportableAccount, isPasswordUnLockable, isSigningAccount, type SerializedAccount, -} from './Account'; +} from './account'; import { accountsEvents } from './events'; -import { ImportedAccount } from './ImportedAccount'; -import { LedgerAccount } from './LedgerAccount'; -import { MnemonicAccount } from './MnemonicAccount'; -import { SeedAccount } from './SeedAccount'; +import { ImportedAccount } from './importedAccount'; +import { LedgerAccount } from './ledgerAccount'; +import { MnemonicAccount } from './mnemonicAccount'; +import { SeedAccount } from './seedAccount'; function toAccount(account: SerializedAccount) { if (MnemonicAccount.isOfType(account)) { diff --git a/apps/wallet/src/background/accounts/isMainAccount.ts b/apps/wallet/src/background/accounts/isMainAccount.ts index 0e385c52cf0..9fd860bdbc5 100644 --- a/apps/wallet/src/background/accounts/isMainAccount.ts +++ b/apps/wallet/src/background/accounts/isMainAccount.ts @@ -1,11 +1,11 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { isLedgerAccountSerializedUI } from '_src/background/accounts/LedgerAccount'; -import { isMnemonicSerializedUiAccount } from '_src/background/accounts/MnemonicAccount'; -import { isSeedSerializedUiAccount } from '_src/background/accounts/SeedAccount'; +import { isLedgerAccountSerializedUI } from '_src/background/accounts/ledgerAccount'; +import { isMnemonicSerializedUiAccount } from '_src/background/accounts/mnemonicAccount'; +import { isSeedSerializedUiAccount } from '_src/background/accounts/seedAccount'; import { parseDerivationPath } from '_src/background/account-sources/bip44Path'; -import type { SerializedUIAccount } from '_src/background/accounts/Account'; +import type { SerializedUIAccount } from '_src/background/accounts/account'; export function isMainAccount(account: SerializedUIAccount | null) { if (!account) { diff --git a/apps/wallet/src/background/accounts/LedgerAccount.ts b/apps/wallet/src/background/accounts/ledgerAccount.ts similarity index 99% rename from apps/wallet/src/background/accounts/LedgerAccount.ts rename to apps/wallet/src/background/accounts/ledgerAccount.ts index fbb8ca111c2..477bf379ba9 100644 --- a/apps/wallet/src/background/accounts/LedgerAccount.ts +++ b/apps/wallet/src/background/accounts/ledgerAccount.ts @@ -10,7 +10,7 @@ import { type PasswordUnlockableAccount, type SerializedAccount, type SerializedUIAccount, -} from './Account'; +} from './account'; export interface LedgerAccountSerialized extends SerializedAccount { type: AccountType.LedgerDerived; diff --git a/apps/wallet/src/background/accounts/MnemonicAccount.ts b/apps/wallet/src/background/accounts/mnemonicAccount.ts similarity index 98% rename from apps/wallet/src/background/accounts/MnemonicAccount.ts rename to apps/wallet/src/background/accounts/mnemonicAccount.ts index 0167be027fd..e3c93c843f3 100644 --- a/apps/wallet/src/background/accounts/MnemonicAccount.ts +++ b/apps/wallet/src/background/accounts/mnemonicAccount.ts @@ -5,7 +5,7 @@ import { fromExportedKeypair } from '_src/shared/utils'; import { type Keypair } from '@iota/iota-sdk/cryptography'; -import { MnemonicAccountSource } from '../account-sources/MnemonicAccountSource'; +import { MnemonicAccountSource } from '../account-sources/mnemonicAccountSource'; import { Account, AccountType, @@ -14,7 +14,7 @@ import { type SerializedAccount, type SerializedUIAccount, type SigningAccount, -} from './Account'; +} from './account'; export interface MnemonicSerializedAccount extends SerializedAccount { type: AccountType.MnemonicDerived; diff --git a/apps/wallet/src/background/accounts/SeedAccount.ts b/apps/wallet/src/background/accounts/seedAccount.ts similarity index 98% rename from apps/wallet/src/background/accounts/SeedAccount.ts rename to apps/wallet/src/background/accounts/seedAccount.ts index e2667871adb..0f88a205117 100644 --- a/apps/wallet/src/background/accounts/SeedAccount.ts +++ b/apps/wallet/src/background/accounts/seedAccount.ts @@ -4,7 +4,7 @@ import { fromExportedKeypair } from '_src/shared/utils'; import { type Keypair } from '@iota/iota-sdk/cryptography'; -import { SeedAccountSource } from '../account-sources/SeedAccountSource'; +import { SeedAccountSource } from '../account-sources/seedAccountSource'; import { Account, AccountType, @@ -13,7 +13,7 @@ import { type SerializedAccount, type SerializedUIAccount, type SigningAccount, -} from './Account'; +} from './account'; export interface SeedSerializedAccount extends SerializedAccount { type: AccountType.SeedDerived; diff --git a/apps/wallet/src/background/Alarms.ts b/apps/wallet/src/background/alarms.ts similarity index 100% rename from apps/wallet/src/background/Alarms.ts rename to apps/wallet/src/background/alarms.ts diff --git a/apps/wallet/src/background/auto-lock-accounts.ts b/apps/wallet/src/background/autoLockAccounts.ts similarity index 97% rename from apps/wallet/src/background/auto-lock-accounts.ts rename to apps/wallet/src/background/autoLockAccounts.ts index 474a6846eed..d7287beb0a5 100644 --- a/apps/wallet/src/background/auto-lock-accounts.ts +++ b/apps/wallet/src/background/autoLockAccounts.ts @@ -4,7 +4,7 @@ import { throttle } from 'throttle-debounce'; -import Alarms from './Alarms'; +import Alarms from './alarms'; import { getDB, SETTINGS_KEYS } from './db'; export async function getAutoLockMinutes() { diff --git a/apps/wallet/src/background/connections/Connection.ts b/apps/wallet/src/background/connections/connection.ts similarity index 93% rename from apps/wallet/src/background/connections/Connection.ts rename to apps/wallet/src/background/connections/connection.ts index d7023c9478e..ad0992537c0 100644 --- a/apps/wallet/src/background/connections/Connection.ts +++ b/apps/wallet/src/background/connections/connection.ts @@ -3,7 +3,7 @@ // SPDX-License-Identifier: Apache-2.0 import type { Message } from '_messages'; -import { PortStream } from '_messaging/PortStream'; +import { PortStream } from '_src/shared/messaging/portStream'; import { map, take } from 'rxjs'; import type { Runtime } from 'webextension-polyfill'; diff --git a/apps/wallet/src/background/connections/ContentScriptConnection.ts b/apps/wallet/src/background/connections/contentScriptConnection.ts similarity index 94% rename from apps/wallet/src/background/connections/ContentScriptConnection.ts rename to apps/wallet/src/background/connections/contentScriptConnection.ts index 8067c3ee7e5..10f50acc3e2 100644 --- a/apps/wallet/src/background/connections/ContentScriptConnection.ts +++ b/apps/wallet/src/background/connections/contentScriptConnection.ts @@ -4,10 +4,10 @@ import { createMessage } from '_messages'; import type { Message } from '_messages'; -import type { PortChannelName } from '_messaging/PortChannelName'; +import type { PortChannelName } from '_src/shared/messaging/portChannelName'; import { isBasePayload, type ErrorPayload } from '_payloads'; -import { isGetAccount } from '_payloads/account/GetAccount'; -import type { GetAccountResponse } from '_payloads/account/GetAccountResponse'; +import { isGetAccount } from '_src/shared/messaging/messages/payloads/account/getAccount'; +import type { GetAccountResponse } from '_src/shared/messaging/messages/payloads/account/getAccountResponse'; import type { SetNetworkPayload } from '_payloads/network'; import { isAcquirePermissionsRequest, @@ -23,19 +23,19 @@ import { type ExecuteTransactionResponse, type SignTransactionResponse, } from '_payloads/transactions'; -import Permissions from '_src/background/Permissions'; -import Transactions from '_src/background/Transactions'; +import Permissions from '_src/background/permissions'; +import Transactions from '_src/background/transactions'; import { isSignMessageRequest, type SignMessageRequest, -} from '_src/shared/messaging/messages/payloads/transactions/SignMessage'; +} from '_src/shared/messaging/messages/payloads/transactions/signMessage'; import { type IotaTransactionBlockResponse } from '@iota/iota-sdk/client'; import type { Runtime } from 'webextension-polyfill'; import { type SignedTransaction } from '@iota/wallet-standard'; import { getAccountsStatusData } from '../accounts'; -import NetworkEnv from '../NetworkEnv'; -import { Connection } from './Connection'; +import NetworkEnv from '../networkEnv'; +import { Connection } from './connection'; export class ContentScriptConnection extends Connection { public static readonly CHANNEL: PortChannelName = 'iota_content<->background'; diff --git a/apps/wallet/src/background/connections/index.ts b/apps/wallet/src/background/connections/index.ts index d6b5c3c591b..62ee3912a24 100644 --- a/apps/wallet/src/background/connections/index.ts +++ b/apps/wallet/src/background/connections/index.ts @@ -7,12 +7,12 @@ import type { SetNetworkPayload } from '_payloads/network'; import type { Permission } from '_payloads/permissions'; import type { WalletStatusChange, WalletStatusChangePayload } from '_payloads/wallet-status-change'; import type { NetworkEnvType } from '@iota/core'; -import { type UIAccessibleEntityType } from '_src/shared/messaging/messages/payloads/MethodPayload'; +import { type UIAccessibleEntityType } from '_src/shared/messaging/messages/payloads/methodPayload'; import Browser from 'webextension-polyfill'; -import type { Connection } from './Connection'; -import { ContentScriptConnection } from './ContentScriptConnection'; -import { UiConnection } from './UiConnection'; +import type { Connection } from './connection'; +import { ContentScriptConnection } from './contentScriptConnection'; +import { UiConnection } from './uiConnection'; const appOrigin = new URL(Browser.runtime.getURL('')).origin; diff --git a/apps/wallet/src/background/connections/UiConnection.ts b/apps/wallet/src/background/connections/uiConnection.ts similarity index 92% rename from apps/wallet/src/background/connections/UiConnection.ts rename to apps/wallet/src/background/connections/uiConnection.ts index 63cdbf79e19..f5115b1f58f 100644 --- a/apps/wallet/src/background/connections/UiConnection.ts +++ b/apps/wallet/src/background/connections/uiConnection.ts @@ -4,27 +4,27 @@ import { createMessage } from '_messages'; import type { Message } from '_messages'; -import type { PortChannelName } from '_messaging/PortChannelName'; +import type { PortChannelName } from '_src/shared/messaging/portChannelName'; import { isBasePayload, type ErrorPayload } from '_payloads'; import type { LoadedFeaturesPayload } from '_payloads/feature-gating'; import { isSetNetworkPayload, type SetNetworkPayload } from '_payloads/network'; import { isGetPermissionRequests, isPermissionResponse } from '_payloads/permissions'; import type { Permission, PermissionRequests } from '_payloads/permissions'; -import { isDisconnectApp } from '_payloads/permissions/DisconnectApp'; +import { isDisconnectApp } from '_src/shared/messaging/messages/payloads/permissions/disconnectApp'; import type { UpdateActiveOrigin } from '_payloads/tabs/updateActiveOrigin'; -import type { ApprovalRequest } from '_payloads/transactions/ApprovalRequest'; -import { isGetTransactionRequests } from '_payloads/transactions/ui/GetTransactionRequests'; -import type { GetTransactionRequestsResponse } from '_payloads/transactions/ui/GetTransactionRequestsResponse'; -import { isTransactionRequestResponse } from '_payloads/transactions/ui/TransactionRequestResponse'; -import Permissions from '_src/background/Permissions'; -import Tabs from '_src/background/Tabs'; -import Transactions from '_src/background/Transactions'; +import type { ApprovalRequest } from '_src/shared/messaging/messages/payloads/transactions/approvalRequest'; +import { isGetTransactionRequests } from '_src/shared/messaging/messages/payloads/transactions/ui/getTransactionRequests'; +import type { GetTransactionRequestsResponse } from '_src/shared/messaging/messages/payloads/transactions/ui/getTransactionRequestsResponse'; +import { isTransactionRequestResponse } from '_src/shared/messaging/messages/payloads/transactions/ui/transactionRequestResponse'; +import Permissions from '_src/background/permissions'; +import Tabs from '_src/background/tabs'; +import Transactions from '_src/background/transactions'; import { growthbook } from '_src/shared/experimentation/features'; import { isMethodPayload, type MethodPayload, type UIAccessibleEntityType, -} from '_src/shared/messaging/messages/payloads/MethodPayload'; +} from '_src/shared/messaging/messages/payloads/methodPayload'; import { toEntropy } from '_src/shared/utils'; import Dexie from 'dexie'; import { BehaviorSubject, filter, switchMap, takeUntil } from 'rxjs'; @@ -37,7 +37,7 @@ import { getAllSerializedUIAccountSources, } from '../account-sources'; import { accountSourcesEvents } from '../account-sources/events'; -import { MnemonicAccountSource } from '../account-sources/MnemonicAccountSource'; +import { MnemonicAccountSource } from '../account-sources/mnemonicAccountSource'; import { accountsHandleUIMessage, addNewAccounts, @@ -45,16 +45,16 @@ import { getAllSerializedUIAccounts, } from '../accounts'; import { accountsEvents } from '../accounts/events'; -import { getAutoLockMinutes, notifyUserActive, setAutoLockMinutes } from '../auto-lock-accounts'; +import { getAutoLockMinutes, notifyUserActive, setAutoLockMinutes } from '../autoLockAccounts'; import { backupDB, getDB, SETTINGS_KEYS } from '../db'; -import { clearStatus, doMigration, getStatus } from '../storage-migration'; -import NetworkEnv from '../NetworkEnv'; -import { Connection } from './Connection'; -import { SeedAccountSource } from '../account-sources/SeedAccountSource'; -import { AccountSourceType } from '../account-sources/AccountSource'; +import { clearStatus, doMigration, getStatus } from '../storageMigration'; +import NetworkEnv from '../networkEnv'; +import { Connection } from './connection'; +import { SeedAccountSource } from '../account-sources/seedAccountSource'; +import { AccountSourceType } from '../account-sources/accountSource'; import { isDeriveBipPathAccountsFinder, isPersistAccountsFinder } from '_payloads/accounts-finder'; -import type { SerializedAccount } from '../accounts/Account'; -import { LedgerAccount } from '../accounts/LedgerAccount'; +import type { SerializedAccount } from '../accounts/account'; +import { LedgerAccount } from '../accounts/ledgerAccount'; export class UiConnection extends Connection { public static readonly CHANNEL: PortChannelName = 'iota_ui<->background'; diff --git a/apps/wallet/src/background/db.ts b/apps/wallet/src/background/db.ts index 71ecbedcc82..43acb34afed 100644 --- a/apps/wallet/src/background/db.ts +++ b/apps/wallet/src/background/db.ts @@ -5,10 +5,10 @@ import Dexie, { type Table } from 'dexie'; import { exportDB, importDB } from 'dexie-export-import'; -import { type AccountSourceSerialized } from './account-sources/AccountSource'; -import { type SerializedAccount } from './accounts/Account'; +import { type AccountSourceSerialized } from './account-sources/accountSource'; +import { type SerializedAccount } from './accounts/account'; import { captureException } from './sentry'; -import { getFromLocalStorage, setToLocalStorage } from './storage-utils'; +import { getFromLocalStorage, setToLocalStorage } from './storageUtils'; const DB_NAME = 'IotaWallet DB'; const DB_LOCAL_STORAGE_BACKUP_KEY = 'indexed-db-backup'; diff --git a/apps/wallet/src/background/index.ts b/apps/wallet/src/background/index.ts index 338679105f2..4fb42a4ae0a 100644 --- a/apps/wallet/src/background/index.ts +++ b/apps/wallet/src/background/index.ts @@ -11,12 +11,12 @@ import { lockAllAccountSources } from './account-sources'; import { accountSourcesEvents } from './account-sources/events'; import { getAccountsStatusData, getAllAccounts, lockAllAccounts } from './accounts'; import { accountsEvents } from './accounts/events'; -import Alarms, { AUTO_LOCK_ALARM_NAME, CLEAN_UP_ALARM_NAME } from './Alarms'; +import Alarms, { AUTO_LOCK_ALARM_NAME, CLEAN_UP_ALARM_NAME } from './alarms'; import { Connections } from './connections'; -import NetworkEnv from './NetworkEnv'; -import Permissions from './Permissions'; +import NetworkEnv from './networkEnv'; +import Permissions from './permissions'; import { initSentry } from './sentry'; -import Transactions from './Transactions'; +import Transactions from './transactions'; growthbook.loadFeatures().catch(() => { // silence the error diff --git a/apps/wallet/src/background/NetworkEnv.ts b/apps/wallet/src/background/networkEnv.ts similarity index 100% rename from apps/wallet/src/background/NetworkEnv.ts rename to apps/wallet/src/background/networkEnv.ts diff --git a/apps/wallet/src/background/Permissions.ts b/apps/wallet/src/background/permissions.ts similarity index 98% rename from apps/wallet/src/background/Permissions.ts rename to apps/wallet/src/background/permissions.ts index 42c85b8cdf4..6fa604b55a0 100644 --- a/apps/wallet/src/background/Permissions.ts +++ b/apps/wallet/src/background/permissions.ts @@ -10,9 +10,9 @@ import type { Observable } from 'rxjs'; import { v4 as uuidV4 } from 'uuid'; import Browser from 'webextension-polyfill'; -import type { ContentScriptConnection } from './connections/ContentScriptConnection'; -import Tabs from './Tabs'; -import { Window } from './Window'; +import type { ContentScriptConnection } from './connections/contentScriptConnection'; +import Tabs from './tabs'; +import { Window } from './window'; const PERMISSIONS_STORAGE_KEY = 'permissions'; const PERMISSION_UI_URL = `${Browser.runtime.getURL('ui.html')}#/dapp/connect/`; diff --git a/apps/wallet/src/background/sentry.ts b/apps/wallet/src/background/sentry.ts index e95d0f9c70b..b5f70562c84 100644 --- a/apps/wallet/src/background/sentry.ts +++ b/apps/wallet/src/background/sentry.ts @@ -3,7 +3,7 @@ // SPDX-License-Identifier: Apache-2.0 import { growthbook } from '_src/shared/experimentation/features'; -import { getSentryConfig } from '_src/shared/sentry-config'; +import { getSentryConfig } from '_src/shared/sentryConfig'; import * as Sentry from '@sentry/browser'; import { Feature } from '@iota/core'; diff --git a/apps/wallet/src/background/session-ephemeral-values.ts b/apps/wallet/src/background/sessionEphemeralValues.ts similarity index 94% rename from apps/wallet/src/background/session-ephemeral-values.ts rename to apps/wallet/src/background/sessionEphemeralValues.ts index ae820d67b13..b5a9c328f13 100644 --- a/apps/wallet/src/background/session-ephemeral-values.ts +++ b/apps/wallet/src/background/sessionEphemeralValues.ts @@ -7,7 +7,7 @@ import { getEncryptedFromSessionStorage, removeFromSessionStorage, setToSessionStorageEncrypted, -} from '_src/background/storage-utils'; +} from '_src/background/storageUtils'; export function getEphemeralValue<T extends Serializable>(id: string) { return getEncryptedFromSessionStorage<T>(id); diff --git a/apps/wallet/src/background/storage-migration.ts b/apps/wallet/src/background/storageMigration.ts similarity index 93% rename from apps/wallet/src/background/storage-migration.ts rename to apps/wallet/src/background/storageMigration.ts index a78813e380e..5c11b9bda19 100644 --- a/apps/wallet/src/background/storage-migration.ts +++ b/apps/wallet/src/background/storageMigration.ts @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { getFromLocalStorage } from './storage-utils'; +import { getFromLocalStorage } from './storageUtils'; export type Status = 'required' | 'inProgress' | 'ready'; diff --git a/apps/wallet/src/background/storage-utils.ts b/apps/wallet/src/background/storageUtils.ts similarity index 100% rename from apps/wallet/src/background/storage-utils.ts rename to apps/wallet/src/background/storageUtils.ts diff --git a/apps/wallet/src/background/Tabs.ts b/apps/wallet/src/background/tabs.ts similarity index 100% rename from apps/wallet/src/background/Tabs.ts rename to apps/wallet/src/background/tabs.ts diff --git a/apps/wallet/src/background/Transactions.ts b/apps/wallet/src/background/transactions.ts similarity index 92% rename from apps/wallet/src/background/Transactions.ts rename to apps/wallet/src/background/transactions.ts index 6c696bf0b12..262b546c558 100644 --- a/apps/wallet/src/background/Transactions.ts +++ b/apps/wallet/src/background/transactions.ts @@ -5,18 +5,18 @@ import { type ApprovalRequest, type TransactionDataType, -} from '_payloads/transactions/ApprovalRequest'; -import type { IotaSignTransactionSerialized } from '_payloads/transactions/ExecuteTransactionRequest'; -import { type SignMessageRequest } from '_payloads/transactions/SignMessage'; -import type { TransactionRequestResponse } from '_payloads/transactions/ui/TransactionRequestResponse'; -import type { ContentScriptConnection } from '_src/background/connections/ContentScriptConnection'; +} from '_src/shared/messaging/messages/payloads/transactions/approvalRequest'; +import type { IotaSignTransactionSerialized } from '_src/shared/messaging/messages/payloads/transactions/executeTransactionRequest'; +import { type SignMessageRequest } from '_src/shared/messaging/messages/payloads/transactions/signMessage'; +import type { TransactionRequestResponse } from '_src/shared/messaging/messages/payloads/transactions/ui/transactionRequestResponse'; +import type { ContentScriptConnection } from '_src/background/connections/contentScriptConnection'; import { type IotaTransactionBlockResponse } from '@iota/iota-sdk/client'; import { type SignedTransaction, type IotaSignPersonalMessageOutput } from '@iota/wallet-standard'; import { filter, lastValueFrom, map, race, Subject, take } from 'rxjs'; import { v4 as uuidV4 } from 'uuid'; import Browser from 'webextension-polyfill'; -import { Window } from './Window'; +import { Window } from './window'; const STALE_TRANSACTION_MILLISECONDS = 1000 * 60 * 60 * 3; // 3 hours const TX_STORE_KEY = 'transactions'; diff --git a/apps/wallet/src/background/Window.ts b/apps/wallet/src/background/window.ts similarity index 100% rename from apps/wallet/src/background/Window.ts rename to apps/wallet/src/background/window.ts diff --git a/apps/wallet/src/content-script/index.ts b/apps/wallet/src/content-script/index.ts index 9b3662e815d..11ce586b293 100644 --- a/apps/wallet/src/content-script/index.ts +++ b/apps/wallet/src/content-script/index.ts @@ -2,8 +2,8 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { injectDappInterface } from './interface-inject'; -import { setupMessagesProxy } from './messages-proxy'; +import { injectDappInterface } from './interfaceInject'; +import { setupMessagesProxy } from './messagesProxy'; injectDappInterface(); setupMessagesProxy(); diff --git a/apps/wallet/src/content-script/interface-inject.ts b/apps/wallet/src/content-script/interfaceInject.ts similarity index 100% rename from apps/wallet/src/content-script/interface-inject.ts rename to apps/wallet/src/content-script/interfaceInject.ts diff --git a/apps/wallet/src/content-script/messages-proxy.ts b/apps/wallet/src/content-script/messagesProxy.ts similarity index 89% rename from apps/wallet/src/content-script/messages-proxy.ts rename to apps/wallet/src/content-script/messagesProxy.ts index a366e0b5f64..198a4317f20 100644 --- a/apps/wallet/src/content-script/messages-proxy.ts +++ b/apps/wallet/src/content-script/messagesProxy.ts @@ -2,8 +2,8 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { PortStream } from '_messaging/PortStream'; -import { WindowMessageStream } from '_messaging/WindowMessageStream'; +import { PortStream } from '_src/shared/messaging/portStream'; +import { WindowMessageStream } from '_src/shared/messaging/windowMessageStream'; import type { Message } from '_src/shared/messaging/messages'; import { generateWalletMessageStreamIdentifiers } from '_src/shared/utils/generateWalletMessageStreamIdentifiers'; import { take } from 'rxjs'; diff --git a/apps/wallet/src/dapp-interface/index.ts b/apps/wallet/src/dapp-interface/index.ts index 1c27c20b54e..b79ccc1ed16 100644 --- a/apps/wallet/src/dapp-interface/index.ts +++ b/apps/wallet/src/dapp-interface/index.ts @@ -4,6 +4,6 @@ import { registerWallet } from '@iota/wallet-standard'; -import { IotaWallet } from './WalletStandardInterface'; +import { IotaWallet } from './walletStandardInterface'; registerWallet(new IotaWallet()); diff --git a/apps/wallet/src/dapp-interface/WalletStandardInterface.ts b/apps/wallet/src/dapp-interface/walletStandardInterface.ts similarity index 98% rename from apps/wallet/src/dapp-interface/WalletStandardInterface.ts rename to apps/wallet/src/dapp-interface/walletStandardInterface.ts index 5490718fdbc..03aaf9a10d2 100644 --- a/apps/wallet/src/dapp-interface/WalletStandardInterface.ts +++ b/apps/wallet/src/dapp-interface/walletStandardInterface.ts @@ -3,10 +3,10 @@ // SPDX-License-Identifier: Apache-2.0 import { createMessage } from '_messages'; -import { WindowMessageStream } from '_messaging/WindowMessageStream'; +import { WindowMessageStream } from '_src/shared/messaging/windowMessageStream'; import type { BasePayload, Payload } from '_payloads'; -import type { GetAccount } from '_payloads/account/GetAccount'; -import type { GetAccountResponse } from '_payloads/account/GetAccountResponse'; +import type { GetAccount } from '_src/shared/messaging/messages/payloads/account/getAccount'; +import type { GetAccountResponse } from '_src/shared/messaging/messages/payloads/account/getAccountResponse'; import type { SetNetworkPayload } from '_payloads/network'; import { ALL_PERMISSION_TYPES, @@ -22,7 +22,7 @@ import type { SignTransactionResponse, } from '_payloads/transactions'; import { getCustomNetwork, type NetworkEnvType } from '@iota/core'; -import { type SignMessageRequest } from '_src/shared/messaging/messages/payloads/transactions/SignMessage'; +import { type SignMessageRequest } from '_src/shared/messaging/messages/payloads/transactions/signMessage'; import { isWalletStatusChangePayload } from '_src/shared/messaging/messages/payloads/wallet-status-change'; import { getNetwork, Network, type ChainType } from '@iota/iota-sdk/client'; import { fromB64, toB64 } from '@iota/iota-sdk/utils'; diff --git a/apps/wallet/src/shared/iota-client.ts b/apps/wallet/src/shared/iotaClient.ts similarity index 96% rename from apps/wallet/src/shared/iota-client.ts rename to apps/wallet/src/shared/iotaClient.ts index 20af64d663b..8c0d49d7d8f 100644 --- a/apps/wallet/src/shared/iota-client.ts +++ b/apps/wallet/src/shared/iotaClient.ts @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import networkEnv from '_src/background/NetworkEnv'; +import networkEnv from '_src/background/networkEnv'; import { type NetworkEnvType, SentryHttpTransport } from '@iota/core'; import { getNetwork, Network, IotaClient, IotaHTTPTransport } from '@iota/iota-sdk/client'; diff --git a/apps/wallet/src/shared/messaging/messages/index.ts b/apps/wallet/src/shared/messaging/messages/index.ts index bfb0e742de3..82b4b20ae1e 100644 --- a/apps/wallet/src/shared/messaging/messages/index.ts +++ b/apps/wallet/src/shared/messaging/messages/index.ts @@ -2,4 +2,4 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -export * from './Message'; +export * from './message'; diff --git a/apps/wallet/src/shared/messaging/messages/Message.ts b/apps/wallet/src/shared/messaging/messages/message.ts similarity index 88% rename from apps/wallet/src/shared/messaging/messages/Message.ts rename to apps/wallet/src/shared/messaging/messages/message.ts index 369f7e9b9cd..23e65cc6612 100644 --- a/apps/wallet/src/shared/messaging/messages/Message.ts +++ b/apps/wallet/src/shared/messaging/messages/message.ts @@ -4,7 +4,7 @@ import { v4 as uuidV4 } from 'uuid'; -import type { Payload } from './payloads/Payload'; +import type { Payload } from './payloads/payload'; export type Message = { id: string; diff --git a/apps/wallet/src/shared/messaging/messages/payloads/account/GetAccount.ts b/apps/wallet/src/shared/messaging/messages/payloads/account/getAccount.ts similarity index 100% rename from apps/wallet/src/shared/messaging/messages/payloads/account/GetAccount.ts rename to apps/wallet/src/shared/messaging/messages/payloads/account/getAccount.ts diff --git a/apps/wallet/src/shared/messaging/messages/payloads/account/GetAccountResponse.ts b/apps/wallet/src/shared/messaging/messages/payloads/account/getAccountResponse.ts similarity index 100% rename from apps/wallet/src/shared/messaging/messages/payloads/account/GetAccountResponse.ts rename to apps/wallet/src/shared/messaging/messages/payloads/account/getAccountResponse.ts diff --git a/apps/wallet/src/shared/messaging/messages/payloads/accounts-finder/DeriveBipPathAccountsFinder.ts b/apps/wallet/src/shared/messaging/messages/payloads/accounts-finder/deriveBipPathAccountsFinder.ts similarity index 100% rename from apps/wallet/src/shared/messaging/messages/payloads/accounts-finder/DeriveBipPathAccountsFinder.ts rename to apps/wallet/src/shared/messaging/messages/payloads/accounts-finder/deriveBipPathAccountsFinder.ts diff --git a/apps/wallet/src/shared/messaging/messages/payloads/accounts-finder/index.ts b/apps/wallet/src/shared/messaging/messages/payloads/accounts-finder/index.ts index db6a662751c..f3012894048 100644 --- a/apps/wallet/src/shared/messaging/messages/payloads/accounts-finder/index.ts +++ b/apps/wallet/src/shared/messaging/messages/payloads/accounts-finder/index.ts @@ -1,6 +1,6 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -export * from './DeriveBipPathAccountsFinder'; -export * from './PersistAccountsFinder'; +export * from './deriveBipPathAccountsFinder'; +export * from './persistAccountsFinder'; export * from './types'; diff --git a/apps/wallet/src/shared/messaging/messages/payloads/accounts-finder/PersistAccountsFinder.ts b/apps/wallet/src/shared/messaging/messages/payloads/accounts-finder/persistAccountsFinder.ts similarity index 100% rename from apps/wallet/src/shared/messaging/messages/payloads/accounts-finder/PersistAccountsFinder.ts rename to apps/wallet/src/shared/messaging/messages/payloads/accounts-finder/persistAccountsFinder.ts diff --git a/apps/wallet/src/shared/messaging/messages/payloads/BasePayload.ts b/apps/wallet/src/shared/messaging/messages/payloads/basePayload.ts similarity index 96% rename from apps/wallet/src/shared/messaging/messages/payloads/BasePayload.ts rename to apps/wallet/src/shared/messaging/messages/payloads/basePayload.ts index 4de18c06bdc..52ab6d2e254 100644 --- a/apps/wallet/src/shared/messaging/messages/payloads/BasePayload.ts +++ b/apps/wallet/src/shared/messaging/messages/payloads/basePayload.ts @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import type { Payload } from './Payload'; +import type { Payload } from './payload'; export type PayloadType = | 'permission-request' diff --git a/apps/wallet/src/shared/messaging/messages/payloads/ErrorPayload.ts b/apps/wallet/src/shared/messaging/messages/payloads/errorPayload.ts similarity index 89% rename from apps/wallet/src/shared/messaging/messages/payloads/ErrorPayload.ts rename to apps/wallet/src/shared/messaging/messages/payloads/errorPayload.ts index bfd70d93483..95187f90d56 100644 --- a/apps/wallet/src/shared/messaging/messages/payloads/ErrorPayload.ts +++ b/apps/wallet/src/shared/messaging/messages/payloads/errorPayload.ts @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import type { Payload } from './Payload'; +import type { Payload } from './payload'; export interface ErrorPayload { error: true; diff --git a/apps/wallet/src/shared/messaging/messages/payloads/index.ts b/apps/wallet/src/shared/messaging/messages/payloads/index.ts index 5a8e3e4bb03..d9095538c30 100644 --- a/apps/wallet/src/shared/messaging/messages/payloads/index.ts +++ b/apps/wallet/src/shared/messaging/messages/payloads/index.ts @@ -2,6 +2,6 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -export * from './BasePayload'; -export * from './ErrorPayload'; -export * from './Payload'; +export * from './basePayload'; +export * from './errorPayload'; +export * from './payload'; diff --git a/apps/wallet/src/shared/messaging/messages/payloads/MethodPayload.ts b/apps/wallet/src/shared/messaging/messages/payloads/methodPayload.ts similarity index 93% rename from apps/wallet/src/shared/messaging/messages/payloads/MethodPayload.ts rename to apps/wallet/src/shared/messaging/messages/payloads/methodPayload.ts index 8672bc8653d..d4de79ecdc7 100644 --- a/apps/wallet/src/shared/messaging/messages/payloads/MethodPayload.ts +++ b/apps/wallet/src/shared/messaging/messages/payloads/methodPayload.ts @@ -5,12 +5,12 @@ import type { AccountSourceType, AccountSourceSerializedUI, -} from '_src/background/account-sources/AccountSource'; -import type { AccountType, SerializedUIAccount } from '_src/background/accounts/Account'; -import { type Status } from '_src/background/storage-migration'; +} from '_src/background/account-sources/accountSource'; +import type { AccountType, SerializedUIAccount } from '_src/background/accounts/account'; +import { type Status } from '_src/background/storageMigration'; -import { isBasePayload } from './BasePayload'; -import type { Payload } from './Payload'; +import { isBasePayload } from './basePayload'; +import type { Payload } from './payload'; export type UIAccessibleEntityType = 'accountSources' | 'accounts'; export type LedgerAccountsPublicKeys = { diff --git a/apps/wallet/src/shared/messaging/messages/payloads/Payload.ts b/apps/wallet/src/shared/messaging/messages/payloads/payload.ts similarity index 63% rename from apps/wallet/src/shared/messaging/messages/payloads/Payload.ts rename to apps/wallet/src/shared/messaging/messages/payloads/payload.ts index c498bf73bbe..0a852ad8257 100644 --- a/apps/wallet/src/shared/messaging/messages/payloads/Payload.ts +++ b/apps/wallet/src/shared/messaging/messages/payloads/payload.ts @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import type { BasePayload } from './BasePayload'; -import type { ErrorPayload } from './ErrorPayload'; +import type { BasePayload } from './basePayload'; +import type { ErrorPayload } from './errorPayload'; export type Payload = BasePayload | ErrorPayload; diff --git a/apps/wallet/src/shared/messaging/messages/payloads/permissions/AcquirePermissionsRequest.ts b/apps/wallet/src/shared/messaging/messages/payloads/permissions/acquirePermissionsRequest.ts similarity index 91% rename from apps/wallet/src/shared/messaging/messages/payloads/permissions/AcquirePermissionsRequest.ts rename to apps/wallet/src/shared/messaging/messages/payloads/permissions/acquirePermissionsRequest.ts index e78a952a67f..e34ec0f864b 100644 --- a/apps/wallet/src/shared/messaging/messages/payloads/permissions/AcquirePermissionsRequest.ts +++ b/apps/wallet/src/shared/messaging/messages/payloads/permissions/acquirePermissionsRequest.ts @@ -5,7 +5,7 @@ import { isBasePayload } from '_payloads'; import type { BasePayload, Payload } from '_payloads'; -import type { PermissionType } from './PermissionType'; +import type { PermissionType } from './permissionType'; export interface AcquirePermissionsRequest extends BasePayload { type: 'acquire-permissions-request'; diff --git a/apps/wallet/src/shared/messaging/messages/payloads/permissions/AcquirePermissionsResponse.ts b/apps/wallet/src/shared/messaging/messages/payloads/permissions/acquirePermissionsResponse.ts similarity index 100% rename from apps/wallet/src/shared/messaging/messages/payloads/permissions/AcquirePermissionsResponse.ts rename to apps/wallet/src/shared/messaging/messages/payloads/permissions/acquirePermissionsResponse.ts diff --git a/apps/wallet/src/shared/messaging/messages/payloads/permissions/DisconnectApp.ts b/apps/wallet/src/shared/messaging/messages/payloads/permissions/disconnectApp.ts similarity index 100% rename from apps/wallet/src/shared/messaging/messages/payloads/permissions/DisconnectApp.ts rename to apps/wallet/src/shared/messaging/messages/payloads/permissions/disconnectApp.ts diff --git a/apps/wallet/src/shared/messaging/messages/payloads/permissions/GetPermissionRequests.ts b/apps/wallet/src/shared/messaging/messages/payloads/permissions/getPermissionRequests.ts similarity index 100% rename from apps/wallet/src/shared/messaging/messages/payloads/permissions/GetPermissionRequests.ts rename to apps/wallet/src/shared/messaging/messages/payloads/permissions/getPermissionRequests.ts diff --git a/apps/wallet/src/shared/messaging/messages/payloads/permissions/HasPermissionsRequest.ts b/apps/wallet/src/shared/messaging/messages/payloads/permissions/hasPermissionsRequest.ts similarity index 90% rename from apps/wallet/src/shared/messaging/messages/payloads/permissions/HasPermissionsRequest.ts rename to apps/wallet/src/shared/messaging/messages/payloads/permissions/hasPermissionsRequest.ts index 507970c5843..103b6812258 100644 --- a/apps/wallet/src/shared/messaging/messages/payloads/permissions/HasPermissionsRequest.ts +++ b/apps/wallet/src/shared/messaging/messages/payloads/permissions/hasPermissionsRequest.ts @@ -5,7 +5,7 @@ import { isBasePayload } from '_payloads'; import type { BasePayload, Payload } from '_payloads'; -import type { PermissionType } from './PermissionType'; +import type { PermissionType } from './permissionType'; export interface HasPermissionsRequest extends BasePayload { type: 'has-permissions-request'; diff --git a/apps/wallet/src/shared/messaging/messages/payloads/permissions/HasPermissionsResponse.ts b/apps/wallet/src/shared/messaging/messages/payloads/permissions/hasPermissionsResponse.ts similarity index 100% rename from apps/wallet/src/shared/messaging/messages/payloads/permissions/HasPermissionsResponse.ts rename to apps/wallet/src/shared/messaging/messages/payloads/permissions/hasPermissionsResponse.ts diff --git a/apps/wallet/src/shared/messaging/messages/payloads/permissions/index.ts b/apps/wallet/src/shared/messaging/messages/payloads/permissions/index.ts index 1e232093c81..68bca0392c9 100644 --- a/apps/wallet/src/shared/messaging/messages/payloads/permissions/index.ts +++ b/apps/wallet/src/shared/messaging/messages/payloads/permissions/index.ts @@ -2,12 +2,12 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -export * from './GetPermissionRequests'; -export * from './PermissionRequests'; -export * from './PermissionResponse'; -export * from './PermissionType'; -export * from './Permission'; -export * from './HasPermissionsRequest'; -export * from './HasPermissionsResponse'; -export * from './AcquirePermissionsRequest'; -export * from './AcquirePermissionsResponse'; +export * from './getPermissionRequests'; +export * from './permissionRequests'; +export * from './permissionResponse'; +export * from './permissionType'; +export * from './permission'; +export * from './hasPermissionsRequest'; +export * from './hasPermissionsResponse'; +export * from './acquirePermissionsRequest'; +export * from './acquirePermissionsResponse'; diff --git a/apps/wallet/src/shared/messaging/messages/payloads/permissions/Permission.ts b/apps/wallet/src/shared/messaging/messages/payloads/permissions/permission.ts similarity index 91% rename from apps/wallet/src/shared/messaging/messages/payloads/permissions/Permission.ts rename to apps/wallet/src/shared/messaging/messages/payloads/permissions/permission.ts index 61a79756ebd..c9e7fe93dd0 100644 --- a/apps/wallet/src/shared/messaging/messages/payloads/permissions/Permission.ts +++ b/apps/wallet/src/shared/messaging/messages/payloads/permissions/permission.ts @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import type { PermissionType } from './PermissionType'; +import type { PermissionType } from './permissionType'; //TODO: add description, name, tags //TODO add PageLink for instance where the origin and the wallet landing page are different. diff --git a/apps/wallet/src/shared/messaging/messages/payloads/permissions/PermissionRequests.ts b/apps/wallet/src/shared/messaging/messages/payloads/permissions/permissionRequests.ts similarity index 91% rename from apps/wallet/src/shared/messaging/messages/payloads/permissions/PermissionRequests.ts rename to apps/wallet/src/shared/messaging/messages/payloads/permissions/permissionRequests.ts index 0bae8c97003..52b98ea1177 100644 --- a/apps/wallet/src/shared/messaging/messages/payloads/permissions/PermissionRequests.ts +++ b/apps/wallet/src/shared/messaging/messages/payloads/permissions/permissionRequests.ts @@ -4,7 +4,7 @@ import { isBasePayload } from '_payloads'; import type { BasePayload, Payload } from '_payloads'; -import type { Permission } from './Permission'; +import type { Permission } from './permission'; export interface PermissionRequests extends BasePayload { type: 'permission-request'; diff --git a/apps/wallet/src/shared/messaging/messages/payloads/permissions/PermissionResponse.ts b/apps/wallet/src/shared/messaging/messages/payloads/permissions/permissionResponse.ts similarity index 100% rename from apps/wallet/src/shared/messaging/messages/payloads/permissions/PermissionResponse.ts rename to apps/wallet/src/shared/messaging/messages/payloads/permissions/permissionResponse.ts diff --git a/apps/wallet/src/shared/messaging/messages/payloads/permissions/PermissionType.ts b/apps/wallet/src/shared/messaging/messages/payloads/permissions/permissionType.ts similarity index 100% rename from apps/wallet/src/shared/messaging/messages/payloads/permissions/PermissionType.ts rename to apps/wallet/src/shared/messaging/messages/payloads/permissions/permissionType.ts diff --git a/apps/wallet/src/shared/messaging/messages/payloads/transactions/ApprovalRequest.ts b/apps/wallet/src/shared/messaging/messages/payloads/transactions/approvalRequest.ts similarity index 96% rename from apps/wallet/src/shared/messaging/messages/payloads/transactions/ApprovalRequest.ts rename to apps/wallet/src/shared/messaging/messages/payloads/transactions/approvalRequest.ts index 80685dd2aa6..1b71203744f 100644 --- a/apps/wallet/src/shared/messaging/messages/payloads/transactions/ApprovalRequest.ts +++ b/apps/wallet/src/shared/messaging/messages/payloads/transactions/approvalRequest.ts @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { type SignedTransaction } from '_src/ui/app/WalletSigner'; +import { type SignedTransaction } from '_src/ui/app/walletSigner'; import type { IotaTransactionBlockResponse } from '@iota/iota-sdk/client'; import { type IotaSignAndExecuteTransactionInput, diff --git a/apps/wallet/src/shared/messaging/messages/payloads/transactions/ExecuteTransactionRequest.ts b/apps/wallet/src/shared/messaging/messages/payloads/transactions/executeTransactionRequest.ts similarity index 94% rename from apps/wallet/src/shared/messaging/messages/payloads/transactions/ExecuteTransactionRequest.ts rename to apps/wallet/src/shared/messaging/messages/payloads/transactions/executeTransactionRequest.ts index b7d636006e2..c363f0bd9c9 100644 --- a/apps/wallet/src/shared/messaging/messages/payloads/transactions/ExecuteTransactionRequest.ts +++ b/apps/wallet/src/shared/messaging/messages/payloads/transactions/executeTransactionRequest.ts @@ -6,7 +6,7 @@ import { isBasePayload } from '_payloads'; import type { BasePayload, Payload } from '_payloads'; import { type IotaSignTransactionInput } from '@iota/wallet-standard'; -import { type TransactionDataType } from './ApprovalRequest'; +import { type TransactionDataType } from './approvalRequest'; export interface ExecuteTransactionRequest extends BasePayload { type: 'execute-transaction-request'; diff --git a/apps/wallet/src/shared/messaging/messages/payloads/transactions/ExecuteTransactionResponse.ts b/apps/wallet/src/shared/messaging/messages/payloads/transactions/executeTransactionResponse.ts similarity index 100% rename from apps/wallet/src/shared/messaging/messages/payloads/transactions/ExecuteTransactionResponse.ts rename to apps/wallet/src/shared/messaging/messages/payloads/transactions/executeTransactionResponse.ts diff --git a/apps/wallet/src/shared/messaging/messages/payloads/transactions/index.ts b/apps/wallet/src/shared/messaging/messages/payloads/transactions/index.ts index ee98d0e2753..a8f2f2f4e55 100644 --- a/apps/wallet/src/shared/messaging/messages/payloads/transactions/index.ts +++ b/apps/wallet/src/shared/messaging/messages/payloads/transactions/index.ts @@ -2,5 +2,5 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -export * from './ExecuteTransactionRequest'; -export * from './ExecuteTransactionResponse'; +export * from './executeTransactionRequest'; +export * from './executeTransactionResponse'; diff --git a/apps/wallet/src/shared/messaging/messages/payloads/transactions/SignMessage.ts b/apps/wallet/src/shared/messaging/messages/payloads/transactions/signMessage.ts similarity index 85% rename from apps/wallet/src/shared/messaging/messages/payloads/transactions/SignMessage.ts rename to apps/wallet/src/shared/messaging/messages/payloads/transactions/signMessage.ts index 4dd520639b1..1ba70eb17a2 100644 --- a/apps/wallet/src/shared/messaging/messages/payloads/transactions/SignMessage.ts +++ b/apps/wallet/src/shared/messaging/messages/payloads/transactions/signMessage.ts @@ -4,8 +4,8 @@ import { type IotaSignPersonalMessageOutput } from '@iota/wallet-standard'; -import { isBasePayload, type BasePayload } from '../BasePayload'; -import { type Payload } from '../Payload'; +import { isBasePayload, type BasePayload } from '../basePayload'; +import { type Payload } from '../payload'; export interface SignMessageRequest extends BasePayload { type: 'sign-personal-message-request'; diff --git a/apps/wallet/src/shared/messaging/messages/payloads/transactions/ui/GetTransactionRequests.ts b/apps/wallet/src/shared/messaging/messages/payloads/transactions/ui/getTransactionRequests.ts similarity index 100% rename from apps/wallet/src/shared/messaging/messages/payloads/transactions/ui/GetTransactionRequests.ts rename to apps/wallet/src/shared/messaging/messages/payloads/transactions/ui/getTransactionRequests.ts diff --git a/apps/wallet/src/shared/messaging/messages/payloads/transactions/ui/GetTransactionRequestsResponse.ts b/apps/wallet/src/shared/messaging/messages/payloads/transactions/ui/getTransactionRequestsResponse.ts similarity index 84% rename from apps/wallet/src/shared/messaging/messages/payloads/transactions/ui/GetTransactionRequestsResponse.ts rename to apps/wallet/src/shared/messaging/messages/payloads/transactions/ui/getTransactionRequestsResponse.ts index df6f7df89ab..5bcb3534579 100644 --- a/apps/wallet/src/shared/messaging/messages/payloads/transactions/ui/GetTransactionRequestsResponse.ts +++ b/apps/wallet/src/shared/messaging/messages/payloads/transactions/ui/getTransactionRequestsResponse.ts @@ -4,7 +4,7 @@ import { isBasePayload } from '_payloads'; import type { BasePayload, Payload } from '_payloads'; -import type { ApprovalRequest } from '_payloads/transactions/ApprovalRequest'; +import type { ApprovalRequest } from '_src/shared/messaging/messages/payloads/transactions/approvalRequest'; export interface GetTransactionRequestsResponse extends BasePayload { type: 'get-transaction-requests-response'; diff --git a/apps/wallet/src/shared/messaging/messages/payloads/transactions/ui/TransactionRequestResponse.ts b/apps/wallet/src/shared/messaging/messages/payloads/transactions/ui/transactionRequestResponse.ts similarity index 93% rename from apps/wallet/src/shared/messaging/messages/payloads/transactions/ui/TransactionRequestResponse.ts rename to apps/wallet/src/shared/messaging/messages/payloads/transactions/ui/transactionRequestResponse.ts index ccfc53a55c3..427e5e18a02 100644 --- a/apps/wallet/src/shared/messaging/messages/payloads/transactions/ui/TransactionRequestResponse.ts +++ b/apps/wallet/src/shared/messaging/messages/payloads/transactions/ui/transactionRequestResponse.ts @@ -4,7 +4,7 @@ import { isBasePayload } from '_payloads'; import type { BasePayload, Payload } from '_payloads'; -import { type SignedTransaction } from '_src/ui/app/WalletSigner'; +import { type SignedTransaction } from '_src/ui/app/walletSigner'; import type { IotaTransactionBlockResponse } from '@iota/iota-sdk/client'; import { type IotaSignPersonalMessageOutput } from '@iota/wallet-standard'; diff --git a/apps/wallet/src/shared/messaging/PortChannelName.ts b/apps/wallet/src/shared/messaging/portChannelName.ts similarity index 100% rename from apps/wallet/src/shared/messaging/PortChannelName.ts rename to apps/wallet/src/shared/messaging/portChannelName.ts diff --git a/apps/wallet/src/shared/messaging/PortStream.ts b/apps/wallet/src/shared/messaging/portStream.ts similarity index 97% rename from apps/wallet/src/shared/messaging/PortStream.ts rename to apps/wallet/src/shared/messaging/portStream.ts index 728635900a5..d5262182870 100644 --- a/apps/wallet/src/shared/messaging/PortStream.ts +++ b/apps/wallet/src/shared/messaging/portStream.ts @@ -9,7 +9,7 @@ import type { Runtime } from 'webextension-polyfill'; import type { Message } from './messages'; import { isErrorPayload } from './messages/payloads'; -import type { PortChannelName } from './PortChannelName'; +import type { PortChannelName } from './portChannelName'; export class PortStream { private _messagesStream: Observable<Message>; diff --git a/apps/wallet/src/shared/messaging/WindowMessageStream.ts b/apps/wallet/src/shared/messaging/windowMessageStream.ts similarity index 100% rename from apps/wallet/src/shared/messaging/WindowMessageStream.ts rename to apps/wallet/src/shared/messaging/windowMessageStream.ts diff --git a/apps/wallet/src/shared/sentry-config.ts b/apps/wallet/src/shared/sentryConfig.ts similarity index 100% rename from apps/wallet/src/shared/sentry-config.ts rename to apps/wallet/src/shared/sentryConfig.ts diff --git a/apps/wallet/src/types/node-env.d.ts b/apps/wallet/src/types/nodeEnv.d.ts similarity index 100% rename from apps/wallet/src/types/node-env.d.ts rename to apps/wallet/src/types/nodeEnv.d.ts diff --git a/apps/wallet/src/types/scss-modules.d.ts b/apps/wallet/src/types/scssModules.d.ts similarity index 100% rename from apps/wallet/src/types/scss-modules.d.ts rename to apps/wallet/src/types/scssModules.d.ts diff --git a/apps/wallet/src/types/webextension-polyfill.d.ts b/apps/wallet/src/types/webExtensionPolyfill.d.ts similarity index 100% rename from apps/wallet/src/types/webextension-polyfill.d.ts rename to apps/wallet/src/types/webExtensionPolyfill.d.ts 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 f9cba5ad5f9..b7ffa940f6e 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 @@ -1,7 +1,7 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { recoverAccounts, mergeAccounts } from './accounts-finder'; +import { recoverAccounts, mergeAccounts } from './utils'; import { assert, test } from 'vitest'; import { FindBalance } from './types'; diff --git a/apps/wallet/src/ui/app/accounts-finder/AccountsFinder.ts b/apps/wallet/src/ui/app/accounts-finder/accountsFinder.ts similarity index 99% rename from apps/wallet/src/ui/app/accounts-finder/AccountsFinder.ts rename to apps/wallet/src/ui/app/accounts-finder/accountsFinder.ts index fadd3ca1b97..1205d75ae63 100644 --- a/apps/wallet/src/ui/app/accounts-finder/AccountsFinder.ts +++ b/apps/wallet/src/ui/app/accounts-finder/accountsFinder.ts @@ -2,7 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 import type { AccountFromFinder, AddressFromFinder } from '_src/shared/accounts'; -import { diffAddressesBipPaths, mergeAccounts, recoverAccounts } from './accounts-finder'; +import { diffAddressesBipPaths, mergeAccounts, recoverAccounts } from './utils'; import type { IotaClient } from '@iota/iota-sdk/client'; import { getEmptyBalance } from './helpers'; import type { FindBalance } from './types'; diff --git a/apps/wallet/src/ui/app/accounts-finder/index.ts b/apps/wallet/src/ui/app/accounts-finder/index.ts index d29d857a2b7..503eb19b16e 100644 --- a/apps/wallet/src/ui/app/accounts-finder/index.ts +++ b/apps/wallet/src/ui/app/accounts-finder/index.ts @@ -1,4 +1,4 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -export * from './accounts-finder'; -export * from './AccountsFinder'; +export * from './utils'; +export * from './accountsFinder'; diff --git a/apps/wallet/src/ui/app/accounts-finder/accounts-finder.ts b/apps/wallet/src/ui/app/accounts-finder/utils.ts similarity index 100% rename from apps/wallet/src/ui/app/accounts-finder/accounts-finder.ts rename to apps/wallet/src/ui/app/accounts-finder/utils.ts diff --git a/apps/wallet/src/ui/app/ApiProvider.ts b/apps/wallet/src/ui/app/apiProvider.ts similarity index 93% rename from apps/wallet/src/ui/app/ApiProvider.ts rename to apps/wallet/src/ui/app/apiProvider.ts index 578a0c9418f..853de3a5d7b 100644 --- a/apps/wallet/src/ui/app/ApiProvider.ts +++ b/apps/wallet/src/ui/app/apiProvider.ts @@ -2,14 +2,14 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { AccountType, type SerializedUIAccount } from '_src/background/accounts/Account'; -import { getIotaClient } from '_src/shared/iota-client'; +import { AccountType, type SerializedUIAccount } from '_src/background/accounts/account'; +import { getIotaClient } from '_src/shared/iotaClient'; import { getDefaultNetwork, Network, type IotaClient } from '@iota/iota-sdk/client'; import type { BackgroundClient } from './background-client'; -import { BackgroundServiceSigner } from './background-client/BackgroundServiceSigner'; +import { BackgroundServiceSigner } from './background-client/backgroundServiceSigner'; import { queryClient } from './helpers/queryClient'; -import { type WalletSigner } from './WalletSigner'; +import { type WalletSigner } from './walletSigner'; const ACCOUNT_TYPES_WITH_BACKGROUND_SIGNER: AccountType[] = [ AccountType.MnemonicDerived, @@ -17,7 +17,7 @@ const ACCOUNT_TYPES_WITH_BACKGROUND_SIGNER: AccountType[] = [ AccountType.PrivateKeyDerived, ]; -export default class ApiProvider { +class ApiProvider { private _apiFullNodeProvider?: IotaClient; private _signerByAddress: Map<string, WalletSigner> = new Map(); network = getDefaultNetwork(); diff --git a/apps/wallet/src/ui/app/background-client/BackgroundServiceSigner.ts b/apps/wallet/src/ui/app/background-client/backgroundServiceSigner.ts similarity index 94% rename from apps/wallet/src/ui/app/background-client/BackgroundServiceSigner.ts rename to apps/wallet/src/ui/app/background-client/backgroundServiceSigner.ts index e7991e7bfc1..a61cfaa60de 100644 --- a/apps/wallet/src/ui/app/background-client/BackgroundServiceSigner.ts +++ b/apps/wallet/src/ui/app/background-client/backgroundServiceSigner.ts @@ -2,11 +2,11 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { type SerializedUIAccount } from '_src/background/accounts/Account'; +import { type SerializedUIAccount } from '_src/background/accounts/account'; import { type IotaClient } from '@iota/iota-sdk/client'; import type { BackgroundClient } from '.'; -import { WalletSigner } from '../WalletSigner'; +import { WalletSigner } from '../walletSigner'; export class BackgroundServiceSigner extends WalletSigner { readonly #account: SerializedUIAccount; diff --git a/apps/wallet/src/ui/app/background-client/index.ts b/apps/wallet/src/ui/app/background-client/index.ts index a6da569d7fc..9bd8b8b8c6b 100644 --- a/apps/wallet/src/ui/app/background-client/index.ts +++ b/apps/wallet/src/ui/app/background-client/index.ts @@ -4,40 +4,39 @@ import { createMessage } from '_messages'; import type { Message } from '_messages'; -import { PortStream } from '_messaging/PortStream'; +import { PortStream } from '_src/shared/messaging/portStream'; import { type BasePayload } from '_payloads'; import { isLoadedFeaturesPayload } from '_payloads/feature-gating'; import { isSetNetworkPayload, type SetNetworkPayload } from '_payloads/network'; import { isPermissionRequests } from '_payloads/permissions'; import type { GetPermissionRequests, PermissionResponse } from '_payloads/permissions'; -import type { DisconnectApp } from '_payloads/permissions/DisconnectApp'; +import type { DisconnectApp } from '_src/shared/messaging/messages/payloads/permissions/disconnectApp'; import { isUpdateActiveOrigin } from '_payloads/tabs/updateActiveOrigin'; -import type { GetTransactionRequests } from '_payloads/transactions/ui/GetTransactionRequests'; -import { isGetTransactionRequestsResponse } from '_payloads/transactions/ui/GetTransactionRequestsResponse'; -import type { TransactionRequestResponse } from '_payloads/transactions/ui/TransactionRequestResponse'; +import type { GetTransactionRequests } from '_src/shared/messaging/messages/payloads/transactions/ui/getTransactionRequests'; +import { isGetTransactionRequestsResponse } from '_src/shared/messaging/messages/payloads/transactions/ui/getTransactionRequestsResponse'; +import type { TransactionRequestResponse } from '_src/shared/messaging/messages/payloads/transactions/ui/transactionRequestResponse'; import { changeActiveNetwork, setActiveOrigin } from '_redux/slices/app'; import { setPermissions } from '_redux/slices/permissions'; import { setTransactionRequests } from '_redux/slices/transaction-requests'; -import { type MnemonicSerializedUiAccount } from '_src/background/accounts/MnemonicAccount'; -import { type SeedSerializedUiAccount } from '_src/background/accounts/SeedAccount'; +import { type MnemonicSerializedUiAccount } from '_src/background/accounts/mnemonicAccount'; +import { type SeedSerializedUiAccount } from '_src/background/accounts/seedAccount'; import type { NetworkEnvType } from '@iota/core'; import { isMethodPayload, type MethodPayload, type UIAccessibleEntityType, -} from '_src/shared/messaging/messages/payloads/MethodPayload'; -import { type SignedMessage, type SignedTransaction } from '_src/ui/app/WalletSigner'; +} from '_src/shared/messaging/messages/payloads/methodPayload'; +import { type SignedMessage, type SignedTransaction } from '_src/ui/app/walletSigner'; import type { AppDispatch } from '_store'; import { type IotaTransactionBlockResponse } from '@iota/iota-sdk/client'; import { toB64 } from '@iota/iota-sdk/utils'; import { type QueryKey } from '@tanstack/react-query'; import { lastValueFrom, map, take } from 'rxjs'; - -import { growthbook } from '../experimentation/feature-gating'; -import { ACCOUNTS_QUERY_KEY } from '../helpers/query-client-keys'; +import { growthbook } from '../experimentation/featureGating'; +import { ACCOUNTS_QUERY_KEY } from '../helpers/queryClientKeys'; import { queryClient } from '../helpers/queryClient'; import { ACCOUNT_SOURCES_QUERY_KEY } from '../hooks/useAccountSources'; -import { AccountSourceType } from '_src/background/account-sources/AccountSource'; +import { AccountSourceType } from '_src/background/account-sources/accountSource'; import { type DeriveBipPathAccountsFinder, isDeriveBipPathAccountsFinderResponse, diff --git a/apps/wallet/src/ui/app/components/DAppInfoCard.tsx b/apps/wallet/src/ui/app/components/DAppInfoCard.tsx index 6824f2978c5..fa537494f55 100644 --- a/apps/wallet/src/ui/app/components/DAppInfoCard.tsx +++ b/apps/wallet/src/ui/app/components/DAppInfoCard.tsx @@ -5,7 +5,7 @@ import { type PermissionType } from '_src/shared/messaging/messages/payloads/permissions'; import { getValidDAppUrl } from '_src/shared/utils'; import { Card, CardBody, CardImage, CardType, ImageShape, ImageType } from '@iota/apps-ui-kit'; -import { useAccountByAddress } from '../hooks/useAccountByAddress'; +import { useAccountByAddress } from '_hooks'; import { AccountIcon } from './accounts/AccountIcon'; import { AccountItem } from './accounts/AccountItem'; import { useUnlockAccount } from './accounts/UnlockAccountContext'; diff --git a/apps/wallet/src/ui/app/components/DAppPermissionList.tsx b/apps/wallet/src/ui/app/components/DAppPermissionList.tsx index b565f9aff18..2f110bd1e4d 100644 --- a/apps/wallet/src/ui/app/components/DAppPermissionList.tsx +++ b/apps/wallet/src/ui/app/components/DAppPermissionList.tsx @@ -3,7 +3,7 @@ import { type PermissionType } from '_src/shared/messaging/messages/payloads/permissions'; import { SummaryListItem } from './SummaryListItem'; -import { Checkmark } from '@iota/ui-icons'; +import { Checkmark } from '@iota/apps-ui-icons'; export interface DAppPermissionListProps { permissions: PermissionType[]; diff --git a/apps/wallet/src/ui/app/components/ExplorerLinkHelper.tsx b/apps/wallet/src/ui/app/components/ExplorerLinkHelper.tsx index bbc381a0e44..19b5c696113 100644 --- a/apps/wallet/src/ui/app/components/ExplorerLinkHelper.tsx +++ b/apps/wallet/src/ui/app/components/ExplorerLinkHelper.tsx @@ -2,7 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 import type { RenderExplorerLinkProps } from '@iota/core'; -import ExplorerLink from './explorer-link'; +import { ExplorerLink } from './explorer-link'; export function ExplorerLinkHelper({ children, ...linkProps }: RenderExplorerLinkProps) { return <ExplorerLink {...linkProps}>{children}</ExplorerLink>; diff --git a/apps/wallet/src/ui/app/components/MovedAssetNotification.tsx b/apps/wallet/src/ui/app/components/MovedAssetNotification.tsx new file mode 100644 index 00000000000..f6521663de8 --- /dev/null +++ b/apps/wallet/src/ui/app/components/MovedAssetNotification.tsx @@ -0,0 +1,33 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +import { type Toast, toast } from 'react-hot-toast'; +import { ButtonUnstyled } from '@iota/apps-ui-kit'; + +interface MovedAssetNotificationProps { + t: Toast; + destination: string; + onUndo: () => void; +} + +export function MovedAssetNotification({ t, destination, onUndo }: MovedAssetNotificationProps) { + return ( + <div + className="flex w-full flex-row items-baseline gap-x-xxs" + onClick={() => toast.dismiss(t.id)} + > + <ButtonUnstyled className="text-body-sm text-neutral-12 dark:text-neutral-92"> + Moved to {destination} + </ButtonUnstyled> + <ButtonUnstyled + onClick={() => { + onUndo(); + toast.dismiss(t.id); + }} + className="ml-auto mr-sm text-body-sm text-neutral-12 dark:text-neutral-92" + > + UNDO + </ButtonUnstyled> + </div> + ); +} diff --git a/apps/wallet/src/ui/app/components/OutsideClickHandler.tsx b/apps/wallet/src/ui/app/components/OutsideClickHandler.tsx index b309c5d642a..b79949f48db 100644 --- a/apps/wallet/src/ui/app/components/OutsideClickHandler.tsx +++ b/apps/wallet/src/ui/app/components/OutsideClickHandler.tsx @@ -1,7 +1,7 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import React, { useEffect, useRef } from 'react'; +import { useEffect, useRef } from 'react'; interface OutsideClickHandlerProps { onOutsideClick: () => void; diff --git a/apps/wallet/src/ui/app/components/PasswordInputDialog.tsx b/apps/wallet/src/ui/app/components/PasswordInputDialog.tsx index 6be03d29d6a..5b9f4f8382d 100644 --- a/apps/wallet/src/ui/app/components/PasswordInputDialog.tsx +++ b/apps/wallet/src/ui/app/components/PasswordInputDialog.tsx @@ -2,13 +2,13 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { useBackgroundClient } from '_src/ui/app/hooks/useBackgroundClient'; +import { useBackgroundClient } from '_hooks'; import classNames from 'clsx'; import { Form, Formik } from 'formik'; import { toast } from 'react-hot-toast'; import { useNavigate } from 'react-router-dom'; import { object, string as YupString } from 'yup'; -import { ArrowLeft, ArrowRight, Loader } from '@iota/ui-icons'; +import { ArrowLeft, ArrowRight, Loader } from '@iota/apps-ui-icons'; import { Button, ButtonHtmlType, diff --git a/apps/wallet/src/ui/app/components/WalletListSelect.tsx b/apps/wallet/src/ui/app/components/WalletListSelect.tsx index 67a96dc882c..423574e63f7 100644 --- a/apps/wallet/src/ui/app/components/WalletListSelect.tsx +++ b/apps/wallet/src/ui/app/components/WalletListSelect.tsx @@ -3,7 +3,7 @@ // SPDX-License-Identifier: Apache-2.0 import { cx } from 'class-variance-authority'; -import { useAccounts } from '../hooks/useAccounts'; +import { useAccounts } from '_hooks'; import { useMemo } from 'react'; import { formatAddress } from '@iota/iota-sdk/utils'; import { Checkbox } from '@iota/apps-ui-kit'; diff --git a/apps/wallet/src/ui/app/components/accounts/AccountBalanceItem.tsx b/apps/wallet/src/ui/app/components/accounts/AccountBalanceItem.tsx index a068e239e8e..9508becfd5d 100644 --- a/apps/wallet/src/ui/app/components/accounts/AccountBalanceItem.tsx +++ b/apps/wallet/src/ui/app/components/accounts/AccountBalanceItem.tsx @@ -2,10 +2,10 @@ // SPDX-License-Identifier: Apache-2.0 import { formatAddress } from '@iota/iota-sdk/utils'; -import { useCopyToClipboard } from '../../hooks/useCopyToClipboard'; -import { type SerializedUIAccount } from '_src/background/accounts/Account'; +import { useCopyToClipboard } from '_hooks'; +import { type SerializedUIAccount } from '_src/background/accounts/account'; import { useBalance, useFormatCoin } from '@iota/core'; -import { Copy } from '@iota/ui-icons'; +import { Copy } from '@iota/apps-ui-icons'; import { Panel, ButtonUnstyled } from '@iota/apps-ui-kit'; interface AccountBalanceItemProps { diff --git a/apps/wallet/src/ui/app/components/accounts/AccountIcon.tsx b/apps/wallet/src/ui/app/components/accounts/AccountIcon.tsx index 5ae5de338f1..d64260b9bf9 100644 --- a/apps/wallet/src/ui/app/components/accounts/AccountIcon.tsx +++ b/apps/wallet/src/ui/app/components/accounts/AccountIcon.tsx @@ -2,8 +2,8 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { AccountType, type SerializedUIAccount } from '_src/background/accounts/Account'; -import { Ledger, IotaLogoMark } from '@iota/ui-icons'; +import { AccountType, type SerializedUIAccount } from '_src/background/accounts/account'; +import { Ledger, IotaLogoMark } from '@iota/apps-ui-icons'; interface AccountIconProps { account: SerializedUIAccount; diff --git a/apps/wallet/src/ui/app/components/accounts/AccountItem.tsx b/apps/wallet/src/ui/app/components/accounts/AccountItem.tsx index 544da756927..af06e461e9e 100644 --- a/apps/wallet/src/ui/app/components/accounts/AccountItem.tsx +++ b/apps/wallet/src/ui/app/components/accounts/AccountItem.tsx @@ -5,9 +5,7 @@ import { formatAddress } from '@iota/iota-sdk/utils'; import cn from 'clsx'; import { type ReactNode } from 'react'; -import { useAccounts } from '../../hooks/useAccounts'; -import { useCopyToClipboard } from '../../hooks/useCopyToClipboard'; -import { useExplorerLink } from '../../hooks/useExplorerLink'; +import { useExplorerLink, useAccounts, useCopyToClipboard } from '_hooks'; import { ExplorerLinkType } from '_components'; import { Account } from '@iota/apps-ui-kit'; import { formatAccountName } from '../../helpers'; diff --git a/apps/wallet/src/ui/app/components/accounts/AccountItemApproveConnection.tsx b/apps/wallet/src/ui/app/components/accounts/AccountItemApproveConnection.tsx index 15a9e219084..754f7b1c5e4 100644 --- a/apps/wallet/src/ui/app/components/accounts/AccountItemApproveConnection.tsx +++ b/apps/wallet/src/ui/app/components/accounts/AccountItemApproveConnection.tsx @@ -3,7 +3,7 @@ // SPDX-License-Identifier: Apache-2.0 import { AccountIcon, useUnlockAccount } from '_components'; -import { type SerializedUIAccount } from '_src/background/accounts/Account'; +import { type SerializedUIAccount } from '_src/background/accounts/account'; import { formatAddress } from '@iota/iota-sdk/utils'; import { Account } from '@iota/apps-ui-kit'; import { formatAccountName } from '../../helpers'; diff --git a/apps/wallet/src/ui/app/components/accounts/AccountListItem.tsx b/apps/wallet/src/ui/app/components/accounts/AccountListItem.tsx index 12047afaaab..651e4289b37 100644 --- a/apps/wallet/src/ui/app/components/accounts/AccountListItem.tsx +++ b/apps/wallet/src/ui/app/components/accounts/AccountListItem.tsx @@ -2,9 +2,9 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { type SerializedUIAccount } from '_src/background/accounts/Account'; +import { type SerializedUIAccount } from '_src/background/accounts/account'; import { AccountItem } from './AccountItem'; -import { IotaLogoMark } from '@iota/ui-icons'; +import { IotaLogoMark } from '@iota/apps-ui-icons'; interface AccountListItemProps { account: SerializedUIAccount; diff --git a/apps/wallet/src/ui/app/components/accounts/AccountMultiSelect.tsx b/apps/wallet/src/ui/app/components/accounts/AccountMultiSelect.tsx index 972be18e5a9..ddaf5344cb8 100644 --- a/apps/wallet/src/ui/app/components/accounts/AccountMultiSelect.tsx +++ b/apps/wallet/src/ui/app/components/accounts/AccountMultiSelect.tsx @@ -3,7 +3,7 @@ // SPDX-License-Identifier: Apache-2.0 import { AccountItemApproveConnection, SelectAllButton } from '_components'; -import { type SerializedUIAccount } from '_src/background/accounts/Account'; +import { type SerializedUIAccount } from '_src/background/accounts/account'; import * as ToggleGroup from '@radix-ui/react-toggle-group'; import { useState } from 'react'; diff --git a/apps/wallet/src/ui/app/components/accounts/EditableAccountName.tsx b/apps/wallet/src/ui/app/components/accounts/EditableAccountName.tsx index 1a9abff88f5..5133b0f367a 100644 --- a/apps/wallet/src/ui/app/components/accounts/EditableAccountName.tsx +++ b/apps/wallet/src/ui/app/components/accounts/EditableAccountName.tsx @@ -6,8 +6,7 @@ import { useZodForm } from '@iota/core'; import { forwardRef, useRef } from 'react'; import toast from 'react-hot-toast'; import { z } from 'zod'; - -import { useBackgroundClient } from '../../hooks/useBackgroundClient'; +import { useBackgroundClient } from '_hooks'; import { Form } from '../../shared/forms/Form'; interface InputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'className'> {} diff --git a/apps/wallet/src/ui/app/components/accounts/ImportPrivateKeyForm.tsx b/apps/wallet/src/ui/app/components/accounts/ImportPrivateKeyForm.tsx index 455484086bc..ebeae3d8dd2 100644 --- a/apps/wallet/src/ui/app/components/accounts/ImportPrivateKeyForm.tsx +++ b/apps/wallet/src/ui/app/components/accounts/ImportPrivateKeyForm.tsx @@ -18,7 +18,7 @@ import { InfoBoxType, } from '@iota/apps-ui-kit'; import { TextAreaField } from '../../shared/forms/TextAreaField'; -import { Exclamation } from '@iota/ui-icons'; +import { Exclamation } from '@iota/apps-ui-icons'; const formSchema = z.object({ privateKey: privateKeyValidation, diff --git a/apps/wallet/src/ui/app/components/accounts/ImportRecoveryPhraseForm.tsx b/apps/wallet/src/ui/app/components/accounts/ImportRecoveryPhraseForm.tsx index 4afa2038447..c7d9c2ac3a2 100644 --- a/apps/wallet/src/ui/app/components/accounts/ImportRecoveryPhraseForm.tsx +++ b/apps/wallet/src/ui/app/components/accounts/ImportRecoveryPhraseForm.tsx @@ -18,7 +18,7 @@ import { InfoBoxType, InfoBoxStyle, } from '@iota/apps-ui-kit'; -import { Exclamation } from '@iota/ui-icons'; +import { Warning } from '@iota/apps-ui-icons'; const RECOVERY_PHRASE_WORD_COUNT = 24; @@ -28,7 +28,7 @@ const formSchema = z.object({ .length(RECOVERY_PHRASE_WORD_COUNT) .transform((recoveryPhrase) => normalizeMnemonics(recoveryPhrase.join(' ')).split(' ')) .refine((recoveryPhrase) => validateMnemonics(recoveryPhrase.join(' ')), { - message: 'Recovery Passphrase is invalid', + message: 'Mnenonic is invalid', }), }); @@ -125,14 +125,15 @@ export function ImportRecoveryPhraseForm({ </div> <div className="sticky bottom-0 left-0 flex flex-col gap-2.5 bg-neutral-100 pt-sm dark:bg-neutral-6"> - {touchedFields.recoveryPhrase && errors.recoveryPhrase && ( - <InfoBox - type={InfoBoxType.Default} - supportingText={errors.recoveryPhrase.message} - icon={<Exclamation />} - style={InfoBoxStyle.Elevated} - /> - )} + {errors?.recoveryPhrase?.message && + !touchedFields.recoveryPhrase?.every(Boolean) && ( + <InfoBox + type={InfoBoxType.Error} + supportingText={errors?.recoveryPhrase?.message} + icon={<Warning />} + style={InfoBoxStyle.Elevated} + /> + )} <div className="flex flex-row justify-stretch gap-2.5"> {cancelButtonText ? ( <Button diff --git a/apps/wallet/src/ui/app/components/accounts/NicknameDialog.tsx b/apps/wallet/src/ui/app/components/accounts/NicknameDialog.tsx index 1d03795981f..306fe7b3702 100644 --- a/apps/wallet/src/ui/app/components/accounts/NicknameDialog.tsx +++ b/apps/wallet/src/ui/app/components/accounts/NicknameDialog.tsx @@ -16,8 +16,7 @@ import { Input, InputType, } from '@iota/apps-ui-kit'; -import { useAccounts } from '../../hooks/useAccounts'; -import { useBackgroundClient } from '../../hooks/useBackgroundClient'; +import { useAccounts, useBackgroundClient } from '_hooks'; import { Form } from '../../shared/forms/Form'; const formSchema = z.object({ diff --git a/apps/wallet/src/ui/app/components/accounts/PasswordInputDialog.tsx b/apps/wallet/src/ui/app/components/accounts/PasswordInputDialog.tsx index 642449d78c7..6ae49fcb1a1 100644 --- a/apps/wallet/src/ui/app/components/accounts/PasswordInputDialog.tsx +++ b/apps/wallet/src/ui/app/components/accounts/PasswordInputDialog.tsx @@ -7,10 +7,9 @@ import { useState } from 'react'; import { toast } from 'react-hot-toast'; import { v4 as uuidV4 } from 'uuid'; import { z } from 'zod'; -import { useAccountSources } from '../../hooks/useAccountSources'; -import { useBackgroundClient } from '../../hooks/useBackgroundClient'; +import { useAccountSources, useBackgroundClient } from '_hooks'; import { Form } from '../../shared/forms/Form'; -import { AccountSourceType } from '_src/background/account-sources/AccountSource'; +import { AccountSourceType } from '_src/background/account-sources/accountSource'; import { Button, ButtonHtmlType, diff --git a/apps/wallet/src/ui/app/components/accounts/ProtectAccountForm.tsx b/apps/wallet/src/ui/app/components/accounts/ProtectAccountForm.tsx index de8c36e451b..cb581688c76 100644 --- a/apps/wallet/src/ui/app/components/accounts/ProtectAccountForm.tsx +++ b/apps/wallet/src/ui/app/components/accounts/ProtectAccountForm.tsx @@ -9,7 +9,7 @@ import { type SubmitHandler } from 'react-hook-form'; import { useNavigate } from 'react-router-dom'; import { z } from 'zod'; import zxcvbn from 'zxcvbn'; -import { parseAutoLock, useAutoLockMinutes } from '../../hooks/useAutoLockMinutes'; +import { parseAutoLock, useAutoLockMinutes } from '_hooks'; import { CheckboxField } from '../../shared/forms/CheckboxField'; import { Form } from '../../shared/forms/Form'; import { AutoLockSelector, zodSchema } from './AutoLockSelector'; diff --git a/apps/wallet/src/ui/app/components/accounts/RecoverAccountsGroup.tsx b/apps/wallet/src/ui/app/components/accounts/RecoverAccountsGroup.tsx index 6550e25fffa..e9b8f6cf180 100644 --- a/apps/wallet/src/ui/app/components/accounts/RecoverAccountsGroup.tsx +++ b/apps/wallet/src/ui/app/components/accounts/RecoverAccountsGroup.tsx @@ -2,10 +2,10 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { type SerializedUIAccount } from '_src/background/accounts/Account'; +import { type SerializedUIAccount } from '_src/background/accounts/account'; import { AccountListItem } from './AccountListItem'; import { Button, ButtonSize, ButtonType, Tooltip, TooltipPosition } from '@iota/apps-ui-kit'; -import { CheckmarkFilled, Key } from '@iota/ui-icons'; +import { CheckmarkFilled, Key } from '@iota/apps-ui-icons'; export interface RecoverAccountsGroupProps { title: string; diff --git a/apps/wallet/src/ui/app/components/accounts/UnlockAccountButton.tsx b/apps/wallet/src/ui/app/components/accounts/UnlockAccountButton.tsx index 025ff894c73..a6a8e4bed00 100644 --- a/apps/wallet/src/ui/app/components/accounts/UnlockAccountButton.tsx +++ b/apps/wallet/src/ui/app/components/accounts/UnlockAccountButton.tsx @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { type SerializedUIAccount } from '_src/background/accounts/Account'; +import { type SerializedUIAccount } from '_src/background/accounts/account'; import { useUnlockAccount } from './UnlockAccountContext'; import { Button, ButtonType } from '@iota/apps-ui-kit'; diff --git a/apps/wallet/src/ui/app/components/accounts/UnlockAccountContext.tsx b/apps/wallet/src/ui/app/components/accounts/UnlockAccountContext.tsx index 71e7758d0ae..1f3a2c3444d 100644 --- a/apps/wallet/src/ui/app/components/accounts/UnlockAccountContext.tsx +++ b/apps/wallet/src/ui/app/components/accounts/UnlockAccountContext.tsx @@ -2,18 +2,10 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { type SerializedUIAccount } from '_src/background/accounts/Account'; -import React, { - createContext, - useCallback, - useContext, - useState, - type ReactNode, - useRef, -} from 'react'; +import { type SerializedUIAccount } from '_src/background/accounts/account'; +import { createContext, useCallback, useContext, useState, type ReactNode, useRef } from 'react'; import { toast } from 'react-hot-toast'; -import { useBackgroundClient } from '../../hooks/useBackgroundClient'; -import { useUnlockMutation } from '../../hooks/useUnlockMutation'; +import { useUnlockMutation, useBackgroundClient } from '_hooks'; import { UnlockAccountModal } from './UnlockAccountModal'; type OnSuccessCallback = () => void | Promise<void>; diff --git a/apps/wallet/src/ui/app/components/accounts/UnlockAccountModal.tsx b/apps/wallet/src/ui/app/components/accounts/UnlockAccountModal.tsx index 8f778ee6d7f..8eb2971763e 100644 --- a/apps/wallet/src/ui/app/components/accounts/UnlockAccountModal.tsx +++ b/apps/wallet/src/ui/app/components/accounts/UnlockAccountModal.tsx @@ -2,10 +2,9 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { type SerializedUIAccount } from '_src/background/accounts/Account'; +import { type SerializedUIAccount } from '_src/background/accounts/account'; import { toast } from 'react-hot-toast'; - -import { useBackgroundClient } from '../../hooks/useBackgroundClient'; +import { useBackgroundClient } from '_hooks'; import { PasswordModalDialog } from './PasswordInputDialog'; interface UnlockAccountModalProps { diff --git a/apps/wallet/src/ui/app/components/active-coins-card/index.tsx b/apps/wallet/src/ui/app/components/active-coins-card/index.tsx index b5c8e64b490..3933130431c 100644 --- a/apps/wallet/src/ui/app/components/active-coins-card/index.tsx +++ b/apps/wallet/src/ui/app/components/active-coins-card/index.tsx @@ -2,9 +2,8 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { useActiveAddress } from '_app/hooks/useActiveAddress'; +import { useCoinsReFetchingConfig, useActiveAddress } from '_hooks'; import { Loading } from '_components'; -import { useCoinsReFetchingConfig } from '_hooks'; import { useIotaClientQuery } from '@iota/dapp-kit'; import { IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; import { Link } from 'react-router-dom'; diff --git a/apps/wallet/src/ui/app/components/error-boundary/index.tsx b/apps/wallet/src/ui/app/components/error-boundary/index.tsx index e450622a9cf..7ba0e3a4524 100644 --- a/apps/wallet/src/ui/app/components/error-boundary/index.tsx +++ b/apps/wallet/src/ui/app/components/error-boundary/index.tsx @@ -3,7 +3,7 @@ // SPDX-License-Identifier: Apache-2.0 import { InfoBox, InfoBoxType, InfoBoxStyle } from '@iota/apps-ui-kit'; -import { Warning } from '@iota/ui-icons'; +import { Warning } from '@iota/apps-ui-icons'; import type { ReactNode } from 'react'; import { ErrorBoundary as ReactErrorBoundary } from 'react-error-boundary'; import type { FallbackProps } from 'react-error-boundary'; diff --git a/apps/wallet/src/ui/app/components/explorer-link/index.tsx b/apps/wallet/src/ui/app/components/explorer-link/index.tsx index 0ce305b1087..4eeb1207db2 100644 --- a/apps/wallet/src/ui/app/components/explorer-link/index.tsx +++ b/apps/wallet/src/ui/app/components/explorer-link/index.tsx @@ -8,7 +8,7 @@ import { type ExplorerLinkConfig, ExplorerLinkType } from '@iota/core'; import { useExplorerLink } from '_hooks'; import st from './ExplorerLink.module.scss'; import clsx from 'clsx'; -import { ArrowTopRight } from '@iota/ui-icons'; +import { ArrowTopRight } from '@iota/apps-ui-icons'; export type ExplorerLinkProps = ExplorerLinkConfig & { track?: boolean; @@ -45,5 +45,3 @@ export function ExplorerLink({ } export { ExplorerLinkType }; - -export default ExplorerLink; diff --git a/apps/wallet/src/ui/app/components/external-link/index.tsx b/apps/wallet/src/ui/app/components/external-link/index.tsx index 52e73eb0ad2..2f09c645521 100644 --- a/apps/wallet/src/ui/app/components/external-link/index.tsx +++ b/apps/wallet/src/ui/app/components/external-link/index.tsx @@ -2,7 +2,6 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { memo } from 'react'; import type { ReactNode } from 'react'; export interface ExternalLinkProps { @@ -27,5 +26,3 @@ export function ExternalLink({ href, className, children, title, onClick }: Exte </a> ); } - -export default memo(ExternalLink); diff --git a/apps/wallet/src/ui/app/components/filters-tags/index.tsx b/apps/wallet/src/ui/app/components/filters-tags/index.tsx index 09fc2b21dbe..d3499467842 100644 --- a/apps/wallet/src/ui/app/components/filters-tags/index.tsx +++ b/apps/wallet/src/ui/app/components/filters-tags/index.tsx @@ -23,7 +23,7 @@ interface FiltersPortalProps { callback?: (tag: Tag) => void; } -function FiltersPortal({ tags, callback, firstLastMargin }: FiltersPortalProps) { +function FiltersPortalComponent({ tags, callback, firstLastMargin }: FiltersPortalProps) { const [element, setElement] = useState<HTMLElement | null>(null); useEffect(() => { @@ -65,4 +65,4 @@ function FiltersPortal({ tags, callback, firstLastMargin }: FiltersPortalProps) ); } -export default memo(FiltersPortal); +export const FiltersPortal = memo(FiltersPortalComponent); diff --git a/apps/wallet/src/ui/app/components/index.ts b/apps/wallet/src/ui/app/components/index.ts index 978c70b11b4..3c404c548bb 100644 --- a/apps/wallet/src/ui/app/components/index.ts +++ b/apps/wallet/src/ui/app/components/index.ts @@ -26,9 +26,9 @@ export * from './menu'; export * from './navigation'; export * from './network-selector'; export * from './nft-display'; -export * from './nft-display/NftImage'; export * from './receipt-card'; export * from './receipt-card/TxnAmount'; export * from './transactions-card'; export * from './user-approve-container'; -export { default as FiltersPortal } from './filters-tags'; +export * from './filters-tags'; +export * from './MovedAssetNotification'; diff --git a/apps/wallet/src/ui/app/components/iota-apps/AppsPlayGround.tsx b/apps/wallet/src/ui/app/components/iota-apps/AppsPlayGround.tsx new file mode 100644 index 00000000000..dafc4379d57 --- /dev/null +++ b/apps/wallet/src/ui/app/components/iota-apps/AppsPlayGround.tsx @@ -0,0 +1,75 @@ +// Copyright (c) Mysten Labs, Inc. +// Modifications Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +import { useAppSelector } from '_hooks'; +import { Feature } from '@iota/core'; +import { prepareLinkToCompare } from '_src/shared/utils'; +import { useFeature } from '@growthbook/growthbook-react'; +import { useMemo } from 'react'; +import { useParams } from 'react-router-dom'; +import { permissionsSelectors } from '../../redux/slices/permissions'; +import { AppsPageBanner } from './Banner'; +import { IotaApp, type DAppEntry } from './IotaApp'; +import { IotaAppEmpty } from './IotaAppEmpty'; +import { InfoBox, InfoBoxStyle, InfoBoxType, Header } from '@iota/apps-ui-kit'; +import { Info } from '@iota/apps-ui-icons'; + +export function AppsPlayGround() { + const ecosystemApps = useFeature<DAppEntry[]>(Feature.WalletDapps).value; + const { tagName } = useParams(); + + const filteredEcosystemApps = useMemo(() => { + if (!ecosystemApps) { + return []; + } else if (tagName) { + return ecosystemApps.filter((app) => app.tags.includes(tagName)); + } + return ecosystemApps; + }, [ecosystemApps, tagName]); + + const allPermissions = useAppSelector(permissionsSelectors.selectAll); + const linkToPermissionID = useMemo(() => { + const map = new Map<string, string>(); + for (const aPermission of allPermissions) { + map.set(prepareLinkToCompare(aPermission.origin), aPermission.id); + if (aPermission.pagelink) { + map.set(prepareLinkToCompare(aPermission.pagelink), aPermission.id); + } + } + return map; + }, [allPermissions]); + + return ( + <> + <Header titleCentered title="IOTA Apps" /> + <AppsPageBanner /> + + {filteredEcosystemApps?.length ? ( + <InfoBox + type={InfoBoxType.Default} + icon={<Info />} + style={InfoBoxStyle.Elevated} + supportingText="Apps below are actively curated but do not indicate any endorsement or + relationship with IOTA Wallet. Please DYOR." + /> + ) : null} + + {filteredEcosystemApps?.length ? ( + <div className="mt-md flex flex-col gap-sm"> + {filteredEcosystemApps.map((app) => ( + <IotaApp + key={app.link} + {...app} + permissionID={linkToPermissionID.get(prepareLinkToCompare(app.link))} + displayType="full" + openAppSite + /> + ))} + </div> + ) : ( + <IotaAppEmpty displayType="full" /> + )} + </> + ); +} diff --git a/apps/wallet/src/ui/app/components/iota-apps/ConnectedAppsCard.tsx b/apps/wallet/src/ui/app/components/iota-apps/ConnectedAppsCard.tsx index efce9ba05ea..71f4c3d7e8c 100644 --- a/apps/wallet/src/ui/app/components/iota-apps/ConnectedAppsCard.tsx +++ b/apps/wallet/src/ui/app/components/iota-apps/ConnectedAppsCard.tsx @@ -3,19 +3,17 @@ // SPDX-License-Identifier: Apache-2.0 import { Title, TitleSize } from '@iota/apps-ui-kit'; -import { useAppSelector } from '_hooks'; +import { useAppSelector, useBackgroundClient } from '_hooks'; import cn from 'clsx'; import { Feature } from '@iota/core'; import { prepareLinkToCompare } from '_src/shared/utils'; import { useFeature } from '@growthbook/growthbook-react'; import { useEffect, useMemo } from 'react'; - -import { useBackgroundClient } from '../../hooks/useBackgroundClient'; import { permissionsSelectors } from '../../redux/slices/permissions'; import { Loading, NoData, PageTemplate } from '_components'; import { type DAppEntry, IotaApp } from './IotaApp'; -function ConnectedDapps() { +export function ConnectedAppsCard() { const backgroundClient = useBackgroundClient(); useEffect(() => { backgroundClient.sendGetPermissionRequests(); @@ -86,5 +84,3 @@ function ConnectedDapps() { </PageTemplate> ); } - -export default ConnectedDapps; diff --git a/apps/wallet/src/ui/app/components/iota-apps/DisconnectApp.tsx b/apps/wallet/src/ui/app/components/iota-apps/DisconnectApp.tsx index a2ba2745704..c60c04e9ce6 100644 --- a/apps/wallet/src/ui/app/components/iota-apps/DisconnectApp.tsx +++ b/apps/wallet/src/ui/app/components/iota-apps/DisconnectApp.tsx @@ -3,18 +3,15 @@ // SPDX-License-Identifier: Apache-2.0 import { Overlay, DAppInfoCard, WalletListSelect } from '_components'; -import { useAppSelector } from '_hooks'; +import { useAppSelector, useBackgroundClient } from '_hooks'; import { permissionsSelectors } from '_redux/slices/permissions'; import { ampli } from '_src/shared/analytics/ampli'; import { formatAddress } from '@iota/iota-sdk/utils'; import { useMutation } from '@tanstack/react-query'; import { useEffect, useMemo, useState } from 'react'; import { toast } from 'react-hot-toast'; - -import { useBackgroundClient } from '../../hooks/useBackgroundClient'; import { type DAppEntry } from './IotaApp'; - -import { CircleEmitter } from '@iota/ui-icons'; +import { CircleEmitter } from '@iota/apps-ui-icons'; import { Button, ButtonType } from '@iota/apps-ui-kit'; import { SummaryPanel } from '../SummaryPanel'; import { SummaryListItem } from '../SummaryListItem'; @@ -25,7 +22,7 @@ export interface DisconnectAppProps extends Omit<DAppEntry, 'description' | 'tag setShowDisconnectApp: (showModal: boolean) => void; } -function DisconnectApp({ +export function DisconnectApp({ name, icon, link, @@ -72,12 +69,7 @@ function DisconnectApp({ return null; } return ( - <Overlay - showBackButton - showModal - setShowModal={setShowDisconnectApp} - title="Active Connection" - > + <Overlay showModal setShowModal={setShowDisconnectApp} title="Active Connection"> <div className="flex max-w-full flex-1 flex-col flex-nowrap items-stretch gap-y-md"> <DAppInfoCard name={name} iconUrl={icon} url={link} /> @@ -137,5 +129,3 @@ function DisconnectApp({ </Overlay> ); } - -export default DisconnectApp; diff --git a/apps/wallet/src/ui/app/components/iota-apps/IotaApp.tsx b/apps/wallet/src/ui/app/components/iota-apps/IotaApp.tsx index d6db449aaa4..0df8593611d 100644 --- a/apps/wallet/src/ui/app/components/iota-apps/IotaApp.tsx +++ b/apps/wallet/src/ui/app/components/iota-apps/IotaApp.tsx @@ -8,8 +8,7 @@ import { ampli } from '_src/shared/analytics/ampli'; import { getDAppUrl } from '_src/shared/utils'; import { useState } from 'react'; import { Card, CardImage, CardBody, ImageShape, Badge, BadgeType } from '@iota/apps-ui-kit'; - -import DisconnectApp from './DisconnectApp'; +import { DisconnectApp } from './DisconnectApp'; export type DAppEntry = { name: string; diff --git a/apps/wallet/src/ui/app/components/iota-apps/index.tsx b/apps/wallet/src/ui/app/components/iota-apps/index.tsx index 8633641c5ed..c61a0d75d35 100644 --- a/apps/wallet/src/ui/app/components/iota-apps/index.tsx +++ b/apps/wallet/src/ui/app/components/iota-apps/index.tsx @@ -1,78 +1,5 @@ -// Copyright (c) Mysten Labs, Inc. -// Modifications Copyright (c) 2024 IOTA Stiftung +// Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { useAppSelector } from '_hooks'; -import { Feature } from '@iota/core'; -import { prepareLinkToCompare } from '_src/shared/utils'; -import { useFeature } from '@growthbook/growthbook-react'; -import { useMemo } from 'react'; -import { useParams } from 'react-router-dom'; -import { permissionsSelectors } from '../../redux/slices/permissions'; -import { AppsPageBanner } from './Banner'; -import { IotaApp, type DAppEntry } from './IotaApp'; -import { IotaAppEmpty } from './IotaAppEmpty'; -import { InfoBox, InfoBoxStyle, InfoBoxType, Header } from '@iota/apps-ui-kit'; -import { Info } from '@iota/ui-icons'; - -export function AppsPlayGround() { - const ecosystemApps = useFeature<DAppEntry[]>(Feature.WalletDapps).value; - const { tagName } = useParams(); - - const filteredEcosystemApps = useMemo(() => { - if (!ecosystemApps) { - return []; - } else if (tagName) { - return ecosystemApps.filter((app) => app.tags.includes(tagName)); - } - return ecosystemApps; - }, [ecosystemApps, tagName]); - - const allPermissions = useAppSelector(permissionsSelectors.selectAll); - const linkToPermissionID = useMemo(() => { - const map = new Map<string, string>(); - for (const aPermission of allPermissions) { - map.set(prepareLinkToCompare(aPermission.origin), aPermission.id); - if (aPermission.pagelink) { - map.set(prepareLinkToCompare(aPermission.pagelink), aPermission.id); - } - } - return map; - }, [allPermissions]); - - return ( - <> - <Header titleCentered title="IOTA Apps" /> - <AppsPageBanner /> - - {filteredEcosystemApps?.length ? ( - <InfoBox - type={InfoBoxType.Default} - icon={<Info />} - style={InfoBoxStyle.Elevated} - supportingText="Apps below are actively curated but do not indicate any endorsement or - relationship with IOTA Wallet. Please DYOR." - /> - ) : null} - - {filteredEcosystemApps?.length ? ( - <div className="mt-md flex flex-col gap-sm"> - {filteredEcosystemApps.map((app) => ( - <IotaApp - key={app.link} - {...app} - permissionID={linkToPermissionID.get(prepareLinkToCompare(app.link))} - displayType="full" - openAppSite - /> - ))} - </div> - ) : ( - <IotaAppEmpty displayType="full" /> - )} - </> - ); -} - -export default AppsPlayGround; -export { default as ConnectedAppsCard } from './ConnectedAppsCard'; +export * from './AppsPlayGround'; +export * from './ConnectedAppsCard'; diff --git a/apps/wallet/src/ui/app/components/ledger/useDeriveLedgerAccounts.ts b/apps/wallet/src/ui/app/components/ledger/useDeriveLedgerAccounts.ts index f20776577ae..171f5d39648 100644 --- a/apps/wallet/src/ui/app/components/ledger/useDeriveLedgerAccounts.ts +++ b/apps/wallet/src/ui/app/components/ledger/useDeriveLedgerAccounts.ts @@ -2,13 +2,13 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { type LedgerAccountSerializedUI } from '_src/background/accounts/LedgerAccount'; +import { type LedgerAccountSerializedUI } from '_src/background/accounts/ledgerAccount'; import type IotaLedgerClient from '@iota/ledgerjs-hw-app-iota'; import { Ed25519PublicKey } from '@iota/iota-sdk/keypairs/ed25519'; import { useQuery, type UseQueryOptions } from '@tanstack/react-query'; import { useIotaLedgerClient } from './IotaLedgerClientProvider'; -import { AccountType } from '_src/background/accounts/Account'; +import { AccountType } from '_src/background/accounts/account'; type LedgerAccountKeys = 'address' | 'publicKey' | 'type' | 'derivationPath'; diff --git a/apps/wallet/src/ui/app/components/loading/index.tsx b/apps/wallet/src/ui/app/components/loading/index.tsx index 3ca75bb0db4..98e689aec31 100644 --- a/apps/wallet/src/ui/app/components/loading/index.tsx +++ b/apps/wallet/src/ui/app/components/loading/index.tsx @@ -19,5 +19,3 @@ export function Loading({ loading, children, ...indicatorProps }: LoadingProps) <>{children}</> ); } - -export default Loading; diff --git a/apps/wallet/src/ui/app/components/menu/button/WalletSettingsButton.tsx b/apps/wallet/src/ui/app/components/menu/button/WalletSettingsButton.tsx index 9607f08c8dd..7917c1bb752 100644 --- a/apps/wallet/src/ui/app/components/menu/button/WalletSettingsButton.tsx +++ b/apps/wallet/src/ui/app/components/menu/button/WalletSettingsButton.tsx @@ -3,7 +3,7 @@ // SPDX-License-Identifier: Apache-2.0 import { Button, ButtonSize, ButtonType } from '@iota/apps-ui-kit'; -import { Close, Settings } from '@iota/ui-icons'; +import { Close, Settings } from '@iota/apps-ui-icons'; import { useMenuIsOpen, useNextMenuUrl } from '_components'; import { Link } from 'react-router-dom'; import { cx } from 'class-variance-authority'; diff --git a/apps/wallet/src/ui/app/components/menu/content/AutoLockAccounts.tsx b/apps/wallet/src/ui/app/components/menu/content/AutoLockAccounts.tsx index 7a8b59b7ce0..aaf11adf3ba 100644 --- a/apps/wallet/src/ui/app/components/menu/content/AutoLockAccounts.tsx +++ b/apps/wallet/src/ui/app/components/menu/content/AutoLockAccounts.tsx @@ -7,8 +7,8 @@ import { autoLockDataToMinutes, parseAutoLock, useAutoLockMinutes, -} from '_src/ui/app/hooks/useAutoLockMinutes'; -import { useAutoLockMinutesMutation } from '_src/ui/app/hooks/useAutoLockMinutesMutation'; + useAutoLockMinutesMutation, +} from '_hooks'; import { Form } from '_src/ui/app/shared/forms/Form'; import { useZodForm } from '@iota/core'; import toast from 'react-hot-toast'; diff --git a/apps/wallet/src/ui/app/components/menu/content/WalletSettingsMenuList.tsx b/apps/wallet/src/ui/app/components/menu/content/WalletSettingsMenuList.tsx index d2a5da8f49c..35ca4170bb1 100644 --- a/apps/wallet/src/ui/app/components/menu/content/WalletSettingsMenuList.tsx +++ b/apps/wallet/src/ui/app/components/menu/content/WalletSettingsMenuList.tsx @@ -3,20 +3,23 @@ // SPDX-License-Identifier: Apache-2.0 import { useNextMenuUrl, Overlay } from '_components'; -import { useAppSelector } from '_hooks'; +import { + useAppSelector, + formatAutoLock, + useAutoLockMinutes, + useBackgroundClient, + useActiveAccount, +} from '_hooks'; import { FAQ_LINK, ToS_LINK } from '_src/shared/constants'; -import { formatAutoLock, useAutoLockMinutes } from '_src/ui/app/hooks/useAutoLockMinutes'; -import FaucetRequestButton from '_src/ui/app/shared/faucet/FaucetRequestButton'; +import { FaucetRequestButton } from '_src/ui/app/shared/faucet/FaucetRequestButton'; import { getNetwork, Network } from '@iota/iota-sdk/client'; import Browser from 'webextension-polyfill'; import { Link, useNavigate } from 'react-router-dom'; import { useQueryClient, useMutation } from '@tanstack/react-query'; import { persister } from '_src/ui/app/helpers/queryClient'; -import { useBackgroundClient } from '_src/ui/app/hooks/useBackgroundClient'; import { useState } from 'react'; import { ConfirmationModal } from '_src/ui/app/shared/ConfirmationModal'; -import { DarkMode, Globe, Info, LockLocked, LockUnlocked, Logout } from '@iota/ui-icons'; -import { useActiveAccount } from '_src/ui/app/hooks/useActiveAccount'; +import { DarkMode, Globe, Info, LockLocked, LockUnlocked, Logout } from '@iota/apps-ui-icons'; import { ButtonType, Card, @@ -30,7 +33,7 @@ import { import { ampli } from '_src/shared/analytics/ampli'; import { useTheme, getCustomNetwork } from '@iota/core'; -function MenuList() { +export function MenuList() { const { themePreference } = useTheme(); const navigate = useNavigate(); const activeAccount = useActiveAccount(); @@ -169,5 +172,3 @@ function MenuList() { </Overlay> ); } - -export default MenuList; diff --git a/apps/wallet/src/ui/app/components/menu/content/index.tsx b/apps/wallet/src/ui/app/components/menu/content/index.tsx index ef5b55515fd..beddd857700 100644 --- a/apps/wallet/src/ui/app/components/menu/content/index.tsx +++ b/apps/wallet/src/ui/app/components/menu/content/index.tsx @@ -15,12 +15,12 @@ import type { MouseEvent } from 'react'; import { Navigate, Route, Routes, useLocation, useNavigate } from 'react-router-dom'; import { AutoLockAccounts } from './AutoLockAccounts'; import { NetworkSettings } from './NetworkSettings'; -import WalletSettingsMenuList from './WalletSettingsMenuList'; +import { MenuList } from './WalletSettingsMenuList'; import { ThemeSettings } from './ThemeSettings'; const CLOSE_KEY_CODES: string[] = ['Escape']; -function MenuContent() { +export function MenuContent() { const mainLocation = useLocation(); const isOpen = useMenuIsOpen(); const menuUrl = useMenuUrl(); @@ -47,7 +47,7 @@ function MenuContent() { <ErrorBoundary> <MainLocationContext.Provider value={mainLocation}> <Routes location={menuUrl || ''}> - <Route path="/" element={<WalletSettingsMenuList />} /> + <Route path="/" element={<MenuList />} /> <Route path="/network" element={<NetworkSettings />} /> <Route path="/auto-lock" element={<AutoLockAccounts />} /> <Route path="/theme" element={<ThemeSettings />} /> @@ -58,5 +58,3 @@ function MenuContent() { </div> ); } - -export default MenuContent; diff --git a/apps/wallet/src/ui/app/components/menu/index.tsx b/apps/wallet/src/ui/app/components/menu/index.tsx index 1daa5025de8..2e2817233f6 100644 --- a/apps/wallet/src/ui/app/components/menu/index.tsx +++ b/apps/wallet/src/ui/app/components/menu/index.tsx @@ -2,6 +2,6 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -export { default as MenuContent } from './content'; +export * from './content'; export * from './hooks'; export * from './button/WalletSettingsButton'; diff --git a/apps/wallet/src/ui/app/components/navigation/index.tsx b/apps/wallet/src/ui/app/components/navigation/index.tsx index 17abcb0d65e..4ce35c7325d 100644 --- a/apps/wallet/src/ui/app/components/navigation/index.tsx +++ b/apps/wallet/src/ui/app/components/navigation/index.tsx @@ -3,9 +3,9 @@ // SPDX-License-Identifier: Apache-2.0 import { useNavigate, useLocation } from 'react-router-dom'; -import { useActiveAccount } from '../../hooks/useActiveAccount'; +import { useActiveAccount } from '_hooks'; import { Navbar, type NavbarItemWithId } from '@iota/apps-ui-kit'; -import { Activity, Apps, Assets, Home } from '@iota/ui-icons'; +import { Activity, Apps, Assets, Home } from '@iota/apps-ui-icons'; type NavbarItemWithPath = NavbarItemWithId & { path: string; diff --git a/apps/wallet/src/ui/app/components/network-selector/index.tsx b/apps/wallet/src/ui/app/components/network-selector/index.tsx index 3bbeb7a7b8c..bc4c1cbda1d 100644 --- a/apps/wallet/src/ui/app/components/network-selector/index.tsx +++ b/apps/wallet/src/ui/app/components/network-selector/index.tsx @@ -90,5 +90,3 @@ export function NetworkSelector() { </div> ); } - -export default NetworkSelector; diff --git a/apps/wallet/src/ui/app/components/nft-display/index.tsx b/apps/wallet/src/ui/app/components/nft-display/index.tsx index 779afa87e49..3e279b72935 100644 --- a/apps/wallet/src/ui/app/components/nft-display/index.tsx +++ b/apps/wallet/src/ui/app/components/nft-display/index.tsx @@ -2,13 +2,19 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { Loading, NftImage } from '_components'; -import { isKioskOwnerToken, useGetNFTDisplay, useGetObject, useKioskClient } from '@iota/core'; +import { Loading } from '_components'; +import { + NftImage, + isKioskOwnerToken, + useGetNFTDisplay, + useGetObject, + useKioskClient, + KioskTile, +} from '@iota/core'; import { formatAddress } from '@iota/iota-sdk/utils'; import { cva } from 'class-variance-authority'; import type { VariantProps } from 'class-variance-authority'; -import { useResolveVideo } from '../../hooks/useResolveVideo'; -import { Kiosk } from './Kiosk'; +import { useResolveVideo, useActiveAddress } from '_hooks'; const nftDisplayCardStyles = cva('flex flex-nowrap items-center h-full relative', { variants: { @@ -48,13 +54,14 @@ export function NFTDisplayCard({ const video = useResolveVideo(objectData); const kioskClient = useKioskClient(); const isOwnerToken = isKioskOwnerToken(kioskClient.network, objectData); + const address = useActiveAddress(); return ( <div className={nftDisplayCardStyles({ isHoverable, wideView })}> <Loading loading={isPending}> <div className="flex w-full flex-col justify-center gap-sm text-center"> {objectData?.data && isOwnerToken ? ( - <Kiosk object={objectData} /> + <KioskTile object={objectData} address={address} /> ) : ( <NftImage title={nftName} diff --git a/apps/wallet/src/ui/app/components/receipt-card/TxnAmount.tsx b/apps/wallet/src/ui/app/components/receipt-card/TxnAmount.tsx index 85d4ff481e0..cb17eab7d23 100644 --- a/apps/wallet/src/ui/app/components/receipt-card/TxnAmount.tsx +++ b/apps/wallet/src/ui/app/components/receipt-card/TxnAmount.tsx @@ -28,7 +28,7 @@ export function TxnAmount({ amount, coinType, subtitle, approximation }: TxnAmou return Number(amount) !== 0 ? ( <Card type={CardType.Filled}> <CardImage type={ImageType.BgSolid}> - <CoinIcon coinType={coinType} rounded size={ImageIconSize.Large} hasCoinWrapper /> + <CoinIcon coinType={coinType} rounded size={ImageIconSize.Small} /> </CardImage> <CardBody title={`${approximation ? '~' : ''}${formatAmount} ${symbol}`} diff --git a/apps/wallet/src/ui/app/components/receipt-card/index.tsx b/apps/wallet/src/ui/app/components/receipt-card/index.tsx index 3bba1a45a7f..2c8e6a82c51 100644 --- a/apps/wallet/src/ui/app/components/receipt-card/index.tsx +++ b/apps/wallet/src/ui/app/components/receipt-card/index.tsx @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { useRecognizedPackages } from '_src/ui/app/hooks/useRecognizedPackages'; +import { useRecognizedPackages } from '_hooks'; import { useTransactionSummary, TransactionReceipt, @@ -11,10 +11,8 @@ import { } from '@iota/core'; import { type IotaTransactionBlockResponse } from '@iota/iota-sdk/client'; -import { CardType } from '@iota/apps-ui-kit'; -import { ValidatorLogo } from '../../staking/validators/ValidatorLogo'; import { ExplorerLinkHelper } from '../ExplorerLinkHelper'; -import ExplorerLink from '../explorer-link'; +import { ExplorerLink } from '../explorer-link'; interface ReceiptCardProps { txn: IotaTransactionBlockResponse; @@ -40,14 +38,6 @@ export function ReceiptCard({ txn, activeAddress }: ReceiptCardProps) { summary={summary} activeAddress={activeAddress} renderExplorerLink={ExplorerLinkHelper} - renderValidatorLogo={({ address, showActiveStatus, activeEpoch, isSelected }) => ( - <ValidatorLogo - validatorAddress={address} - showActiveStatus={showActiveStatus} - activeEpoch={activeEpoch} - type={isSelected ? CardType.Filled : CardType.Outlined} - /> - )} /> <div className="pt-sm"> <ExplorerLink transactionID={digest ?? ''} type={ExplorerLinkType.Transaction}> diff --git a/apps/wallet/src/ui/app/components/transactions-card/TxnIcon.tsx b/apps/wallet/src/ui/app/components/transactions-card/TxnIcon.tsx deleted file mode 100644 index 598b68a32e5..00000000000 --- a/apps/wallet/src/ui/app/components/transactions-card/TxnIcon.tsx +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// Modifications Copyright (c) 2024 IOTA Stiftung -// SPDX-License-Identifier: Apache-2.0 - -import { LoadingIndicator } from '@iota/apps-ui-kit'; -import { ArrowBottomLeft, ArrowTopRight, Info, IotaLogoMark, Person, Stake } from '@iota/ui-icons'; - -const ICON_COLORS = { - primary: 'text-primary-30', - error: 'text-error-30', -}; - -const icons = { - Send: <ArrowTopRight className={ICON_COLORS.primary} />, - Receive: <ArrowBottomLeft className={ICON_COLORS.primary} />, - Transaction: <ArrowTopRight className={ICON_COLORS.primary} />, - Staked: <Stake className={ICON_COLORS.primary} />, - Unstaked: <Stake className={ICON_COLORS.primary} />, - Rewards: <IotaLogoMark className={ICON_COLORS.primary} />, - Failed: <Info className={ICON_COLORS.error} />, - Loading: <LoadingIndicator />, - PersonalMessage: <Person className={ICON_COLORS.primary} />, -}; - -interface TxnItemIconProps { - txnFailed?: boolean; - variant: keyof typeof icons; -} - -export function TxnIcon({ txnFailed, variant }: TxnItemIconProps) { - return <div className="[&_svg]:h-5 [&_svg]:w-5">{icons[txnFailed ? 'Failed' : variant]}</div>; -} diff --git a/apps/wallet/src/ui/app/components/transactions-card/index.tsx b/apps/wallet/src/ui/app/components/transactions-card/index.tsx index ab15c187695..1c1d8f47226 100644 --- a/apps/wallet/src/ui/app/components/transactions-card/index.tsx +++ b/apps/wallet/src/ui/app/components/transactions-card/index.tsx @@ -2,17 +2,17 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { useRecognizedPackages } from '_src/ui/app/hooks/useRecognizedPackages'; +import { useRecognizedPackages } from '_hooks'; import { formatDate, getBalanceChangeSummary, - getLabel, + getTransactionAction, useFormatCoin, useTransactionSummary, + TransactionIcon, } from '@iota/core'; import type { IotaTransactionBlockResponse } from '@iota/iota-sdk/client'; import { Link } from 'react-router-dom'; -import { TxnIcon } from './TxnIcon'; import { Card, CardType, @@ -40,7 +40,7 @@ export function TransactionCard({ txn, address }: TransactionCardProps) { recognizedPackagesList, }); - // we only show IOTA Transfer amount or the first non-Iota transfer amount + // we only show IOTA Transfer amount or the first non-IOTA transfer amount // Get the balance changes for the transaction and the amount const balanceChanges = getBalanceChangeSummary(txn, recognizedPackagesList); const [formatAmount, symbol] = useFormatCoin( @@ -52,7 +52,7 @@ export function TransactionCard({ txn, address }: TransactionCardProps) { const transactionDate = !txn.timestampMs ? '--' - : formatDate(Number(txn.timestampMs), ['month', 'day', 'hour', 'minute']); + : formatDate(Number(txn.timestampMs), ['day', 'month', 'year', 'hour', 'minute']); return ( <Link @@ -64,9 +64,9 @@ export function TransactionCard({ txn, address }: TransactionCardProps) { > <Card type={CardType.Default} isHoverable> <CardImage type={ImageType.BgSolid} shape={ImageShape.SquareRounded}> - <TxnIcon + <TransactionIcon txnFailed={executionStatus !== 'success' || !!error} - variant={getLabel(txn, address)} + variant={getTransactionAction(txn, address)} /> </CardImage> <CardBody diff --git a/apps/wallet/src/ui/app/components/user-approve-container/index.tsx b/apps/wallet/src/ui/app/components/user-approve-container/index.tsx index 3a994d63f6b..190da9dc546 100644 --- a/apps/wallet/src/ui/app/components/user-approve-container/index.tsx +++ b/apps/wallet/src/ui/app/components/user-approve-container/index.tsx @@ -7,7 +7,7 @@ import cn from 'clsx'; import type { ReactNode } from 'react'; import { useCallback, useMemo, useState } from 'react'; import { Button, ButtonType, Header, LoadingIndicator } from '@iota/apps-ui-kit'; -import { useAccountByAddress } from '../../hooks/useAccountByAddress'; +import { useAccountByAddress } from '_hooks'; import { DAppInfoCard, UnlockAccountButton } from '_components'; interface UserApproveContainerProps { diff --git a/apps/wallet/src/ui/app/experimentation/feature-gating.ts b/apps/wallet/src/ui/app/experimentation/featureGating.ts similarity index 100% rename from apps/wallet/src/ui/app/experimentation/feature-gating.ts rename to apps/wallet/src/ui/app/experimentation/featureGating.ts diff --git a/apps/wallet/src/ui/app/helpers/accounts.ts b/apps/wallet/src/ui/app/helpers/accounts.ts index 55f3d9a5d87..215afff629e 100644 --- a/apps/wallet/src/ui/app/helpers/accounts.ts +++ b/apps/wallet/src/ui/app/helpers/accounts.ts @@ -2,9 +2,9 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { AccountType, type SerializedUIAccount } from '_src/background/accounts/Account'; -import { isMnemonicSerializedUiAccount } from '_src/background/accounts/MnemonicAccount'; -import { isSeedSerializedUiAccount } from '_src/background/accounts/SeedAccount'; +import { AccountType, type SerializedUIAccount } from '_src/background/accounts/account'; +import { isMnemonicSerializedUiAccount } from '_src/background/accounts/mnemonicAccount'; +import { isSeedSerializedUiAccount } from '_src/background/accounts/seedAccount'; export function getKey(account: SerializedUIAccount): string { if (isMnemonicSerializedUiAccount(account)) return account.sourceID; diff --git a/apps/wallet/src/ui/app/helpers/checkStakingTxn.ts b/apps/wallet/src/ui/app/helpers/checkStakingTxn.ts deleted file mode 100644 index a0022b8a10b..00000000000 --- a/apps/wallet/src/ui/app/helpers/checkStakingTxn.ts +++ /dev/null @@ -1,10 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// Modifications Copyright (c) 2024 IOTA Stiftung -// SPDX-License-Identifier: Apache-2.0 - -import type { IotaTransactionBlockResponse } from '@iota/iota-sdk/client'; - -// TODO: Support programmable transactions: -export function checkStakingTxn(_txn: IotaTransactionBlockResponse) { - return false; -} diff --git a/apps/wallet/src/ui/app/helpers/formatDate.ts b/apps/wallet/src/ui/app/helpers/formatDate.ts deleted file mode 100644 index d6aaab10be8..00000000000 --- a/apps/wallet/src/ui/app/helpers/formatDate.ts +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// Modifications Copyright (c) 2024 IOTA Stiftung -// SPDX-License-Identifier: Apache-2.0 - -// TODO - handle multiple date formats -// Wed Aug 05 -// -type Show = 'year' | 'month' | 'day' | 'hour' | 'minute' | 'second' | 'weekday'; -export default function formatDate(timeStamp: number, show: Show[]): string { - const date = new Date(timeStamp); - if (!(date instanceof Date) || !show.length) return ''; - - const OPTIONS = { - year: 'numeric', - month: 'short', - day: 'numeric', - hour: 'numeric', - weekday: 'short', - minute: 'numeric', - second: 'numeric', - }; - - const formatOptions = show.reduce((accumulator, current: Show) => { - const responseObj = { - ...accumulator, - ...{ [current]: OPTIONS[current] }, - }; - return responseObj; - }, {}); - - return new Intl.DateTimeFormat('en-US', formatOptions).format(date); -} diff --git a/apps/wallet/src/ui/app/helpers/getEventsSummary.ts b/apps/wallet/src/ui/app/helpers/getEventsSummary.ts deleted file mode 100644 index e6baefa2c33..00000000000 --- a/apps/wallet/src/ui/app/helpers/getEventsSummary.ts +++ /dev/null @@ -1,80 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// Modifications Copyright (c) 2024 IOTA Stiftung -// SPDX-License-Identifier: Apache-2.0 - -export {}; - -// import { -// getCoinBalanceChangeEvent, -// getTransferObjectEvent, -// isEventType, -// type TransactionEvents, -// } from '@iota/iota-sdk'; - -// export type CoinsMetaProps = { -// amount: number; -// coinType: string; -// receiverAddress: string; -// }; - -// export type TxnMetaResponse = { -// objectIDs: string[]; -// coins: CoinsMetaProps[]; -// }; - -// export function getEventsSummary( -// events: TransactionEvents, -// address: string -// ): TxnMetaResponse { -// const coinsMeta = {} as { [coinType: string]: CoinsMetaProps }; -// const objectIDs: string[] = []; - -// events.forEach((event) => { -// // Aggregate coinBalanceChange by coinType and address -// // A net positive amount means the user received coins -// // A net negative amount means the user sent coins -// if ( -// event.type === 'coinBalanceChange' && -// event?.content?.changeType && -// ['Receive', 'Pay'].includes(event?.content?.changeType) -// ) { -// const coinBalanceChange = getCoinBalanceChangeEvent(event)!; -// const { coinType, amount, owner, sender } = coinBalanceChange; - -// const AddressOwner = -// owner !== 'Immutable' && 'AddressOwner' in owner -// ? owner.AddressOwner -// : null; - -// // ChangeEpoch txn includes coinBalanceChange event for other addresses -// if ( -// AddressOwner === address || -// (address === sender && AddressOwner) -// ) { -// coinsMeta[`${AddressOwner}${coinType}`] = { -// amount: -// (coinsMeta[`${AddressOwner}${coinType}`]?.amount || 0) + -// +amount, -// coinType: coinType, -// receiverAddress: AddressOwner, -// }; -// } -// } - -// // return objectIDs of the transfer objects -// if (isEventType(event, 'transferObject')) { -// const transferObject = getTransferObjectEvent(event)!; -// const { AddressOwner } = transferObject.recipient as { -// AddressOwner: string; -// }; -// if (AddressOwner === address) { -// objectIDs.push(transferObject?.objectId); -// } -// } -// }); - -// return { -// objectIDs, -// coins: Object.values(coinsMeta), -// }; -// } diff --git a/apps/wallet/src/ui/app/helpers/index.ts b/apps/wallet/src/ui/app/helpers/index.ts index fde8b2c4f27..2c7c2b77137 100644 --- a/apps/wallet/src/ui/app/helpers/index.ts +++ b/apps/wallet/src/ui/app/helpers/index.ts @@ -2,9 +2,9 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -export { default as formatDate } from './formatDate'; -export { default as notEmpty } from './notEmptyCheck'; -// export { getEventsSummary } from './getEventsSummary'; -export { getAmount } from './getAmount'; -export { checkStakingTxn } from './checkStakingTxn'; -export { formatAccountName } from './formatAccountName'; +export * from './getAmount'; +export * from './formatAccountName'; +export * from './accounts'; +export * from './errorMessages'; +export * from './sentry'; +export * from './queryClient'; diff --git a/apps/wallet/src/ui/app/helpers/notEmptyCheck.ts b/apps/wallet/src/ui/app/helpers/notEmptyCheck.ts deleted file mode 100644 index 1156113349a..00000000000 --- a/apps/wallet/src/ui/app/helpers/notEmptyCheck.ts +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// Modifications Copyright (c) 2024 IOTA Stiftung -// SPDX-License-Identifier: Apache-2.0 - -export default function notEmpty<TValue>(value: TValue | null | undefined): value is TValue { - if (value === null || value === undefined) return false; - return true; -} diff --git a/apps/wallet/src/ui/app/helpers/queryClient.ts b/apps/wallet/src/ui/app/helpers/queryClient.ts index 7b7ccaf349e..54b56da5298 100644 --- a/apps/wallet/src/ui/app/helpers/queryClient.ts +++ b/apps/wallet/src/ui/app/helpers/queryClient.ts @@ -6,6 +6,8 @@ import { QueryClient } from '@tanstack/react-query'; import { type PersistedClient, type Persister } from '@tanstack/react-query-persist-client'; import { del, get, set } from 'idb-keyval'; +export const ACCOUNTS_QUERY_KEY = ['background', 'client', 'accounts']; + export const queryClient = new QueryClient({ defaultOptions: { queries: { diff --git a/apps/wallet/src/ui/app/helpers/query-client-keys.ts b/apps/wallet/src/ui/app/helpers/queryClientKeys.ts similarity index 100% rename from apps/wallet/src/ui/app/helpers/query-client-keys.ts rename to apps/wallet/src/ui/app/helpers/queryClientKeys.ts diff --git a/apps/wallet/src/ui/app/helpers/sentry.ts b/apps/wallet/src/ui/app/helpers/sentry.ts index 7be751f15d2..3204e834c82 100644 --- a/apps/wallet/src/ui/app/helpers/sentry.ts +++ b/apps/wallet/src/ui/app/helpers/sentry.ts @@ -2,16 +2,15 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { growthbook } from '_src/ui/app/experimentation/feature-gating'; +import { growthbook } from '_src/ui/app/experimentation/featureGating'; import * as Sentry from '@sentry/react'; import { Feature } from '@iota/core'; +import { getSentryConfig } from '../../../shared/sentryConfig'; -import { getSentryConfig } from '../../../shared/sentry-config'; - -export default function initSentry() { +export function initSentry() { Sentry.init( getSentryConfig({ - integrations: [new Sentry.BrowserTracing()], + integrations: [Sentry.browserTracingIntegration()], tracesSampler: () => { return growthbook.getFeatureValue(Feature.WalletSentryTracing, 0); }, diff --git a/apps/wallet/src/ui/app/hooks/index.ts b/apps/wallet/src/ui/app/hooks/index.ts index f788f5dce44..6ac1ac8378d 100644 --- a/apps/wallet/src/ui/app/hooks/index.ts +++ b/apps/wallet/src/ui/app/hooks/index.ts @@ -2,19 +2,38 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -export { default as useAppDispatch } from './useAppDispatch'; -export { default as useAppSelector } from './useAppSelector'; -export { default as useInitializedGuard } from './useInitializedGuard'; -export { default as useFullscreenGuard } from './useFullscreenGuard'; -export { default as useOnClickOutside } from './useOnClickOutside'; -export { default as useOnKeyboardEvent } from './useOnKeyboardEvent'; -export { useTransactionDryRun } from './useTransactionDryRun'; -export { useGetTxnRecipientAddress } from './useGetTxnRecipientAddress'; -export { useGetTransferAmount } from './useGetTransferAmount'; -export { useCopyToClipboard } from './useCopyToClipboard'; +export * from './useAppDispatch'; +export * from './useAppSelector'; +export * from './useInitializedGuard'; +export * from './useFullscreenGuard'; +export * from './useOnKeyboardEvent'; +export * from './useTransactionDryRun'; +export * from './useCopyToClipboard'; export * from './useExplorerLink'; - export * from './useTransactionData'; export * from './useActiveAddress'; export * from './useCoinsReFetchingConfig'; export * from './useSetGrowthbookAttributes'; +export * from './useAccountByAddress'; +export * from './useAccountGroups'; +export * from './useAccountSources'; +export * from './useAccounts'; +export * from './useAccountsFinder'; +export * from './useActiveAccount'; +export * from './useAutoLockMinutes'; +export * from './useAutoLockMinutesMutation'; +export * from './useBackgroundClient'; +export * from './useCreateAccountsMutation'; +export * from './useExportPassphraseMutation'; +export * from './useExportSeedMutation'; +export * from './useInitialPageView'; +export * from './usePinnedCoinTypes'; +export * from './useRecognizedPackages'; +export * from './useRecoveryDataMutation'; +export * from './useResetPasswordMutation'; +export * from './useResolveVideo'; +export * from './useRestrictedGuard'; +export * from './useSigner'; +export * from './useStorageMigrationStatus'; +export * from './useUnlockMutation'; +export * from './useUnlockedGuard'; diff --git a/apps/wallet/src/ui/app/hooks/useAccountSources.ts b/apps/wallet/src/ui/app/hooks/useAccountSources.ts index f5828295431..0059e441303 100644 --- a/apps/wallet/src/ui/app/hooks/useAccountSources.ts +++ b/apps/wallet/src/ui/app/hooks/useAccountSources.ts @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { type AccountSourceSerializedUI } from '_src/background/account-sources/AccountSource'; +import { type AccountSourceSerializedUI } from '_src/background/account-sources/accountSource'; import { useQuery } from '@tanstack/react-query'; import { useBackgroundClient } from './useBackgroundClient'; diff --git a/apps/wallet/src/ui/app/hooks/useAccounts.ts b/apps/wallet/src/ui/app/hooks/useAccounts.ts index a548c0fab97..280315ff6a5 100644 --- a/apps/wallet/src/ui/app/hooks/useAccounts.ts +++ b/apps/wallet/src/ui/app/hooks/useAccounts.ts @@ -2,10 +2,9 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { type SerializedUIAccount } from '_src/background/accounts/Account'; +import { type SerializedUIAccount } from '_src/background/accounts/account'; import { useQuery } from '@tanstack/react-query'; - -import { ACCOUNTS_QUERY_KEY } from '../helpers/query-client-keys'; +import { ACCOUNTS_QUERY_KEY } from '../helpers/queryClientKeys'; import { useBackgroundClient } from './useBackgroundClient'; export function useAccounts() { diff --git a/apps/wallet/src/ui/app/hooks/useAccountsFinder.ts b/apps/wallet/src/ui/app/hooks/useAccountsFinder.ts index ae85a99612b..7ba9534970f 100644 --- a/apps/wallet/src/ui/app/hooks/useAccountsFinder.ts +++ b/apps/wallet/src/ui/app/hooks/useAccountsFinder.ts @@ -12,7 +12,7 @@ import type { } from '_src/shared/messaging/messages/payloads/accounts-finder'; 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_BIP44_COIN_TYPE } from '../redux/slices/iota-objects/coin'; import { IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; export interface UseAccountFinderOptions { diff --git a/apps/wallet/src/ui/app/hooks/useAddressLink.ts b/apps/wallet/src/ui/app/hooks/useAddressLink.ts deleted file mode 100644 index 86d0956d087..00000000000 --- a/apps/wallet/src/ui/app/hooks/useAddressLink.ts +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright (c) 2024 IOTA Stiftung -// SPDX-License-Identifier: Apache-2.0 - -import { useExplorerLink } from '_app/hooks/useExplorerLink'; -import { ExplorerLinkType } from '_components'; -import { formatAddress } from '@iota/iota-sdk/utils'; - -export function useAddressLink(inputAddress: string | null) { - const outputAddress = inputAddress || ''; - const explorerHref = useExplorerLink({ - type: ExplorerLinkType.Address, - address: outputAddress || undefined, - }); - - return { - explorerHref: explorerHref || '', - addressFull: inputAddress || '', - address: formatAddress(outputAddress), - }; -} diff --git a/apps/wallet/src/ui/app/hooks/useAppDispatch.ts b/apps/wallet/src/ui/app/hooks/useAppDispatch.ts index b02feed0d22..4e475ac3606 100644 --- a/apps/wallet/src/ui/app/hooks/useAppDispatch.ts +++ b/apps/wallet/src/ui/app/hooks/useAppDispatch.ts @@ -5,6 +5,6 @@ import type { AppDispatch } from '_store'; import { useDispatch } from 'react-redux'; -export default function useAppDispatch() { +export function useAppDispatch() { return useDispatch<AppDispatch>(); } diff --git a/apps/wallet/src/ui/app/hooks/useAppSelector.ts b/apps/wallet/src/ui/app/hooks/useAppSelector.ts index 73eef316546..f2eca930bdf 100644 --- a/apps/wallet/src/ui/app/hooks/useAppSelector.ts +++ b/apps/wallet/src/ui/app/hooks/useAppSelector.ts @@ -2,10 +2,8 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import type { RootState } from '_redux/RootReducer'; +import type { RootState } from '_src/ui/app/redux/rootReducer'; import { useSelector } from 'react-redux'; import type { TypedUseSelectorHook } from 'react-redux'; -const useAppSelector: TypedUseSelectorHook<RootState> = useSelector; - -export default useAppSelector; +export const useAppSelector: TypedUseSelectorHook<RootState> = useSelector; diff --git a/apps/wallet/src/ui/app/hooks/useAutoLockMinutesMutation.ts b/apps/wallet/src/ui/app/hooks/useAutoLockMinutesMutation.ts index 07887bae398..30e679719a0 100644 --- a/apps/wallet/src/ui/app/hooks/useAutoLockMinutesMutation.ts +++ b/apps/wallet/src/ui/app/hooks/useAutoLockMinutesMutation.ts @@ -3,7 +3,6 @@ // SPDX-License-Identifier: Apache-2.0 import { useMutation, useQueryClient } from '@tanstack/react-query'; - import { AUTO_LOCK_MINUTES_QUERY_KEY } from './useAutoLockMinutes'; import { useBackgroundClient } from './useBackgroundClient'; diff --git a/apps/wallet/src/ui/app/hooks/useBackgroundClient.ts b/apps/wallet/src/ui/app/hooks/useBackgroundClient.ts index ef19242b4d2..5d28ea623aa 100644 --- a/apps/wallet/src/ui/app/hooks/useBackgroundClient.ts +++ b/apps/wallet/src/ui/app/hooks/useBackgroundClient.ts @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { thunkExtras } from '../redux/store/thunk-extras'; +import { thunkExtras } from '../redux/store/thunkExtras'; export function useBackgroundClient() { return thunkExtras.background; diff --git a/apps/wallet/src/ui/app/hooks/useCountAccountByType.ts b/apps/wallet/src/ui/app/hooks/useCountAccountByType.ts deleted file mode 100644 index 0f722f25c72..00000000000 --- a/apps/wallet/src/ui/app/hooks/useCountAccountByType.ts +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// Modifications Copyright (c) 2024 IOTA Stiftung -// SPDX-License-Identifier: Apache-2.0 - -import { type AccountType } from '_src/background/accounts/Account'; -import { useMemo } from 'react'; - -import { useAccounts } from './useAccounts'; - -export function useCountAccountsByType() { - const { data: accounts, isPending } = useAccounts(); - const countPerType = useMemo( - () => - accounts?.reduce<Partial<Record<AccountType, { total: number }>>>((acc, anAccount) => { - acc[anAccount.type] = acc[anAccount.type] || { total: 0 }; - acc[anAccount.type]!.total++; - return acc; - }, {}) || {}, - [accounts], - ); - return { data: countPerType, isPending }; -} diff --git a/apps/wallet/src/ui/app/hooks/useCreateAccountMutation.ts b/apps/wallet/src/ui/app/hooks/useCreateAccountsMutation.ts similarity index 90% rename from apps/wallet/src/ui/app/hooks/useCreateAccountMutation.ts rename to apps/wallet/src/ui/app/hooks/useCreateAccountsMutation.ts index 843f4462a53..65ce909edcc 100644 --- a/apps/wallet/src/ui/app/hooks/useCreateAccountMutation.ts +++ b/apps/wallet/src/ui/app/hooks/useCreateAccountsMutation.ts @@ -7,7 +7,7 @@ import { useMutation } from '@tanstack/react-query'; import { useAccountsFormContext, AccountsFormType, type AccountsFormValues } from '_components'; import { useBackgroundClient } from './useBackgroundClient'; -import { AccountType } from '_src/background/accounts/Account'; +import { AccountType } from '_src/background/accounts/account'; function validateAccountFormValues<T extends AccountsFormType>( createType: T, @@ -36,22 +36,21 @@ enum AmpliAccountType { Ledger = 'Ledger', } -const CREATE_TYPE_TO_AMPLI_ACCOUNT: Record< - AccountsFormType, - AddedAccountsProperties['accountType'] -> = { - [AccountsFormType.NewMnemonic]: AmpliAccountType.Derived, - [AccountsFormType.ImportMnemonic]: AmpliAccountType.Derived, - [AccountsFormType.ImportSeed]: AmpliAccountType.Derived, - [AccountsFormType.MnemonicSource]: AmpliAccountType.Derived, - [AccountsFormType.SeedSource]: AmpliAccountType.Derived, - [AccountsFormType.ImportPrivateKey]: AmpliAccountType.ImportPrivateKey, - [AccountsFormType.ImportLedger]: AmpliAccountType.Ledger, -}; - export function useCreateAccountsMutation() { const backgroundClient = useBackgroundClient(); const [accountsFormValuesRef, setAccountFormValues] = useAccountsFormContext(); + const CREATE_TYPE_TO_AMPLI_ACCOUNT: Record< + AccountsFormType, + AddedAccountsProperties['accountType'] + > = { + [AccountsFormType.NewMnemonic]: AmpliAccountType.Derived, + [AccountsFormType.ImportMnemonic]: AmpliAccountType.Derived, + [AccountsFormType.ImportSeed]: AmpliAccountType.Derived, + [AccountsFormType.MnemonicSource]: AmpliAccountType.Derived, + [AccountsFormType.SeedSource]: AmpliAccountType.Derived, + [AccountsFormType.ImportPrivateKey]: AmpliAccountType.ImportPrivateKey, + [AccountsFormType.ImportLedger]: AmpliAccountType.Ledger, + }; return useMutation({ mutationKey: ['create accounts'], mutationFn: async ({ type, password }: { type: AccountsFormType; password?: string }) => { diff --git a/apps/wallet/src/ui/app/hooks/useExplorerLink.ts b/apps/wallet/src/ui/app/hooks/useExplorerLink.ts index 33bfb54dd1b..5320791655a 100644 --- a/apps/wallet/src/ui/app/hooks/useExplorerLink.ts +++ b/apps/wallet/src/ui/app/hooks/useExplorerLink.ts @@ -4,7 +4,7 @@ import { type ExplorerLinkConfig, getExplorerLink as useGetExplorerLink } from '@iota/core'; import { useActiveAddress } from './useActiveAddress'; -import useAppSelector from './useAppSelector'; +import { useAppSelector } from './useAppSelector'; export function useExplorerLink(linkConfig: ExplorerLinkConfig) { const app = useAppSelector(({ app }) => app); diff --git a/apps/wallet/src/ui/app/hooks/useExportPassphraseMutation.ts b/apps/wallet/src/ui/app/hooks/useExportPassphraseMutation.ts index a55ff565788..4fcbc57cdba 100644 --- a/apps/wallet/src/ui/app/hooks/useExportPassphraseMutation.ts +++ b/apps/wallet/src/ui/app/hooks/useExportPassphraseMutation.ts @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { type MethodPayload } from '_src/shared/messaging/messages/payloads/MethodPayload'; +import { type MethodPayload } from '_src/shared/messaging/messages/payloads/methodPayload'; import { entropyToMnemonic, toEntropy } from '_src/shared/utils'; import { useMutation } from '@tanstack/react-query'; diff --git a/apps/wallet/src/ui/app/hooks/useExportSeedMutation.ts b/apps/wallet/src/ui/app/hooks/useExportSeedMutation.ts index ba08ea658e1..fb53230b57e 100644 --- a/apps/wallet/src/ui/app/hooks/useExportSeedMutation.ts +++ b/apps/wallet/src/ui/app/hooks/useExportSeedMutation.ts @@ -1,7 +1,7 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { type MethodPayload } from '_src/shared/messaging/messages/payloads/MethodPayload'; +import { type MethodPayload } from '_src/shared/messaging/messages/payloads/methodPayload'; import { useMutation } from '@tanstack/react-query'; import { useBackgroundClient } from './useBackgroundClient'; diff --git a/apps/wallet/src/ui/app/hooks/useFullscreenGuard.ts b/apps/wallet/src/ui/app/hooks/useFullscreenGuard.ts index 6e38ea7e66a..6c09bedfaca 100644 --- a/apps/wallet/src/ui/app/hooks/useFullscreenGuard.ts +++ b/apps/wallet/src/ui/app/hooks/useFullscreenGuard.ts @@ -2,13 +2,12 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { AppType } from '_redux/slices/app/AppType'; +import { AppType } from '_src/ui/app/redux/slices/app/appType'; import { openInNewTab } from '_shared/utils'; import { useEffect, useRef } from 'react'; +import { useAppSelector } from './useAppSelector'; -import useAppSelector from './useAppSelector'; - -export default function useFullscreenGuard(enabled: boolean) { +export function useFullscreenGuard(enabled: boolean) { const appType = useAppSelector((state) => state.app.appType); const isOpenTabInProgressRef = useRef(false); useEffect(() => { diff --git a/apps/wallet/src/ui/app/hooks/useGetTransferAmount.ts b/apps/wallet/src/ui/app/hooks/useGetTransferAmount.ts deleted file mode 100644 index 24dc6c0d62a..00000000000 --- a/apps/wallet/src/ui/app/hooks/useGetTransferAmount.ts +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// Modifications Copyright (c) 2024 IOTA Stiftung -// SPDX-License-Identifier: Apache-2.0 - -import { getAmount } from '_helpers'; -import type { IotaTransactionBlockResponse } from '@iota/iota-sdk/client'; -import { IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; -import { useMemo } from 'react'; - -export function useGetTransferAmount({ - txn, - activeAddress, -}: { - txn: IotaTransactionBlockResponse; - activeAddress: string; -}) { - const { effects, events } = txn; - // const { coins } = getEventsSummary(events!, activeAddress); - - const iotaTransfer = useMemo(() => { - const txdetails = txn.transaction?.data.transaction; - return !txdetails - ? [] - : getAmount(txdetails, effects!, events!)?.map( - ({ amount, coinType, recipientAddress }) => { - return { - amount: amount || 0, - coinType: coinType || IOTA_TYPE_ARG, - receiverAddress: recipientAddress, - }; - }, - ); - }, [txn, effects, events]); - - // MUSTFIX(chris) - // const transferAmount = useMemo(() => { - // return iotaTransfer?.length - // ? iotaTransfer - // : coins.filter( - // ({ receiverAddress }) => receiverAddress === activeAddress - // ); - // }, [iotaTransfer, coins, activeAddress]); - - // return iotaTransfer ?? transferAmount; - return iotaTransfer; -} diff --git a/apps/wallet/src/ui/app/hooks/useGetTxnRecipientAddress.ts b/apps/wallet/src/ui/app/hooks/useGetTxnRecipientAddress.ts deleted file mode 100644 index 35196877b94..00000000000 --- a/apps/wallet/src/ui/app/hooks/useGetTxnRecipientAddress.ts +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// Modifications Copyright (c) 2024 IOTA Stiftung -// SPDX-License-Identifier: Apache-2.0 - -import { getAmount } from '_helpers'; -import { type IotaTransactionBlockResponse } from '@iota/iota-sdk/client'; -import { useMemo } from 'react'; - -type Props = { - txn: IotaTransactionBlockResponse; - address: string; -}; - -export function useGetTxnRecipientAddress({ txn, address }: Props) { - const events = txn.events!; - - // const eventsSummary = useMemo(() => { - // const { coins } = getEventsSummary(events, address); - // return coins; - // }, [events, address]); - - const transaction = txn.transaction?.data.transaction; - const amountByRecipient = !transaction ? null : getAmount(transaction, txn.effects!, events); - - const recipientAddress = useMemo(() => { - const transferObjectRecipientAddress = - amountByRecipient && - amountByRecipient?.find(({ recipientAddress }) => recipientAddress !== address) - ?.recipientAddress; - // MUSTFIX(chris) - // const receiverAddr = - // eventsSummary && - // eventsSummary.find( - // ({ receiverAddress }) => receiverAddress !== address - // )?.receiverAddress; - - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - return null ?? transferObjectRecipientAddress ?? txn.transaction?.data.sender; - }, [address, amountByRecipient, txn]); - // }, [address, amountByRecipient, eventsSummary, txn]); - - return recipientAddress; -} diff --git a/apps/wallet/src/ui/app/hooks/useInitialPageView.ts b/apps/wallet/src/ui/app/hooks/useInitialPageView.ts index 1fde2375182..3a163c4a23e 100644 --- a/apps/wallet/src/ui/app/hooks/useInitialPageView.ts +++ b/apps/wallet/src/ui/app/hooks/useInitialPageView.ts @@ -8,10 +8,9 @@ import { getNetwork } from '@iota/iota-sdk/client'; import { useEffect } from 'react'; import { useLocation } from 'react-router-dom'; import Browser from 'webextension-polyfill'; - -import { AppType } from '../redux/slices/app/AppType'; +import { AppType } from '../redux/slices/app/appType'; import { useActiveAccount } from './useActiveAccount'; -import useAppSelector from './useAppSelector'; +import { useAppSelector } from './useAppSelector'; export function useInitialPageView() { const activeAccount = useActiveAccount(); diff --git a/apps/wallet/src/ui/app/hooks/useInitializedGuard.ts b/apps/wallet/src/ui/app/hooks/useInitializedGuard.ts index 16a735611c9..7ff822116d0 100644 --- a/apps/wallet/src/ui/app/hooks/useInitializedGuard.ts +++ b/apps/wallet/src/ui/app/hooks/useInitializedGuard.ts @@ -4,11 +4,10 @@ import { useEffect } from 'react'; import { useNavigate } from 'react-router-dom'; - import { useAccounts } from './useAccounts'; import { useRestrictedGuard } from './useRestrictedGuard'; -export default function useInitializedGuard(initializedRequired: boolean, enabled = true) { +export function useInitializedGuard(initializedRequired: boolean, enabled = true) { const restricted = useRestrictedGuard(); const { data: allAccounts, isPending } = useAccounts(); const isInitialized = !!allAccounts?.length; diff --git a/apps/wallet/src/ui/app/hooks/useOnClickOutside.ts b/apps/wallet/src/ui/app/hooks/useOnClickOutside.ts deleted file mode 100644 index 4cd2e61541b..00000000000 --- a/apps/wallet/src/ui/app/hooks/useOnClickOutside.ts +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// Modifications Copyright (c) 2024 IOTA Stiftung -// SPDX-License-Identifier: Apache-2.0 - -import { useEffect } from 'react'; -import type { RefObject } from 'react'; - -type Event = MouseEvent | TouchEvent; - -const useOnClickOutside = <T extends HTMLElement = HTMLElement>( - ref: RefObject<T>, - handler: (event: Event) => void, -) => { - useEffect(() => { - const listener = (event: Event) => { - const el = ref?.current; - if (!el || el.contains(event?.target as Node)) { - return; - } - - handler(event); // Call the handler only if the click is outside of the element passed. - }; - - document.addEventListener('click', listener, true); - document.addEventListener('touchstart', listener, true); - - return () => { - document.removeEventListener('click', listener, true); - document.removeEventListener('touchstart', listener, true); - }; - }, [ref, handler]); // Reload only if ref or handler changes -}; - -export default useOnClickOutside; diff --git a/apps/wallet/src/ui/app/hooks/useOnKeyboardEvent.ts b/apps/wallet/src/ui/app/hooks/useOnKeyboardEvent.ts index 160745ce239..34dc3e886ad 100644 --- a/apps/wallet/src/ui/app/hooks/useOnKeyboardEvent.ts +++ b/apps/wallet/src/ui/app/hooks/useOnKeyboardEvent.ts @@ -4,7 +4,7 @@ import { useEffect } from 'react'; -function useOnKeyboardEvent<K extends 'keydown' | 'keyup' | 'keypress'>( +export function useOnKeyboardEvent<K extends 'keydown' | 'keyup' | 'keypress'>( eventType: K, keys: string[], handler: (e: KeyboardEvent) => void, @@ -26,5 +26,3 @@ function useOnKeyboardEvent<K extends 'keydown' | 'keyup' | 'keypress'>( } }, [eventType, keys, handler, enabled]); } - -export default useOnKeyboardEvent; diff --git a/apps/wallet/src/ui/app/hooks/useRecognizedPackages.ts b/apps/wallet/src/ui/app/hooks/useRecognizedPackages.ts index 7c9eb1d0f55..6e7a1be92c6 100644 --- a/apps/wallet/src/ui/app/hooks/useRecognizedPackages.ts +++ b/apps/wallet/src/ui/app/hooks/useRecognizedPackages.ts @@ -4,7 +4,7 @@ import { useFeatureValue } from '@growthbook/growthbook-react'; import { Network } from '@iota/iota-sdk/client'; -import useAppSelector from './useAppSelector'; +import { useAppSelector } from './useAppSelector'; import { DEFAULT_RECOGNIZED_PACKAGES, Feature } from '@iota/core'; export function useRecognizedPackages() { diff --git a/apps/wallet/src/ui/app/hooks/useRecoveryDataMutation.ts b/apps/wallet/src/ui/app/hooks/useRecoveryDataMutation.ts index 0567bef0896..8db1f1d483d 100644 --- a/apps/wallet/src/ui/app/hooks/useRecoveryDataMutation.ts +++ b/apps/wallet/src/ui/app/hooks/useRecoveryDataMutation.ts @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { type PasswordRecoveryData } from '_src/shared/messaging/messages/payloads/MethodPayload'; +import { type PasswordRecoveryData } from '_src/shared/messaging/messages/payloads/methodPayload'; import { useMutation } from '@tanstack/react-query'; import { useForgotPasswordContext } from '../pages/accounts/forgot-password/ForgotPasswordPage'; diff --git a/apps/wallet/src/ui/app/hooks/useSigner.ts b/apps/wallet/src/ui/app/hooks/useSigner.ts index a7e6398a071..3fa8ba95b2c 100644 --- a/apps/wallet/src/ui/app/hooks/useSigner.ts +++ b/apps/wallet/src/ui/app/hooks/useSigner.ts @@ -2,14 +2,14 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { type SerializedUIAccount } from '_src/background/accounts/Account'; -import { isLedgerAccountSerializedUI } from '_src/background/accounts/LedgerAccount'; +import { type SerializedUIAccount } from '_src/background/accounts/account'; +import { isLedgerAccountSerializedUI } from '_src/background/accounts/ledgerAccount'; import { useIotaClient } from '@iota/dapp-kit'; -import { walletApiProvider } from '../ApiProvider'; +import { walletApiProvider } from '../apiProvider'; import { useIotaLedgerClient } from '_components'; -import { LedgerSigner } from '../LedgerSigner'; -import { type WalletSigner } from '../WalletSigner'; +import { LedgerSigner } from '../ledgerSigner'; +import { type WalletSigner } from '../walletSigner'; import { useBackgroundClient } from './useBackgroundClient'; export function useSigner(account: SerializedUIAccount | null): WalletSigner | null { diff --git a/apps/wallet/src/ui/app/hooks/useUnlockedGuard.ts b/apps/wallet/src/ui/app/hooks/useUnlockedGuard.ts index fb30507a6c3..ccbef72b3e3 100644 --- a/apps/wallet/src/ui/app/hooks/useUnlockedGuard.ts +++ b/apps/wallet/src/ui/app/hooks/useUnlockedGuard.ts @@ -4,9 +4,7 @@ import { useEffect } from 'react'; import { useNavigate } from 'react-router-dom'; - -import { useAccounts } from '../hooks/useAccounts'; -import { useActiveAccount } from '../hooks/useActiveAccount'; +import { useAccounts, useActiveAccount } from '_hooks'; export function useUnlockedGuard() { const navigate = useNavigate(); diff --git a/apps/wallet/src/ui/app/index.tsx b/apps/wallet/src/ui/app/index.tsx index 77f06c3f03d..b821e43fb8f 100644 --- a/apps/wallet/src/ui/app/index.tsx +++ b/apps/wallet/src/ui/app/index.tsx @@ -2,21 +2,24 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { useAppDispatch, useAppSelector } from '_hooks'; +import { + useAutoLockMinutes, + useBackgroundClient, + useInitialPageView, + useStorageMigrationStatus, + useAccounts, + useAppDispatch, + useAppSelector, +} from './hooks'; import { setNavVisibility } from '_redux/slices/app'; -import { isLedgerAccountSerializedUI } from '_src/background/accounts/LedgerAccount'; +import { isLedgerAccountSerializedUI } from '_src/background/accounts/ledgerAccount'; import { persistableStorage } from '_src/shared/analytics/amplitude'; -import { type LedgerAccountsPublicKeys } from '_src/shared/messaging/messages/payloads/MethodPayload'; +import { type LedgerAccountsPublicKeys } from '_src/shared/messaging/messages/payloads/methodPayload'; import { toB64 } from '@iota/iota-sdk/utils'; import { useEffect, useMemo } from 'react'; import { Navigate, Route, Routes, useLocation } from 'react-router-dom'; import { throttle } from 'throttle-debounce'; - import { useIotaLedgerClient } from './components/ledger/IotaLedgerClientProvider'; -import { useAccounts } from './hooks/useAccounts'; -import { useAutoLockMinutes } from './hooks/useAutoLockMinutes'; -import { useBackgroundClient } from './hooks/useBackgroundClient'; -import { useInitialPageView } from './hooks/useInitialPageView'; import { AccountsPage } from './pages/accounts/AccountsPage'; import { AddAccountPage } from './pages/accounts/AddAccountPage'; import { BackupMnemonicPage } from './pages/accounts/BackupMnemonicPage'; @@ -37,7 +40,8 @@ import { ManageAccountsPage } from './pages/accounts/manage/ManageAccountsPage'; import { ProtectAccountPage } from './pages/accounts/ProtectAccountPage'; import { WelcomePage } from './pages/accounts/WelcomePage'; import { ApprovalRequestPage } from './pages/approval-request'; -import HomePage, { +import { + HomePage, AppsPage, AssetsPage, CoinsSelectorPage, @@ -48,14 +52,14 @@ import HomePage, { TransactionBlocksPage, TransferCoinPage, } from './pages/home'; -import TokenDetailsPage from './pages/home/tokens/TokenDetailsPage'; +import { TokenDetailsPage } from './pages/home/tokens/TokenDetailsPage'; import { RestrictedPage } from './pages/restricted'; -import SiteConnectPage from './pages/site-connect'; -import { AppType } from './redux/slices/app/AppType'; +import { SiteConnectPage } from './pages/site-connect'; +import { AppType } from './redux/slices/app/appType'; import { StakingPage } from './staking/home'; import { StorageMigrationPage } from './pages/StorageMigrationPage'; -import { useStorageMigrationStatus } from './hooks/useStorageMigrationStatus'; import { AccountsFinderPage } from './pages/accounts/manage/accounts-finder/AccountsFinderPage'; +import { AccountsFinderIntroPage } from './pages/accounts/manage/accounts-finder/AccountsFinderIntroPage'; const HIDDEN_MENU_PATHS = [ '/nft-details', @@ -68,7 +72,7 @@ const HIDDEN_MENU_PATHS = [ const NOTIFY_USER_ACTIVE_INTERVAL = 5 * 1000; // 5 seconds -const App = () => { +export function App() { const dispatch = useAppDispatch(); const isPopup = useAppSelector((state) => state.app.appType === AppType.Popup); useEffect(() => { @@ -189,6 +193,7 @@ const App = () => { <Route path="import-private-key" element={<ImportPrivateKeyPage />} /> <Route path="import-seed" element={<ImportSeedPage />} /> <Route path="manage" element={<ManageAccountsPage />} /> + <Route path="manage/accounts-finder/intro" element={<AccountsFinderIntroPage />} /> <Route path="manage/accounts-finder/:accountSourceId" element={<AccountsFinderPage />} @@ -215,6 +220,4 @@ const App = () => { </Route> </Routes> ); -}; - -export default App; +} diff --git a/apps/wallet/src/ui/app/LedgerSigner.ts b/apps/wallet/src/ui/app/ledgerSigner.ts similarity index 98% rename from apps/wallet/src/ui/app/LedgerSigner.ts rename to apps/wallet/src/ui/app/ledgerSigner.ts index 2d824f45324..2ac65e1ca5c 100644 --- a/apps/wallet/src/ui/app/LedgerSigner.ts +++ b/apps/wallet/src/ui/app/ledgerSigner.ts @@ -7,7 +7,7 @@ import { type IotaClient } from '@iota/iota-sdk/client'; import { toSerializedSignature, type SignatureScheme } from '@iota/iota-sdk/cryptography'; import { Ed25519PublicKey } from '@iota/iota-sdk/keypairs/ed25519'; -import { WalletSigner } from './WalletSigner'; +import { WalletSigner } from './walletSigner'; export class LedgerSigner extends WalletSigner { #iotaLedgerClient: IotaLedgerClient | null; diff --git a/apps/wallet/src/ui/app/pages/StorageMigrationPage.tsx b/apps/wallet/src/ui/app/pages/StorageMigrationPage.tsx index b3f37cb6e3c..71381895abb 100644 --- a/apps/wallet/src/ui/app/pages/StorageMigrationPage.tsx +++ b/apps/wallet/src/ui/app/pages/StorageMigrationPage.tsx @@ -5,8 +5,7 @@ import { useMutation } from '@tanstack/react-query'; import { toast } from 'react-hot-toast'; import { PasswordInputDialog } from '_components'; -import { useBackgroundClient } from '../hooks/useBackgroundClient'; -import { useStorageMigrationStatus } from '../hooks/useStorageMigrationStatus'; +import { useBackgroundClient, useStorageMigrationStatus } from '_hooks'; import { CardLayout } from '../shared/card-layout'; import { Toaster } from '../shared/toaster'; import { LoadingIndicator } from '@iota/apps-ui-kit'; diff --git a/apps/wallet/src/ui/app/pages/accounts/AddAccountPage.tsx b/apps/wallet/src/ui/app/pages/accounts/AddAccountPage.tsx index 6f352beb796..17f9725d778 100644 --- a/apps/wallet/src/ui/app/pages/accounts/AddAccountPage.tsx +++ b/apps/wallet/src/ui/app/pages/accounts/AddAccountPage.tsx @@ -23,10 +23,9 @@ import { PageTemplate, } from '_components'; import { getLedgerConnectionErrorMessage } from '../../helpers/errorMessages'; -import { useAppSelector } from '../../hooks'; -import { useCreateAccountsMutation } from '../../hooks/useCreateAccountMutation'; -import { AppType } from '../../redux/slices/app/AppType'; -import { Create, ImportPass, Key, Seed, Ledger } from '@iota/ui-icons'; +import { useAppSelector, useCreateAccountsMutation } from '_hooks'; +import { AppType } from '../../redux/slices/app/appType'; +import { Create, ImportPass, Key, Seed, Ledger } from '@iota/apps-ui-icons'; async function openTabWithSearchParam(searchParam: string, searchParamValue: string) { const currentURL = new URL(window.location.href); @@ -86,7 +85,7 @@ export function AddAccountPage() { ], }, { - title: 'Import from Legder', + title: 'Import from Ledger', cards: [ { title: 'Ledger', diff --git a/apps/wallet/src/ui/app/pages/accounts/BackupMnemonicPage.tsx b/apps/wallet/src/ui/app/pages/accounts/BackupMnemonicPage.tsx index 3c0d667ddc0..ca1e7dab321 100644 --- a/apps/wallet/src/ui/app/pages/accounts/BackupMnemonicPage.tsx +++ b/apps/wallet/src/ui/app/pages/accounts/BackupMnemonicPage.tsx @@ -10,13 +10,12 @@ import { InfoBoxStyle, InfoBoxType, } from '@iota/apps-ui-kit'; -import { Exclamation, Info } from '@iota/ui-icons'; +import { Exclamation, Info } from '@iota/apps-ui-icons'; import { HideShowDisplayBox, Loading, PageTemplate } from '_components'; -import { AccountSourceType } from '_src/background/account-sources/AccountSource'; +import { AccountSourceType } from '_src/background/account-sources/accountSource'; import { useEffect, useMemo, useState } from 'react'; import { Navigate, useNavigate, useParams } from 'react-router-dom'; -import { useAccountSources } from '../../hooks/useAccountSources'; -import { useExportPassphraseMutation } from '../../hooks/useExportPassphraseMutation'; +import { useAccountSources, useExportPassphraseMutation } from '_hooks'; export function BackupMnemonicPage() { const [mnemonicBackedUp, setMnemonicBackedUp] = useState(false); diff --git a/apps/wallet/src/ui/app/pages/accounts/ExportAccountPage.tsx b/apps/wallet/src/ui/app/pages/accounts/ExportAccountPage.tsx index 6307e2e7761..7160d7d33d8 100644 --- a/apps/wallet/src/ui/app/pages/accounts/ExportAccountPage.tsx +++ b/apps/wallet/src/ui/app/pages/accounts/ExportAccountPage.tsx @@ -2,14 +2,12 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { useBackgroundClient } from '_src/ui/app/hooks/useBackgroundClient'; +import { useBackgroundClient, useAccounts } from '_hooks'; import { useMutation } from '@tanstack/react-query'; import { Navigate, useNavigate, useParams } from 'react-router-dom'; - import { VerifyPasswordModal, HideShowDisplayBox, Loading, Overlay } from '_components'; -import { useAccounts } from '../../hooks/useAccounts'; import { InfoBox, InfoBoxStyle, InfoBoxType } from '@iota/apps-ui-kit'; -import { Info } from '@iota/ui-icons'; +import { Info } from '@iota/apps-ui-icons'; export function ExportAccountPage() { const { accountID } = useParams(); diff --git a/apps/wallet/src/ui/app/pages/accounts/ExportPassphrasePage.tsx b/apps/wallet/src/ui/app/pages/accounts/ExportPassphrasePage.tsx index 53287018e22..a8024277819 100644 --- a/apps/wallet/src/ui/app/pages/accounts/ExportPassphrasePage.tsx +++ b/apps/wallet/src/ui/app/pages/accounts/ExportPassphrasePage.tsx @@ -4,11 +4,10 @@ import { HideShowDisplayBox, VerifyPasswordModal, Loading, Overlay } from '_components'; import { Navigate, useNavigate, useParams } from 'react-router-dom'; -import { useAccountSources } from '../../hooks/useAccountSources'; -import { useExportPassphraseMutation } from '../../hooks/useExportPassphraseMutation'; -import { AccountSourceType } from '_src/background/account-sources/AccountSource'; +import { useAccountSources, useExportPassphraseMutation } from '_hooks'; +import { AccountSourceType } from '_src/background/account-sources/accountSource'; import { InfoBox, InfoBoxType, InfoBoxStyle } from '@iota/apps-ui-kit'; -import { Info } from '@iota/ui-icons'; +import { Info } from '@iota/apps-ui-icons'; export function ExportPassphrasePage() { const { accountSourceID } = useParams(); diff --git a/apps/wallet/src/ui/app/pages/accounts/ExportSeedPage.tsx b/apps/wallet/src/ui/app/pages/accounts/ExportSeedPage.tsx index a14ab150a52..a9c6018f241 100644 --- a/apps/wallet/src/ui/app/pages/accounts/ExportSeedPage.tsx +++ b/apps/wallet/src/ui/app/pages/accounts/ExportSeedPage.tsx @@ -3,11 +3,10 @@ import { HideShowDisplayBox, VerifyPasswordModal, Loading, Overlay } from '_components'; import { Navigate, useNavigate, useParams } from 'react-router-dom'; -import { useAccountSources } from '../../hooks/useAccountSources'; -import { useExportSeedMutation } from '../../hooks/useExportSeedMutation'; -import { AccountSourceType } from '_src/background/account-sources/AccountSource'; +import { useAccountSources, useExportSeedMutation } from '_hooks'; +import { AccountSourceType } from '_src/background/account-sources/accountSource'; import { InfoBox, InfoBoxType, InfoBoxStyle } from '@iota/apps-ui-kit'; -import { Info } from '@iota/ui-icons'; +import { Info } from '@iota/apps-ui-icons'; export function ExportSeedPage() { const { accountSourceID } = useParams(); diff --git a/apps/wallet/src/ui/app/pages/accounts/ImportLedgerAccountsPage.tsx b/apps/wallet/src/ui/app/pages/accounts/ImportLedgerAccountsPage.tsx index 92b8dcdce92..84a992cbee6 100644 --- a/apps/wallet/src/ui/app/pages/accounts/ImportLedgerAccountsPage.tsx +++ b/apps/wallet/src/ui/app/pages/accounts/ImportLedgerAccountsPage.tsx @@ -14,9 +14,9 @@ import { Overlay, } from '_components'; import { getIotaApplicationErrorMessage } from '../../helpers/errorMessages'; -import { useAccounts } from '../../hooks/useAccounts'; +import { useAccounts } from '_hooks'; import { Button, LoadingIndicator } from '@iota/apps-ui-kit'; -import { CheckmarkFilled } from '@iota/ui-icons'; +import { CheckmarkFilled } from '@iota/apps-ui-icons'; const NUM_LEDGER_ACCOUNTS_TO_DERIVE_BY_DEFAULT = 10; diff --git a/apps/wallet/src/ui/app/pages/accounts/ImportPassphrasePage.tsx b/apps/wallet/src/ui/app/pages/accounts/ImportPassphrasePage.tsx index 6a3a60a2f6e..ffee5f84fe5 100644 --- a/apps/wallet/src/ui/app/pages/accounts/ImportPassphrasePage.tsx +++ b/apps/wallet/src/ui/app/pages/accounts/ImportPassphrasePage.tsx @@ -13,7 +13,7 @@ import { } from '_components'; import { Button, ButtonType } from '@iota/apps-ui-kit'; import { useState } from 'react'; -import { VisibilityOff, VisibilityOn } from '@iota/ui-icons'; +import { VisibilityOff, VisibilityOn } from '@iota/apps-ui-icons'; export function ImportPassphrasePage() { const navigate = useNavigate(); diff --git a/apps/wallet/src/ui/app/pages/accounts/ProtectAccountPage.tsx b/apps/wallet/src/ui/app/pages/accounts/ProtectAccountPage.tsx index 6cd3d880426..33d2cfa4099 100644 --- a/apps/wallet/src/ui/app/pages/accounts/ProtectAccountPage.tsx +++ b/apps/wallet/src/ui/app/pages/accounts/ProtectAccountPage.tsx @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { isMnemonicSerializedUiAccount } from '_src/background/accounts/MnemonicAccount'; +import { isMnemonicSerializedUiAccount } from '_src/background/accounts/mnemonicAccount'; import { useCallback, useEffect, useMemo, useState } from 'react'; import { toast } from 'react-hot-toast'; import { Navigate, useNavigate, useSearchParams } from 'react-router-dom'; @@ -14,13 +14,14 @@ import { PageTemplate, type ProtectAccountFormValues, } from '_components'; -import { useAccounts } from '../../hooks/useAccounts'; -import { autoLockDataToMinutes } from '../../hooks/useAutoLockMinutes'; -import { useAutoLockMinutesMutation } from '../../hooks/useAutoLockMinutesMutation'; -import { useCreateAccountsMutation } from '../../hooks/useCreateAccountMutation'; -import { isSeedSerializedUiAccount } from '_src/background/accounts/SeedAccount'; -import { isLedgerAccountSerializedUI } from '_src/background/accounts/LedgerAccount'; -import { AllowedAccountSourceTypes } from '../../accounts-finder'; +import { + useAccounts, + autoLockDataToMinutes, + useAutoLockMinutesMutation, + useCreateAccountsMutation, +} from '_hooks'; +import { isSeedSerializedUiAccount } from '_src/background/accounts/seedAccount'; +import { isLedgerAccountSerializedUI } from '_src/background/accounts/ledgerAccount'; import { useFeature } from '@growthbook/growthbook-react'; import { Feature } from '@iota/core'; @@ -92,7 +93,7 @@ export function ProtectAccountPage() { (isMnemonicSerializedUiAccount(createdAccounts[0]) || isSeedSerializedUiAccount(createdAccounts[0])) ) { - const path = `/accounts/manage/accounts-finder/${createdAccounts[0].sourceID}`; + const path = '/accounts/manage/accounts-finder/intro'; navigate(path, { replace: true, state: { @@ -103,7 +104,7 @@ export function ProtectAccountPage() { featureAccountFinderEnabled && isLedgerAccountSerializedUI(createdAccounts[0]) ) { - const path = `/accounts/manage/accounts-finder/${AllowedAccountSourceTypes.LedgerDerived}`; + const path = '/accounts/manage/accounts-finder/intro'; navigate(path, { replace: true, state: { diff --git a/apps/wallet/src/ui/app/pages/accounts/WelcomePage.tsx b/apps/wallet/src/ui/app/pages/accounts/WelcomePage.tsx index c9f6d36ddd7..eae3b5bde77 100644 --- a/apps/wallet/src/ui/app/pages/accounts/WelcomePage.tsx +++ b/apps/wallet/src/ui/app/pages/accounts/WelcomePage.tsx @@ -4,11 +4,9 @@ import { Loading } from '_components'; import { useNavigate } from 'react-router-dom'; -import { useFullscreenGuard, useInitializedGuard } from '_hooks'; +import { useFullscreenGuard, useInitializedGuard, useCreateAccountsMutation } from '_hooks'; import { Button, ButtonType } from '@iota/apps-ui-kit'; -import { IotaLogoWeb } from '@iota/ui-icons'; - -import { useCreateAccountsMutation } from '../../hooks/useCreateAccountMutation'; +import { IotaLogoWeb } from '@iota/apps-ui-icons'; export function WelcomePage() { const createAccountsMutation = useCreateAccountsMutation(); diff --git a/apps/wallet/src/ui/app/pages/accounts/forgot-password/ForgotPasswordIndexPage.tsx b/apps/wallet/src/ui/app/pages/accounts/forgot-password/ForgotPasswordIndexPage.tsx index 5c994dd90c3..b4fa19b98fe 100644 --- a/apps/wallet/src/ui/app/pages/accounts/forgot-password/ForgotPasswordIndexPage.tsx +++ b/apps/wallet/src/ui/app/pages/accounts/forgot-password/ForgotPasswordIndexPage.tsx @@ -4,9 +4,8 @@ import { useEffect } from 'react'; import { useNavigate } from 'react-router-dom'; - -import { useAccountSources } from '../../../hooks/useAccountSources'; -import { AccountSourceType } from '_src/background/account-sources/AccountSource'; +import { useAccountSources } from '_hooks'; +import { AccountSourceType } from '_src/background/account-sources/accountSource'; export function ForgotPasswordIndexPage() { const allAccountSources = useAccountSources(); diff --git a/apps/wallet/src/ui/app/pages/accounts/forgot-password/ForgotPasswordPage.tsx b/apps/wallet/src/ui/app/pages/accounts/forgot-password/ForgotPasswordPage.tsx index ebc1e4e60c1..a13e93f6448 100644 --- a/apps/wallet/src/ui/app/pages/accounts/forgot-password/ForgotPasswordPage.tsx +++ b/apps/wallet/src/ui/app/pages/accounts/forgot-password/ForgotPasswordPage.tsx @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { type PasswordRecoveryData } from '_src/shared/messaging/messages/payloads/MethodPayload'; +import { type PasswordRecoveryData } from '_src/shared/messaging/messages/payloads/methodPayload'; import { createContext, useCallback, useContext, useState } from 'react'; import { Outlet } from 'react-router-dom'; diff --git a/apps/wallet/src/ui/app/pages/accounts/forgot-password/RecoverManyPage.tsx b/apps/wallet/src/ui/app/pages/accounts/forgot-password/RecoverManyPage.tsx index 61ae8475f46..65d2e20c990 100644 --- a/apps/wallet/src/ui/app/pages/accounts/forgot-password/RecoverManyPage.tsx +++ b/apps/wallet/src/ui/app/pages/accounts/forgot-password/RecoverManyPage.tsx @@ -10,15 +10,13 @@ import { ImportSeedForm, PageTemplate, } from '_components'; -import { useRecoveryDataMutation } from '_src/ui/app/hooks/useRecoveryDataMutation'; +import { useRecoveryDataMutation, useAccountGroups, useAccountSources } from '_hooks'; import { useEffect, useState } from 'react'; import toast from 'react-hot-toast'; import { useNavigate } from 'react-router-dom'; -import { useAccountGroups } from '../../../hooks/useAccountGroups'; -import { useAccountSources } from '../../../hooks/useAccountSources'; import { useForgotPasswordContext } from './ForgotPasswordPage'; -import { AccountSourceType } from '_src/background/account-sources/AccountSource'; -import { AccountType } from '_src/background/accounts/Account'; +import { AccountSourceType } from '_src/background/account-sources/accountSource'; +import { AccountType } from '_src/background/accounts/account'; import { Button, ButtonType } from '@iota/apps-ui-kit'; export function RecoverManyPage() { diff --git a/apps/wallet/src/ui/app/pages/accounts/forgot-password/RecoverPage.tsx b/apps/wallet/src/ui/app/pages/accounts/forgot-password/RecoverPage.tsx index ae04304d2de..9b0d21bab8f 100644 --- a/apps/wallet/src/ui/app/pages/accounts/forgot-password/RecoverPage.tsx +++ b/apps/wallet/src/ui/app/pages/accounts/forgot-password/RecoverPage.tsx @@ -4,12 +4,11 @@ import { entropyToSerialized, mnemonicToEntropy } from '_src/shared/utils'; import { ImportRecoveryPhraseForm, ImportSeedForm } from '_components'; -import { useRecoveryDataMutation } from '_src/ui/app/hooks/useRecoveryDataMutation'; +import { useRecoveryDataMutation, useAccountSources } from '_hooks'; import { useEffect } from 'react'; import toast from 'react-hot-toast'; import { useNavigate } from 'react-router-dom'; -import { useAccountSources } from '../../../hooks/useAccountSources'; -import { AccountSourceType } from '_src/background/account-sources/AccountSource'; +import { AccountSourceType } from '_src/background/account-sources/accountSource'; import { PageTemplate } from '_src/ui/app/components/PageTemplate'; export function RecoverPage() { diff --git a/apps/wallet/src/ui/app/pages/accounts/forgot-password/ResetPasswordPage.tsx b/apps/wallet/src/ui/app/pages/accounts/forgot-password/ResetPasswordPage.tsx index ec3a0e5ec46..4ea1edcfa41 100644 --- a/apps/wallet/src/ui/app/pages/accounts/forgot-password/ResetPasswordPage.tsx +++ b/apps/wallet/src/ui/app/pages/accounts/forgot-password/ResetPasswordPage.tsx @@ -2,12 +2,14 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { useAutoLockMinutesMutation } from '_src/ui/app/hooks/useAutoLockMinutesMutation'; -import { useResetPasswordMutation } from '_src/ui/app/hooks/useResetPasswordMutation'; +import { + useAutoLockMinutesMutation, + useResetPasswordMutation, + autoLockDataToMinutes, +} from '_hooks'; import { toast } from 'react-hot-toast'; import { Navigate, useNavigate } from 'react-router-dom'; import { ProtectAccountForm, type ProtectAccountFormValues } from '_components'; -import { autoLockDataToMinutes } from '../../../hooks/useAutoLockMinutes'; import { useForgotPasswordContext } from './ForgotPasswordPage'; import { PageTemplate } from '_src/ui/app/components/PageTemplate'; diff --git a/apps/wallet/src/ui/app/pages/accounts/forgot-password/ResetWarningPage.tsx b/apps/wallet/src/ui/app/pages/accounts/forgot-password/ResetWarningPage.tsx index e8c1b2ba88a..face4ddbfe2 100644 --- a/apps/wallet/src/ui/app/pages/accounts/forgot-password/ResetWarningPage.tsx +++ b/apps/wallet/src/ui/app/pages/accounts/forgot-password/ResetWarningPage.tsx @@ -2,10 +2,9 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { useAccounts } from '_src/ui/app/hooks/useAccounts'; +import { useAccounts, useAccountGroups } from '_hooks'; import { Navigate, useNavigate } from 'react-router-dom'; import { PageTemplate, RecoverAccountsGroup } from '_components'; -import { useAccountGroups } from '../../../hooks/useAccountGroups'; import { getGroupTitle } from '../manage/AccountGroup'; import { useForgotPasswordContext } from './ForgotPasswordPage'; import { Button, ButtonHtmlType } from '@iota/apps-ui-kit'; diff --git a/apps/wallet/src/ui/app/pages/accounts/manage/AccountGroup.tsx b/apps/wallet/src/ui/app/pages/accounts/manage/AccountGroup.tsx index c1a63ae97cd..5d8e96bb7e1 100644 --- a/apps/wallet/src/ui/app/pages/accounts/manage/AccountGroup.tsx +++ b/apps/wallet/src/ui/app/pages/accounts/manage/AccountGroup.tsx @@ -2,21 +2,18 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { AccountType, type SerializedUIAccount } from '_src/background/accounts/Account'; +import { AccountType, type SerializedUIAccount } from '_src/background/accounts/account'; import { AccountsFormType, useAccountsFormContext, VerifyPasswordModal } from '_components'; -import { useAccountSources } from '_src/ui/app/hooks/useAccountSources'; -import { useCreateAccountsMutation } from '_src/ui/app/hooks/useCreateAccountMutation'; -import React, { useState } from 'react'; +import { useAccountSources, useCreateAccountsMutation, useActiveAccount } from '_hooks'; +import { useState } from 'react'; import { useNavigate } from 'react-router-dom'; import clsx from 'clsx'; - import { Button, ButtonSize, ButtonType, Dropdown, ListItem } from '@iota/apps-ui-kit'; -import { Add, MoreHoriz, TriangleDown } from '@iota/ui-icons'; +import { Add, MoreHoriz, TriangleDown } from '@iota/apps-ui-icons'; import { OutsideClickHandler } from '_components/OutsideClickHandler'; import { AccountGroupItem } from '_pages/accounts/manage/AccountGroupItem'; import { useFeature } from '@growthbook/growthbook-react'; import { Feature, Collapsible } from '@iota/core'; -import { useActiveAccount } from '_app/hooks/useActiveAccount'; const ACCOUNT_TYPE_TO_LABEL: Record<AccountType, string> = { [AccountType.MnemonicDerived]: 'Mnemonic', diff --git a/apps/wallet/src/ui/app/pages/accounts/manage/AccountGroupItem.tsx b/apps/wallet/src/ui/app/pages/accounts/manage/AccountGroupItem.tsx index 6762b389280..dce1c35d9a1 100644 --- a/apps/wallet/src/ui/app/pages/accounts/manage/AccountGroupItem.tsx +++ b/apps/wallet/src/ui/app/pages/accounts/manage/AccountGroupItem.tsx @@ -1,20 +1,18 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { AccountType, type SerializedUIAccount } from '_src/background/accounts/Account'; +import { AccountType, type SerializedUIAccount } from '_src/background/accounts/account'; import { useState, useRef } from 'react'; import clsx from 'clsx'; import { formatAddress } from '@iota/iota-sdk/utils'; import { ExplorerLinkType, NicknameDialog, useUnlockAccount } from '_components'; import { useNavigate } from 'react-router-dom'; -import { useAccounts } from '_app/hooks/useAccounts'; -import { useExplorerLink } from '_app/hooks/useExplorerLink'; +import { useAccounts, useExplorerLink, useBackgroundClient } from '_hooks'; import toast from 'react-hot-toast'; import { Account, BadgeType, Dropdown, ListItem } from '@iota/apps-ui-kit'; import { OutsideClickHandler } from '_components/OutsideClickHandler'; -import { IotaLogoMark, Ledger } from '@iota/ui-icons'; +import { IotaLogoMark, Ledger } from '@iota/apps-ui-icons'; import { RemoveDialog } from './RemoveDialog'; -import { useBackgroundClient } from '_app/hooks/useBackgroundClient'; import { isMainAccount } from '_src/background/accounts/isMainAccount'; import { Portal } from '_app/shared/Portal'; import { formatAccountName } from '_src/ui/app/helpers'; diff --git a/apps/wallet/src/ui/app/pages/accounts/manage/ManageAccountsPage.tsx b/apps/wallet/src/ui/app/pages/accounts/manage/ManageAccountsPage.tsx index 73859789962..65b8189b757 100644 --- a/apps/wallet/src/ui/app/pages/accounts/manage/ManageAccountsPage.tsx +++ b/apps/wallet/src/ui/app/pages/accounts/manage/ManageAccountsPage.tsx @@ -3,11 +3,9 @@ // SPDX-License-Identifier: Apache-2.0 import { useRef } from 'react'; import { Button, ButtonType } from '@iota/apps-ui-kit'; -import { type AccountType } from '_src/background/accounts/Account'; -import { useInitializedGuard } from '_src/ui/app/hooks'; -import { useAccountGroups } from '_src/ui/app/hooks/useAccountGroups'; +import { type AccountType } from '_src/background/accounts/account'; +import { useInitializedGuard, useAccountGroups } from '_hooks'; import { useNavigate } from 'react-router-dom'; - import { Overlay } from '_components'; import { AccountGroup } from './AccountGroup'; diff --git a/apps/wallet/src/ui/app/pages/accounts/manage/RemoveDialog.tsx b/apps/wallet/src/ui/app/pages/accounts/manage/RemoveDialog.tsx index 807ef298573..f058bbf8550 100644 --- a/apps/wallet/src/ui/app/pages/accounts/manage/RemoveDialog.tsx +++ b/apps/wallet/src/ui/app/pages/accounts/manage/RemoveDialog.tsx @@ -1,11 +1,21 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { useAccounts } from '_app/hooks/useAccounts'; -import { useBackgroundClient } from '_app/hooks/useBackgroundClient'; +import { useAccounts, useBackgroundClient } from '_hooks'; import { useMutation } from '@tanstack/react-query'; -import { Button, ButtonType, Dialog, DialogBody, DialogContent, Header } from '@iota/apps-ui-kit'; +import { + Button, + ButtonType, + Dialog, + DialogBody, + DialogContent, + Header, + InfoBox, + InfoBoxStyle, + InfoBoxType, +} from '@iota/apps-ui-kit'; import toast from 'react-hot-toast'; +import { Info } from '@iota/apps-ui-icons'; interface RemoveDialogProps { accountID: string; @@ -42,27 +52,32 @@ export function RemoveDialog({ isOpen, setOpen, accountID }: RemoveDialogProps) <DialogContent containerId="overlay-portal-container"> <Header title="Remove account" onClose={() => setOpen(false)} /> <DialogBody> - <div className="mb-md text-body-md"> - Are you sure you want to remove this account? - </div> - {totalAccounts === 1 ? ( - <div className="text-center"> - Removing this account will require you to set up your IOTA wallet again. + <div className="flex flex-col gap-y-md"> + <div className="text-body-md"> + Are you sure you want to remove this account? + </div> + {totalAccounts === 1 ? ( + <InfoBox + type={InfoBoxType.Default} + supportingText="Removing this account will require you to set up your IOTA wallet again." + icon={<Info />} + style={InfoBoxStyle.Elevated} + /> + ) : null} + <div className="flex gap-xs"> + <Button + fullWidth + type={ButtonType.Secondary} + text="Cancel" + onClick={handleCancel} + /> + <Button + fullWidth + type={ButtonType.Destructive} + text="Remove" + onClick={handleRemove} + /> </div> - ) : null} - <div className="flex gap-xs"> - <Button - fullWidth - type={ButtonType.Secondary} - text="Cancel" - onClick={handleCancel} - /> - <Button - fullWidth - type={ButtonType.Destructive} - text="Remove" - onClick={handleRemove} - /> </div> </DialogBody> </DialogContent> diff --git a/apps/wallet/src/ui/app/pages/accounts/manage/accounts-finder/AccountsFinderIntroPage.tsx b/apps/wallet/src/ui/app/pages/accounts/manage/accounts-finder/AccountsFinderIntroPage.tsx new file mode 100644 index 00000000000..e575d0e12f2 --- /dev/null +++ b/apps/wallet/src/ui/app/pages/accounts/manage/accounts-finder/AccountsFinderIntroPage.tsx @@ -0,0 +1,68 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +import { useNavigate } from 'react-router-dom'; +import { Overlay } from '_components'; +import { useActiveAccount } from '_hooks'; +import { getKey } from '_helpers'; +import { Theme, useTheme } from '@iota/core'; +import { Button, ButtonType } from '@iota/apps-ui-kit'; +import BalanceFinderIntroImage from '_assets/images/balance_finder_intro.svg'; +import BalanceFinderIntroDarkImage from '_assets/images/balance_finder_intro_darkmode.svg'; +import { isLedgerAccountSerializedUI } from '_src/background/accounts/ledgerAccount'; +import { AllowedAccountSourceTypes } from '_src/ui/app/accounts-finder'; + +export function AccountsFinderIntroPage() { + const { theme } = useTheme(); + const navigate = useNavigate(); + const activeAccount = useActiveAccount(); + + const isLedgerAccount = activeAccount && isLedgerAccountSerializedUI(activeAccount); + const accountSourceId = activeAccount && getKey(activeAccount); + + const ledgerPath = `/accounts/manage/accounts-finder/${AllowedAccountSourceTypes.LedgerDerived}`; + const accountPath = isLedgerAccount + ? ledgerPath + : `/accounts/manage/accounts-finder/${accountSourceId}`; + + return ( + <Overlay showModal> + <div className="flex h-full flex-col items-center justify-between"> + <div> + {theme === Theme.Dark ? ( + <BalanceFinderIntroDarkImage /> + ) : ( + <BalanceFinderIntroImage /> + )} + </div> + <div className="flex h-full flex-col items-center justify-between"> + <div className="flex flex-col gap-y-sm p-md text-center"> + <span className="text-label-lg text-neutral-40 dark:text-neutral-60"> + Wallet Setup + </span> + <span className="text-headline-md text-neutral-10 dark:text-neutral-92"> + Balance Finder + </span> + <span className="text-body-md text-neutral-40 dark:text-neutral-60"> + Easily find and import all your accounts with balances, in one place. + </span> + </div> + <div className="flex w-full flex-row gap-x-xs"> + <Button + type={ButtonType.Secondary} + text="Skip" + onClick={() => navigate('/')} + fullWidth + /> + <Button + type={ButtonType.Primary} + text="Start" + fullWidth + onClick={() => navigate(accountPath)} + /> + </div> + </div> + </div> + </Overlay> + ); +} diff --git a/apps/wallet/src/ui/app/pages/accounts/manage/accounts-finder/AccountsFinderPage.tsx b/apps/wallet/src/ui/app/pages/accounts/manage/accounts-finder/AccountsFinderPage.tsx index 337147753e6..b49e66ba0d9 100644 --- a/apps/wallet/src/ui/app/pages/accounts/manage/accounts-finder/AccountsFinderPage.tsx +++ b/apps/wallet/src/ui/app/pages/accounts/manage/accounts-finder/AccountsFinderPage.tsx @@ -1,7 +1,7 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { useInitializedGuard } from '_src/ui/app/hooks'; +import { useInitializedGuard } from '_hooks'; import { useNavigate } from 'react-router-dom'; import { Overlay } from '_components'; import { AccountsFinderView } from './AccountsFinderView'; diff --git a/apps/wallet/src/ui/app/pages/accounts/manage/accounts-finder/AccountsFinderView.tsx b/apps/wallet/src/ui/app/pages/accounts/manage/accounts-finder/AccountsFinderView.tsx index 97353451383..87a74dea45d 100644 --- a/apps/wallet/src/ui/app/pages/accounts/manage/accounts-finder/AccountsFinderView.tsx +++ b/apps/wallet/src/ui/app/pages/accounts/manage/accounts-finder/AccountsFinderView.tsx @@ -1,7 +1,7 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { Search } from '@iota/ui-icons'; +import { Search } from '@iota/apps-ui-icons'; import { Button, ButtonType, ButtonSize, LoadingIndicator } from '@iota/apps-ui-kit'; import { AccountBalanceItem, @@ -12,16 +12,12 @@ import { import { AccountSourceType, type AccountSourceSerializedUI, -} from '_src/background/account-sources/AccountSource'; -import { AccountType } from '_src/background/accounts/Account'; +} from '_src/background/account-sources/accountSource'; +import { AccountType } from '_src/background/accounts/account'; import { type SourceStrategyToFind } from '_src/shared/messaging/messages/payloads/accounts-finder'; import { AllowedAccountSourceTypes } from '_src/ui/app/accounts-finder'; -import { getKey } from '_src/ui/app/helpers/accounts'; -import { getLedgerConnectionErrorMessage } from '_src/ui/app/helpers/errorMessages'; -import { useAccountSources } from '_src/ui/app/hooks/useAccountSources'; -import { useAccounts } from '_src/ui/app/hooks/useAccounts'; -import { useAccountsFinder } from '_src/ui/app/hooks/useAccountsFinder'; -import { useUnlockMutation } from '_src/ui/app/hooks/useUnlockMutation'; +import { getKey, getLedgerConnectionErrorMessage } from '_src/ui/app/helpers'; +import { useAccountSources, useAccounts, useUnlockMutation, useAccountsFinder } from '_hooks'; import { useMemo, useState } from 'react'; import toast from 'react-hot-toast'; import { useParams } from 'react-router-dom'; diff --git a/apps/wallet/src/ui/app/pages/approval-request/SignMessageRequest.tsx b/apps/wallet/src/ui/app/pages/approval-request/SignMessageRequest.tsx index 7f708d31f9f..4ad17a04eb3 100644 --- a/apps/wallet/src/ui/app/pages/approval-request/SignMessageRequest.tsx +++ b/apps/wallet/src/ui/app/pages/approval-request/SignMessageRequest.tsx @@ -2,13 +2,11 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { type SignPersonalMessageApprovalRequest } from '_payloads/transactions/ApprovalRequest'; +import { type SignPersonalMessageApprovalRequest } from '_src/shared/messaging/messages/payloads/transactions/approvalRequest'; import { toUtf8OrB64 } from '_src/shared/utils'; import { useMemo } from 'react'; import { UserApproveContainer } from '_components'; -import { useAppDispatch } from '../../hooks'; -import { useAccountByAddress } from '../../hooks/useAccountByAddress'; -import { useSigner } from '../../hooks/useSigner'; +import { useAppDispatch, useAccountByAddress, useSigner } from '_hooks'; import { respondToTransactionRequest } from '../../redux/slices/transaction-requests'; import { PageMainLayoutTitle } from '../../shared/page-main-layout/PageMainLayoutTitle'; import { Panel } from '@iota/apps-ui-kit'; diff --git a/apps/wallet/src/ui/app/pages/approval-request/index.tsx b/apps/wallet/src/ui/app/pages/approval-request/index.tsx index 14c7dafa767..3faf86263a6 100644 --- a/apps/wallet/src/ui/app/pages/approval-request/index.tsx +++ b/apps/wallet/src/ui/app/pages/approval-request/index.tsx @@ -5,13 +5,12 @@ import { isSignPersonalMessageApprovalRequest, isTransactionApprovalRequest, -} from '_payloads/transactions/ApprovalRequest'; +} from '_src/shared/messaging/messages/payloads/transactions/approvalRequest'; import { useEffect, useMemo } from 'react'; import { useParams } from 'react-router-dom'; - import { Loading } from '_components'; -import { useAppSelector } from '../../hooks'; -import { type RootState } from '../../redux/RootReducer'; +import { useAppSelector } from '_hooks'; +import { type RootState } from '../../redux/rootReducer'; import { txRequestsSelectors } from '../../redux/slices/transaction-requests'; import { SignMessageRequest } from './SignMessageRequest'; import { TransactionRequest } from './transaction-request'; diff --git a/apps/wallet/src/ui/app/pages/approval-request/transaction-request/index.tsx b/apps/wallet/src/ui/app/pages/approval-request/transaction-request/index.tsx index e3cf45db226..1f1cb711369 100644 --- a/apps/wallet/src/ui/app/pages/approval-request/transaction-request/index.tsx +++ b/apps/wallet/src/ui/app/pages/approval-request/transaction-request/index.tsx @@ -3,20 +3,24 @@ // SPDX-License-Identifier: Apache-2.0 import { ExplorerLinkHelper, UserApproveContainer } from '_components'; -import { useActiveAddress, useAppDispatch, useTransactionData, useTransactionDryRun } from '_hooks'; -import { type TransactionApprovalRequest } from '_payloads/transactions/ApprovalRequest'; +import { + useActiveAddress, + useAppDispatch, + useTransactionData, + useTransactionDryRun, + useAccountByAddress, + useRecognizedPackages, + useSigner, +} from '_hooks'; +import { type TransactionApprovalRequest } from '_src/shared/messaging/messages/payloads/transactions/approvalRequest'; import { respondToTransactionRequest } from '_redux/slices/transaction-requests'; import { ampli } from '_src/shared/analytics/ampli'; -import { useAccountByAddress } from '_src/ui/app/hooks/useAccountByAddress'; -import { useRecognizedPackages } from '_src/ui/app/hooks/useRecognizedPackages'; -import { useSigner } from '_src/ui/app/hooks/useSigner'; import { PageMainLayoutTitle } from '_src/ui/app/shared/page-main-layout/PageMainLayoutTitle'; import { useTransactionSummary, TransactionSummary, GasFees } from '@iota/core'; import { Transaction } from '@iota/iota-sdk/transactions'; import { useMemo, useState } from 'react'; - import { ConfirmationModal } from '../../../shared/ConfirmationModal'; -import { TransactionDetails } from './TransactionDetails'; +import { TransactionDetails } from './transaction-details'; export interface TransactionRequestProps { txRequest: TransactionApprovalRequest; diff --git a/apps/wallet/src/ui/app/pages/approval-request/transaction-request/TransactionDetails/Command.tsx b/apps/wallet/src/ui/app/pages/approval-request/transaction-request/transaction-details/Command.tsx similarity index 100% rename from apps/wallet/src/ui/app/pages/approval-request/transaction-request/TransactionDetails/Command.tsx rename to apps/wallet/src/ui/app/pages/approval-request/transaction-request/transaction-details/Command.tsx diff --git a/apps/wallet/src/ui/app/pages/approval-request/transaction-request/TransactionDetails/Input.tsx b/apps/wallet/src/ui/app/pages/approval-request/transaction-request/transaction-details/Input.tsx similarity index 100% rename from apps/wallet/src/ui/app/pages/approval-request/transaction-request/TransactionDetails/Input.tsx rename to apps/wallet/src/ui/app/pages/approval-request/transaction-request/transaction-details/Input.tsx diff --git a/apps/wallet/src/ui/app/pages/approval-request/transaction-request/TransactionDetails/index.tsx b/apps/wallet/src/ui/app/pages/approval-request/transaction-request/transaction-details/index.tsx similarity index 98% rename from apps/wallet/src/ui/app/pages/approval-request/transaction-request/TransactionDetails/index.tsx rename to apps/wallet/src/ui/app/pages/approval-request/transaction-request/transaction-details/index.tsx index 518a0929061..9526de837d6 100644 --- a/apps/wallet/src/ui/app/pages/approval-request/transaction-request/TransactionDetails/index.tsx +++ b/apps/wallet/src/ui/app/pages/approval-request/transaction-request/transaction-details/index.tsx @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { useTransactionData } from '_src/ui/app/hooks'; +import { useTransactionData } from '_hooks'; import { type Transaction } from '@iota/iota-sdk/transactions'; import { Command } from './Command'; import { Input } from './Input'; @@ -21,7 +21,7 @@ import { } from '@iota/apps-ui-kit'; import { useEffect, useState } from 'react'; import { Loading } from '_src/ui/app/components'; -import { Warning } from '@iota/ui-icons'; +import { Warning } from '@iota/apps-ui-icons'; interface TransactionDetailsProps { sender?: string; diff --git a/apps/wallet/src/ui/app/pages/home/apps/index.tsx b/apps/wallet/src/ui/app/pages/home/apps/index.tsx index fb20b27115f..84d7a35a197 100644 --- a/apps/wallet/src/ui/app/pages/home/apps/index.tsx +++ b/apps/wallet/src/ui/app/pages/home/apps/index.tsx @@ -4,9 +4,9 @@ import { useFeature } from '@growthbook/growthbook-react'; import { FiltersPortal, ConnectedAppsCard, type DAppEntry } from '_components'; -import { getFromSessionStorage, setToSessionStorage } from '_src/background/storage-utils'; +import { getFromSessionStorage, setToSessionStorage } from '_src/background/storageUtils'; import { Feature } from '@iota/core'; -import { useUnlockedGuard } from '_src/ui/app/hooks/useUnlockedGuard'; +import { useUnlockedGuard } from '_hooks'; import { useEffect } from 'react'; import { Navigate, Route, Routes, useNavigate } from 'react-router-dom'; @@ -19,7 +19,7 @@ type FilterTag = { link: string; }; -function AppsPage() { +export function AppsPage() { const navigate = useNavigate(); const DEFAULT_FILTER_TAGS: FilterTag[] = [ @@ -83,5 +83,3 @@ function AppsPage() { </div> ); } - -export default AppsPage; diff --git a/apps/wallet/src/ui/app/pages/home/assets/HiddenAssetsProvider.tsx b/apps/wallet/src/ui/app/pages/home/assets/HiddenAssetsProvider.tsx deleted file mode 100644 index ff94f428a74..00000000000 --- a/apps/wallet/src/ui/app/pages/home/assets/HiddenAssetsProvider.tsx +++ /dev/null @@ -1,205 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// Modifications Copyright (c) 2024 IOTA Stiftung -// SPDX-License-Identifier: Apache-2.0 - -import { get, set } from 'idb-keyval'; -import { createContext, useCallback, useContext, useEffect, useState, type ReactNode } from 'react'; -import { type Toast, toast } from 'react-hot-toast'; -import { ButtonUnstyled } from '@iota/apps-ui-kit'; - -const HIDDEN_ASSET_IDS = 'hidden-asset-ids'; - -type HiddenAssets = - | { - type: 'loading'; - } - | { - type: 'loaded'; - assetIds: string[]; - }; - -interface HiddenAssetContext { - hiddenAssets: HiddenAssets; - setHiddenAssetIds: (hiddenAssetIds: string[]) => void; - hideAsset: (assetId: string) => void; - showAsset: (assetId: string) => void; -} - -export const HiddenAssetsContext = createContext<HiddenAssetContext>({ - hiddenAssets: { - type: 'loading', - }, - setHiddenAssetIds: () => {}, - hideAsset: () => {}, - showAsset: () => {}, -}); - -export const HiddenAssetsProvider = ({ children }: { children: ReactNode }) => { - const [hiddenAssets, setHiddenAssets] = useState<HiddenAssets>({ - type: 'loading', - }); - - const hiddenAssetIds = hiddenAssets.type === 'loaded' ? hiddenAssets.assetIds : []; - - useEffect(() => { - (async () => { - const hiddenAssets = (await get<string[]>(HIDDEN_ASSET_IDS)) ?? []; - setHiddenAssetIds(hiddenAssets); - })(); - }, []); - - function setHiddenAssetIds(hiddenAssetIds: string[]) { - setHiddenAssets({ - type: 'loaded', - assetIds: hiddenAssetIds, - }); - } - - const hideAssetId = useCallback( - async (newAssetId: string) => { - if (hiddenAssetIds.includes(newAssetId)) return; - - const newHiddenAssetIds = [...hiddenAssetIds, newAssetId]; - setHiddenAssetIds(newHiddenAssetIds); - await set(HIDDEN_ASSET_IDS, newHiddenAssetIds); - - const undoHideAsset = async (assetId: string) => { - try { - let updatedHiddenAssetIds; - setHiddenAssets((previous) => { - const previousIds = previous.type === 'loaded' ? previous.assetIds : []; - updatedHiddenAssetIds = previousIds.filter((id) => id !== assetId); - return { - type: 'loaded', - assetIds: updatedHiddenAssetIds, - }; - }); - await set(HIDDEN_ASSET_IDS, updatedHiddenAssetIds); - } catch (error) { - // Handle any error that occurred during the unhide process - toast.error('Failed to unhide asset.'); - // Restore the asset ID back to the hidden asset IDs list - setHiddenAssetIds([...hiddenAssetIds, assetId]); - await set(HIDDEN_ASSET_IDS, hiddenAssetIds); - } - }; - - const showAssetHiddenToast = async (objectId: string) => { - toast.success( - (t) => ( - <MovedAssetNotification - t={t} - destination="Hidden Assets" - onUndo={() => undoHideAsset(objectId)} - /> - ), - { - duration: 4000, - }, - ); - }; - showAssetHiddenToast(newAssetId); - }, - [hiddenAssetIds], - ); - - const showAssetId = useCallback( - async (newAssetId: string) => { - if (!hiddenAssetIds.includes(newAssetId)) return; - - try { - const updatedHiddenAssetIds = hiddenAssetIds.filter((id) => id !== newAssetId); - setHiddenAssetIds(updatedHiddenAssetIds); - await set(HIDDEN_ASSET_IDS, updatedHiddenAssetIds); - } catch (error) { - // Handle any error that occurred during the unhide process - toast.error('Failed to show asset.'); - // Restore the asset ID back to the hidden asset IDs list - setHiddenAssetIds([...hiddenAssetIds, newAssetId]); - await set(HIDDEN_ASSET_IDS, hiddenAssetIds); - } - - const undoShowAsset = async (assetId: string) => { - let newHiddenAssetIds; - setHiddenAssets((previous) => { - const previousIds = previous.type === 'loaded' ? previous.assetIds : []; - newHiddenAssetIds = [...previousIds, assetId]; - return { - type: 'loaded', - assetIds: newHiddenAssetIds, - }; - }); - await set(HIDDEN_ASSET_IDS, newHiddenAssetIds); - }; - - const assetShownToast = async (objectId: string) => { - toast.success( - (t) => ( - <MovedAssetNotification - t={t} - destination="Visual Assets" - onUndo={() => undoShowAsset(objectId)} - /> - ), - { - duration: 4000, - }, - ); - }; - - assetShownToast(newAssetId); - }, - [hiddenAssetIds], - ); - - const showAsset = (objectId: string) => { - showAssetId(objectId); - }; - - return ( - <HiddenAssetsContext.Provider - value={{ - hiddenAssets: - hiddenAssets.type === 'loaded' - ? { ...hiddenAssets, assetIds: Array.from(new Set(hiddenAssetIds)) } - : { type: 'loading' }, - setHiddenAssetIds, - hideAsset: hideAssetId, - showAsset, - }} - > - {children} - </HiddenAssetsContext.Provider> - ); -}; - -export const useHiddenAssets = () => { - return useContext(HiddenAssetsContext); -}; - -interface MovedAssetNotificationProps { - t: Toast; - destination: string; - onUndo: () => void; -} -function MovedAssetNotification({ t, destination, onUndo }: MovedAssetNotificationProps) { - return ( - <div - className="flex w-full flex-row items-baseline gap-x-xxs" - onClick={() => toast.dismiss(t.id)} - > - <ButtonUnstyled className="text-body-sm text-neutral-12 dark:text-neutral-92"> - Moved to {destination} - </ButtonUnstyled> - <ButtonUnstyled - onClick={() => { - onUndo(); - toast.dismiss(t.id); - }} - className="ml-auto mr-sm text-body-sm text-neutral-12 dark:text-neutral-92" - > - UNDO - </ButtonUnstyled> - </div> - ); -} diff --git a/apps/wallet/src/ui/app/pages/home/assets/index.tsx b/apps/wallet/src/ui/app/pages/home/assets/index.tsx index 9f224ecd1ec..b14a5de1b90 100644 --- a/apps/wallet/src/ui/app/pages/home/assets/index.tsx +++ b/apps/wallet/src/ui/app/pages/home/assets/index.tsx @@ -2,12 +2,12 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { useUnlockedGuard } from '_src/ui/app/hooks/useUnlockedGuard'; +import { useUnlockedGuard } from '_hooks'; import { Route, Routes } from 'react-router-dom'; import { NftsPage } from '..'; -import { HiddenAssetsProvider } from './HiddenAssetsProvider'; +import { HiddenAssetsProvider } from '@iota/core'; -function AssetsPage() { +export function AssetsPage() { if (useUnlockedGuard()) { return null; } @@ -19,5 +19,3 @@ function AssetsPage() { </HiddenAssetsProvider> ); } - -export default AssetsPage; diff --git a/apps/wallet/src/ui/app/pages/home/index.tsx b/apps/wallet/src/ui/app/pages/home/index.tsx index 4ce600b17c8..f43925680c8 100644 --- a/apps/wallet/src/ui/app/pages/home/index.tsx +++ b/apps/wallet/src/ui/app/pages/home/index.tsx @@ -11,7 +11,7 @@ interface HomePageProps { disableNavigation?: boolean; } -const HomePage = ({ disableNavigation }: HomePageProps) => { +export function HomePage({ disableNavigation }: HomePageProps) { const initChecking = useInitializedGuard(true); const guardChecking = initChecking; @@ -27,17 +27,16 @@ const HomePage = ({ disableNavigation }: HomePageProps) => { </PageMainLayout> </Loading> ); -}; +} -export default HomePage; -export { default as NftsPage } from './nfts'; -export { default as AssetsPage } from './assets'; -export { default as TokensPage } from './tokens'; -export { default as TransactionBlocksPage } from './transactions'; -export { default as TransferCoinPage } from './transfer-coin'; -export { default as NFTDetailsPage } from './nft-details'; -export { default as KioskDetailsPage } from './kiosk-details'; -export { default as NftTransferPage } from './nft-transfer'; -export { default as ReceiptPage } from './receipt'; -export { default as CoinsSelectorPage } from './transfer-coin/CoinSelector'; -export { default as AppsPage } from './apps'; +export * from './nfts'; +export * from './assets'; +export * from './tokens'; +export * from './transactions'; +export * from './transfer-coin'; +export * from './nft-details'; +export * from './kiosk-details'; +export * from './nft-transfer'; +export * from './receipt'; +export * from './transfer-coin/CoinSelector'; +export * from './apps'; diff --git a/apps/wallet/src/ui/app/pages/home/interstitial/index.tsx b/apps/wallet/src/ui/app/pages/home/interstitial/index.tsx index b435f4d650e..d4c23dd22bb 100644 --- a/apps/wallet/src/ui/app/pages/home/interstitial/index.tsx +++ b/apps/wallet/src/ui/app/pages/home/interstitial/index.tsx @@ -8,7 +8,7 @@ import { useEffect } from 'react'; import { useNavigate } from 'react-router-dom'; import { Portal } from '../../../shared/Portal'; -import { Close } from '@iota/ui-icons'; +import { Close } from '@iota/apps-ui-icons'; export type InterstitialConfig = { enabled: boolean; @@ -23,7 +23,13 @@ interface InterstitialProps extends InterstitialConfig { const setInterstitialDismissed = (dismissKey: string) => localStorage.setItem(dismissKey, 'true'); -function Interstitial({ enabled, dismissKey, imageUrl, bannerUrl, onClose }: InterstitialProps) { +export function Interstitial({ + enabled, + dismissKey, + imageUrl, + bannerUrl, + onClose, +}: InterstitialProps) { const navigate = useNavigate(); useEffect(() => { @@ -68,5 +74,3 @@ function Interstitial({ enabled, dismissKey, imageUrl, bannerUrl, onClose }: Int </Portal> ); } - -export default Interstitial; diff --git a/apps/wallet/src/ui/app/pages/home/kiosk-details/index.tsx b/apps/wallet/src/ui/app/pages/home/kiosk-details/index.tsx index 8d02c1ea8da..66df3b88a55 100644 --- a/apps/wallet/src/ui/app/pages/home/kiosk-details/index.tsx +++ b/apps/wallet/src/ui/app/pages/home/kiosk-details/index.tsx @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { useActiveAddress } from '_app/hooks/useActiveAddress'; +import { useActiveAddress, useUnlockedGuard } from '_hooks'; import { ErrorBoundary, ExplorerLink, @@ -11,14 +11,13 @@ import { NFTDisplayCard, PageTemplate, } from '_components'; -import { useUnlockedGuard } from '_src/ui/app/hooks/useUnlockedGuard'; import { useGetKioskContents, Collapsible } from '@iota/core'; import { formatAddress } from '@iota/iota-sdk/utils'; import { Link, useSearchParams, useNavigate } from 'react-router-dom'; import cl from 'clsx'; import { KeyValueInfo } from '@iota/apps-ui-kit'; -function KioskDetailsPage() { +export function KioskDetailsPage() { const navigate = useNavigate(); const [searchParams] = useSearchParams(); const kioskId = searchParams.get('kioskId'); @@ -92,5 +91,3 @@ function KioskDetailsPage() { </PageTemplate> ); } - -export default KioskDetailsPage; diff --git a/apps/wallet/src/ui/app/pages/home/nft-details/index.tsx b/apps/wallet/src/ui/app/pages/home/nft-details/index.tsx index 062577a10b1..9956867955c 100644 --- a/apps/wallet/src/ui/app/pages/home/nft-details/index.tsx +++ b/apps/wallet/src/ui/app/pages/home/nft-details/index.tsx @@ -2,16 +2,15 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { useActiveAddress } from '_app/hooks/useActiveAddress'; +import { useActiveAddress, useUnlockedGuard } from '_hooks'; import { ExplorerLink, ExplorerLinkType, Loading, NFTDisplayCard, PageTemplate } from '_components'; -import { useUnlockedGuard } from '_src/ui/app/hooks/useUnlockedGuard'; import { useNFTBasicData, useNftDetails, Collapsible } from '@iota/core'; import { formatAddress } from '@iota/iota-sdk/utils'; import cl from 'clsx'; -import { Link, Navigate, useNavigate, useSearchParams } from 'react-router-dom'; +import { Navigate, useNavigate, useSearchParams } from 'react-router-dom'; import { Button, ButtonType, KeyValueInfo } from '@iota/apps-ui-kit'; -function NFTDetailsPage() { +export function NFTDetailsPage() { const navigate = useNavigate(); const [searchParams] = useSearchParams(); const nftId = searchParams.get('objectId'); @@ -23,7 +22,6 @@ function NFTDetailsPage() { objectData, metaKeys, metaValues, - formatMetaValue, isContainedInKiosk, kioskItem, isAssetTransferable, @@ -34,12 +32,12 @@ function NFTDetailsPage() { const isPending = isLoading || isGuardLoading; function handleMoreAboutKiosk() { - window.open('https://docs.iota.org/references/ts-sdk/kiosk/', '_blank'); + window.open('https://docs.iota.org/ts-sdk/kiosk/', '_blank'); } function handleMarketplace() { // TODO: https://github.com/iotaledger/iota/issues/4024 - window.open('https://docs.iota.org/references/ts-sdk/kiosk/', '_blank'); + window.open('https://docs.iota.org/ts-sdk/kiosk/', '_blank'); } function handleSend() { @@ -94,11 +92,7 @@ function NFTDetailsPage() { {nftDisplayData?.projectUrl && ( <KeyValueInfo keyText="Website" - value={ - <Link to={nftDisplayData?.projectUrl}> - {nftDisplayData?.projectUrl} - </Link> - } + value={nftDisplayData?.projectUrl} fullwidth /> )} @@ -153,19 +147,17 @@ function NFTDetailsPage() { <Collapsible defaultOpen title="Attributes"> <div className="flex flex-col gap-xs px-md pb-xs pt-sm"> {metaKeys.map((aKey, idx) => { - const { value, valueLink } = - formatMetaValue(metaValues[idx]); return ( <KeyValueInfo key={idx} keyText={aKey} value={ - <Link - key={aKey} - to={valueLink || ''} - > - {value} - </Link> + typeof metaValues[idx] === + 'object' + ? JSON.stringify( + metaValues[idx], + ) + : metaValues[idx] } fullwidth /> @@ -211,5 +203,3 @@ function NFTDetailsPage() { </PageTemplate> ); } - -export default NFTDetailsPage; diff --git a/apps/wallet/src/ui/app/pages/home/nft-transfer/TransferNFTForm.tsx b/apps/wallet/src/ui/app/pages/home/nft-transfer/TransferNFTForm.tsx index 9e4801aa3cb..35d4181f6e8 100644 --- a/apps/wallet/src/ui/app/pages/home/nft-transfer/TransferNFTForm.tsx +++ b/apps/wallet/src/ui/app/pages/home/nft-transfer/TransferNFTForm.tsx @@ -4,25 +4,35 @@ import { ampli } from '_src/shared/analytics/ampli'; import { getSignerOperationErrorMessage } from '_src/ui/app/helpers/errorMessages'; -import { useActiveAddress } from '_src/ui/app/hooks'; -import { useActiveAccount } from '_src/ui/app/hooks/useActiveAccount'; -import { useSigner } from '_src/ui/app/hooks/useSigner'; -import { createNftSendValidationSchema, useGetKioskContents, AddressInput } from '@iota/core'; -import { Transaction } from '@iota/iota-sdk/transactions'; -import { useMutation, useQueryClient } from '@tanstack/react-query'; +import { useActiveAccount, useSigner, useActiveAddress } from '_hooks'; +import { + createNftSendValidationSchema, + AddressInput, + useTransferAsset, + type TransferAssetExecuteFn, +} from '@iota/core'; +import { useQueryClient } from '@tanstack/react-query'; import { Form, Formik } from 'formik'; import { toast } from 'react-hot-toast'; import { useNavigate } from 'react-router-dom'; - -import { useTransferKioskItem } from './useTransferKioskItem'; import { Button, ButtonHtmlType } from '@iota/apps-ui-kit'; -import { Loader } from '@iota/ui-icons'; +import { Loader } from '@iota/apps-ui-icons'; +import { type WalletSigner } from '_src/ui/app/walletSigner'; interface TransferNFTFormProps { objectId: string; objectType?: string | null; } +function normalizeWalletSignAndExecute( + signer: WalletSigner | null, +): TransferAssetExecuteFn | undefined { + if (!signer || !signer) return; + + const executeFn = signer.signAndExecuteTransaction.bind(signer); + return ({ transaction, ...rest }) => executeFn({ transactionBlock: transaction, ...rest }); +} + export function TransferNFTForm({ objectId, objectType }: TransferNFTFormProps) { const activeAddress = useActiveAddress(); const validationSchema = createNftSendValidationSchema(activeAddress || '', objectId); @@ -30,34 +40,12 @@ export function TransferNFTForm({ objectId, objectType }: TransferNFTFormProps) const signer = useSigner(activeAccount); const queryClient = useQueryClient(); const navigate = useNavigate(); - const { data: kiosk } = useGetKioskContents(activeAddress); - const transferKioskItem = useTransferKioskItem({ objectId, objectType }); - const isContainedInKiosk = kiosk?.list.some( - (kioskItem) => kioskItem.data?.objectId === objectId, - ); - const transferNFT = useMutation({ - mutationFn: async (to: string) => { - if (!to || !signer) { - throw new Error('Missing data'); - } - - if (isContainedInKiosk) { - return transferKioskItem.mutateAsync({ to }); - } - - const tx = new Transaction(); - tx.transferObjects([tx.object(objectId)], to); - - return signer.signAndExecuteTransaction({ - transactionBlock: tx, - options: { - showInput: true, - showEffects: true, - showEvents: true, - }, - }); - }, + const transferNFT = useTransferAsset({ + activeAddress, + objectId, + objectType, + executeFn: normalizeWalletSignAndExecute(signer), onSuccess: (response) => { queryClient.invalidateQueries({ queryKey: ['object', objectId] }); queryClient.invalidateQueries({ queryKey: ['get-kiosk-contents'] }); diff --git a/apps/wallet/src/ui/app/pages/home/nft-transfer/index.tsx b/apps/wallet/src/ui/app/pages/home/nft-transfer/index.tsx index 8d4c920ec38..8ee9730e53c 100644 --- a/apps/wallet/src/ui/app/pages/home/nft-transfer/index.tsx +++ b/apps/wallet/src/ui/app/pages/home/nft-transfer/index.tsx @@ -2,14 +2,13 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { useActiveAddress } from '_app/hooks/useActiveAddress'; +import { useActiveAddress, useUnlockedGuard } from '_hooks'; import { Loading, NFTDisplayCard, Overlay } from '_components'; -import { useUnlockedGuard } from '_src/ui/app/hooks/useUnlockedGuard'; import { Navigate, useNavigate, useParams } from 'react-router-dom'; import { TransferNFTForm } from './TransferNFTForm'; import { useOwnedNFT, useIsAssetTransferable } from '@iota/core'; -function NftTransferPage() { +export function NftTransferPage() { const { nftId } = useParams(); const address = useActiveAddress(); // verify that the nft is owned by the user and is transferable @@ -38,5 +37,3 @@ function NftTransferPage() { </Overlay> ); } - -export default NftTransferPage; diff --git a/apps/wallet/src/ui/app/pages/home/nfts/HiddenAsset.tsx b/apps/wallet/src/ui/app/pages/home/nfts/HiddenAsset.tsx index 92ac60bc862..6e0a8bd477f 100644 --- a/apps/wallet/src/ui/app/pages/home/nfts/HiddenAsset.tsx +++ b/apps/wallet/src/ui/app/pages/home/nfts/HiddenAsset.tsx @@ -2,17 +2,18 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { ErrorBoundary } from '_components'; +import { ErrorBoundary, MovedAssetNotification } from '_components'; import { ampli } from '_src/shared/analytics/ampli'; import { type IotaObjectData } from '@iota/iota-sdk/client'; import { useNavigate } from 'react-router-dom'; -import { useHiddenAssets } from '../assets/HiddenAssetsProvider'; +import { toast } from 'react-hot-toast'; import { getKioskIdFromOwnerCap, isKioskOwnerToken, useGetNFTDisplay, useGetObject, useKioskClient, + useHiddenAssets, } from '@iota/core'; import { Card, @@ -25,8 +26,8 @@ import { ImageType, } from '@iota/apps-ui-kit'; import { formatAddress } from '@iota/iota-sdk/utils'; -import { useResolveVideo } from '_src/ui/app/hooks/useResolveVideo'; -import { VisibilityOff } from '@iota/ui-icons'; +import { useResolveVideo } from '_hooks'; +import { VisibilityOff } from '@iota/apps-ui-icons'; export interface HiddenAssetProps { data: IotaObjectData | null | undefined; @@ -38,8 +39,8 @@ export interface HiddenAssetProps { | undefined; } -export default function HiddenAsset(item: HiddenAssetProps) { - const { showAsset } = useHiddenAssets(); +export function HiddenAsset(item: HiddenAssetProps) { + const { showAsset, hideAsset } = useHiddenAssets(); const kioskClient = useKioskClient(); const navigate = useNavigate(); const { objectId, type } = item.data!; @@ -65,6 +66,23 @@ export default function HiddenAsset(item: HiddenAssetProps) { collectibleType: type!, }); } + + function handleShowAsset() { + showAsset(objectId); + toast.success( + (t) => ( + <MovedAssetNotification + t={t} + destination="Visual Assets" + onUndo={() => hideAsset(objectId)} + /> + ), + { + duration: 4000, + }, + ); + } + return ( <ErrorBoundary> <Card type={CardType.Default} onClick={handleHiddenAssetClick}> @@ -88,9 +106,7 @@ export default function HiddenAsset(item: HiddenAssetProps) { <CardBody title={nftMeta?.name ?? 'Asset'} subtitle={formatAddress(objectId)} /> <CardAction type={CardActionType.Link} - onClick={() => { - showAsset(objectId); - }} + onClick={handleShowAsset} icon={<VisibilityOff />} /> </Card> diff --git a/apps/wallet/src/ui/app/pages/home/nfts/HiddenAssets.tsx b/apps/wallet/src/ui/app/pages/home/nfts/HiddenAssets.tsx index abab72eadb2..d01346c3c9a 100644 --- a/apps/wallet/src/ui/app/pages/home/nfts/HiddenAssets.tsx +++ b/apps/wallet/src/ui/app/pages/home/nfts/HiddenAssets.tsx @@ -2,13 +2,13 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import HiddenAsset, { type HiddenAssetProps } from './HiddenAsset'; +import { HiddenAsset, type HiddenAssetProps } from './HiddenAsset'; interface HiddenAssetsProps { items: HiddenAssetProps[]; } -export default function HiddenAssets({ items }: HiddenAssetsProps) { +export function HiddenAssets({ items }: HiddenAssetsProps) { return ( <div className="flex w-full flex-col overflow-y-auto"> {items?.map((object) => <HiddenAsset key={object.data!.objectId} {...object} />)} diff --git a/apps/wallet/src/ui/app/pages/home/nfts/NonVisualAssets.tsx b/apps/wallet/src/ui/app/pages/home/nfts/NonVisualAssets.tsx index 025f2000a98..b603f60e14e 100644 --- a/apps/wallet/src/ui/app/pages/home/nfts/NonVisualAssets.tsx +++ b/apps/wallet/src/ui/app/pages/home/nfts/NonVisualAssets.tsx @@ -6,13 +6,13 @@ import { ExplorerLink, ExplorerLinkType, NoData } from '_components'; import { type IotaObjectData } from '@iota/iota-sdk/client'; import { formatAddress, parseStructTag } from '@iota/iota-sdk/utils'; import { Card, CardAction, CardActionType, CardBody, CardType } from '@iota/apps-ui-kit'; -import { ArrowTopRight } from '@iota/ui-icons'; +import { ArrowTopRight } from '@iota/apps-ui-icons'; interface NonVisualAssetsProps { items: IotaObjectData[]; } -export default function NonVisualAssets({ items }: NonVisualAssetsProps) { +export function NonVisualAssets({ items }: NonVisualAssetsProps) { return ( <div className="flex w-full flex-1 flex-col items-center gap-4"> {items?.length ? ( diff --git a/apps/wallet/src/ui/app/pages/home/nfts/VisualAssets.tsx b/apps/wallet/src/ui/app/pages/home/nfts/VisualAssets.tsx index ce05c7e594a..9962ce5e60a 100644 --- a/apps/wallet/src/ui/app/pages/home/nfts/VisualAssets.tsx +++ b/apps/wallet/src/ui/app/pages/home/nfts/VisualAssets.tsx @@ -2,31 +2,52 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { ErrorBoundary, NFTDisplayCard } from '_components'; +import { ErrorBoundary, NFTDisplayCard, MovedAssetNotification } from '_components'; import { ampli } from '_src/shared/analytics/ampli'; import { type IotaObjectData } from '@iota/iota-sdk/client'; import { Link } from 'react-router-dom'; - -import { useHiddenAssets } from '../assets/HiddenAssetsProvider'; -import { getKioskIdFromOwnerCap, isKioskOwnerToken, useKioskClient } from '@iota/core'; -import { VisibilityOff } from '@iota/ui-icons'; +import { toast } from 'react-hot-toast'; +import { + useHiddenAssets, + getKioskIdFromOwnerCap, + isKioskOwnerToken, + useKioskClient, +} from '@iota/core'; +import { VisibilityOff } from '@iota/apps-ui-icons'; interface VisualAssetsProps { items: IotaObjectData[]; } -export default function VisualAssets({ items }: VisualAssetsProps) { - const { hideAsset } = useHiddenAssets(); +export function VisualAssets({ items }: VisualAssetsProps) { + const { hideAsset, showAsset } = useHiddenAssets(); const kioskClient = useKioskClient(); - function handleHideAsset(event: React.MouseEvent<HTMLButtonElement>, object: IotaObjectData) { + async function handleHideAsset( + event: React.MouseEvent<HTMLButtonElement>, + object: IotaObjectData, + ) { event.preventDefault(); event.stopPropagation(); ampli.clickedHideAsset({ objectId: object.objectId, collectibleType: object.type!, }); - hideAsset(object.objectId); + + await hideAsset(object.objectId); + + toast.success( + (t) => ( + <MovedAssetNotification + t={t} + destination="Hidden Assets" + onUndo={() => showAsset(object.objectId)} + /> + ), + { + duration: 4000, + }, + ); } return ( diff --git a/apps/wallet/src/ui/app/pages/home/nfts/index.tsx b/apps/wallet/src/ui/app/pages/home/nfts/index.tsx index 52c62bf96ae..4cd94599f64 100644 --- a/apps/wallet/src/ui/app/pages/home/nfts/index.tsx +++ b/apps/wallet/src/ui/app/pages/home/nfts/index.tsx @@ -11,21 +11,13 @@ import { SegmentedButton, SegmentedButtonType, } from '@iota/apps-ui-kit'; -import { useActiveAddress } from '_app/hooks/useActiveAddress'; +import { useActiveAddress } from '_hooks'; import { Loading, NoData, PageTemplate } from '_components'; -import { useGetNFTs } from '_src/ui/app/hooks/useGetNFTs'; -import { useEffect, useMemo, useRef, useState } from 'react'; -import HiddenAssets from './HiddenAssets'; -import NonVisualAssets from './NonVisualAssets'; -import VisualAssets from './VisualAssets'; -import { Warning } from '@iota/ui-icons'; -import { useOnScreen } from '@iota/core'; - -enum AssetCategory { - Visual = 'Visual', - Other = 'Other', - Hidden = 'Hidden', -} +import { HiddenAssets } from './HiddenAssets'; +import { NonVisualAssets } from './NonVisualAssets'; +import { VisualAssets } from './VisualAssets'; +import { Warning } from '@iota/apps-ui-icons'; +import { useHiddenAssets, usePageAssets, AssetCategory } from '@iota/core'; const ASSET_CATEGORIES = [ { @@ -42,98 +34,23 @@ const ASSET_CATEGORIES = [ }, ]; -function NftsPage() { - const [selectedAssetCategory, setSelectedAssetCategory] = useState<AssetCategory | null>(null); - const observerElem = useRef<HTMLDivElement | null>(null); - const { isIntersecting } = useOnScreen(observerElem); - +export function NftsPage() { const accountAddress = useActiveAddress(); + const { hiddenAssets } = useHiddenAssets(); + const { - data: ownedAssets, - hasNextPage, - isLoading, - isFetchingNextPage, - fetchNextPage, - error, isPending, + isAssetsLoaded, isError, - } = useGetNFTs(accountAddress); - - const isAssetsLoaded = !!ownedAssets; - - const isSpinnerVisible = isFetchingNextPage && hasNextPage; - - const filteredAssets = (() => { - if (!ownedAssets) return []; - switch (selectedAssetCategory) { - case AssetCategory.Visual: - return ownedAssets.visual; - case AssetCategory.Other: - return ownedAssets.other; - default: - return []; - } - })(); - - const filteredHiddenAssets = useMemo(() => { - return ( - ownedAssets?.hidden - .flatMap((data) => { - return { - data: data, - display: data?.display?.data, - }; - }) - .sort((nftA, nftB) => { - const nameA = nftA.display?.name || ''; - const nameB = nftB.display?.name || ''; - - if (nameA < nameB) { - return -1; - } else if (nameA > nameB) { - return 1; - } - return 0; - }) ?? [] - ); - }, [ownedAssets]); - - useEffect(() => { - if (isIntersecting && hasNextPage && !isFetchingNextPage) { - fetchNextPage(); - } - }, [isIntersecting, fetchNextPage, hasNextPage, isFetchingNextPage]); - - useEffect(() => { - let computeSelectedCategory = false; - if ( - (selectedAssetCategory === AssetCategory.Visual && ownedAssets?.visual.length === 0) || - (selectedAssetCategory === AssetCategory.Other && ownedAssets?.other.length === 0) || - (selectedAssetCategory === AssetCategory.Hidden && ownedAssets?.hidden.length === 0) || - !selectedAssetCategory - ) { - computeSelectedCategory = true; - } - if (computeSelectedCategory && ownedAssets) { - const defaultCategory = - ownedAssets.visual.length > 0 - ? AssetCategory.Visual - : ownedAssets.other.length > 0 - ? AssetCategory.Other - : ownedAssets.hidden.length > 0 - ? AssetCategory.Hidden - : null; - setSelectedAssetCategory(defaultCategory); - } - }, [ownedAssets]); - - if (isLoading) { - return ( - <div className="mt-1 flex w-full justify-center"> - <LoadingIndicator /> - </div> - ); - } + error, + ownedAssets, + filteredAssets, + filteredHiddenAssets, + selectedAssetCategory, + setSelectedAssetCategory, + isSpinnerVisible, + observerElem, + } = usePageAssets(accountAddress, hiddenAssets); return ( <PageTemplate title="Assets" isTitleCentered> @@ -196,5 +113,3 @@ function NftsPage() { </PageTemplate> ); } - -export default NftsPage; diff --git a/apps/wallet/src/ui/app/pages/home/receipt/index.tsx b/apps/wallet/src/ui/app/pages/home/receipt/index.tsx index 6afd778f2a9..0d01df4bf70 100644 --- a/apps/wallet/src/ui/app/pages/home/receipt/index.tsx +++ b/apps/wallet/src/ui/app/pages/home/receipt/index.tsx @@ -3,16 +3,15 @@ // SPDX-License-Identifier: Apache-2.0 import { Loading, Overlay, ReceiptCard } from '_components'; -import { useActiveAddress } from '_src/ui/app/hooks/useActiveAddress'; -import { useUnlockedGuard } from '_src/ui/app/hooks/useUnlockedGuard'; +import { useActiveAddress, useUnlockedGuard } from '_hooks'; import { useCallback, useMemo, useState } from 'react'; import { Navigate, useLocation, useNavigate, useSearchParams } from 'react-router-dom'; -import { Checkmark, Warning } from '@iota/ui-icons'; +import { Checkmark, Warning } from '@iota/apps-ui-icons'; import { InfoBox, InfoBoxType, InfoBoxStyle } from '@iota/apps-ui-kit'; import type { IotaTransactionBlockResponse } from '@iota/iota-sdk/client'; import { useGetTransaction } from '@iota/core'; -function ReceiptPage() { +export function ReceiptPage() { const location = useLocation(); const [searchParams] = useSearchParams(); const [showModal, setShowModal] = useState(true); @@ -64,7 +63,6 @@ function ReceiptPage() { title={pageTitle} closeOverlay={closeReceipt} closeIcon={<Checkmark fill="currentColor" className="text-iota-light h-8 w-8" />} - showBackButton > {isError ? ( <div className="mb-2 flex h-full w-full items-center justify-center p-2"> @@ -83,5 +81,3 @@ function ReceiptPage() { </Loading> ); } - -export default ReceiptPage; diff --git a/apps/wallet/src/ui/app/pages/home/tokens/MyTokens.tsx b/apps/wallet/src/ui/app/pages/home/tokens/MyTokens.tsx index 3477e205ff2..483bb0ecb99 100644 --- a/apps/wallet/src/ui/app/pages/home/tokens/MyTokens.tsx +++ b/apps/wallet/src/ui/app/pages/home/tokens/MyTokens.tsx @@ -3,10 +3,10 @@ import { SegmentedButton, SegmentedButtonType, ButtonSegment, Title } from '@iota/apps-ui-kit'; import { useSortedCoinsByCategories } from '@iota/core'; -import { RecognizedBadge } from '@iota/ui-icons'; +import { RecognizedBadge } from '@iota/apps-ui-icons'; import { ampli } from '_src/shared/analytics/ampli'; import { Loading } from '_src/ui/app/components'; -import { usePinnedCoinTypes } from '_src/ui/app/hooks/usePinnedCoinTypes'; +import { usePinnedCoinTypes } from '_hooks'; import { useState } from 'react'; import { PinButton } from './PinButton'; import { TokenLink } from './TokenLink'; diff --git a/apps/wallet/src/ui/app/pages/home/tokens/PinButton.tsx b/apps/wallet/src/ui/app/pages/home/tokens/PinButton.tsx index 86f81e4af95..fa7adc5d929 100644 --- a/apps/wallet/src/ui/app/pages/home/tokens/PinButton.tsx +++ b/apps/wallet/src/ui/app/pages/home/tokens/PinButton.tsx @@ -1,7 +1,7 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { Pined, Unpined } from '@iota/ui-icons'; +import { Pined, Unpined } from '@iota/apps-ui-icons'; interface PinButtonProps { isPinned?: boolean; diff --git a/apps/wallet/src/ui/app/pages/home/tokens/ReceiveTokensDialog.tsx b/apps/wallet/src/ui/app/pages/home/tokens/ReceiveTokensDialog.tsx index d790d723b1f..b4f10fd99f3 100644 --- a/apps/wallet/src/ui/app/pages/home/tokens/ReceiveTokensDialog.tsx +++ b/apps/wallet/src/ui/app/pages/home/tokens/ReceiveTokensDialog.tsx @@ -3,15 +3,14 @@ import { useCallback } from 'react'; import { Button, Address, Dialog, DialogContent, DialogBody, Header } from '@iota/apps-ui-kit'; -import { useCopyToClipboard } from '_hooks'; +import { useCopyToClipboard, useActiveAccount } from '_hooks'; import { QR } from '@iota/core'; import { toast } from 'react-hot-toast'; import { useIotaLedgerClient } from '_src/ui/app/components'; import { isLedgerAccountSerializedUI, type LedgerAccountSerializedUI, -} from '_src/background/accounts/LedgerAccount'; -import { useActiveAccount } from '_src/ui/app/hooks/useActiveAccount'; +} from '_src/background/accounts/ledgerAccount'; interface ReceiveTokensDialogProps { address: string; diff --git a/apps/wallet/src/ui/app/pages/home/tokens/TokenDetailsPage.tsx b/apps/wallet/src/ui/app/pages/home/tokens/TokenDetailsPage.tsx index 66083ed5272..cbf8ff70e02 100644 --- a/apps/wallet/src/ui/app/pages/home/tokens/TokenDetailsPage.tsx +++ b/apps/wallet/src/ui/app/pages/home/tokens/TokenDetailsPage.tsx @@ -2,10 +2,8 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import TokenDetails from './TokensDetails'; +import { TokenDetails } from './TokensDetails'; -function TokenDetailsPage() { +export function TokenDetailsPage() { return <TokenDetails />; } - -export default TokenDetailsPage; diff --git a/apps/wallet/src/ui/app/pages/home/tokens/TokenStakingOverview.tsx b/apps/wallet/src/ui/app/pages/home/tokens/TokenStakingOverview.tsx index 1c164c4a9d6..882c3818736 100644 --- a/apps/wallet/src/ui/app/pages/home/tokens/TokenStakingOverview.tsx +++ b/apps/wallet/src/ui/app/pages/home/tokens/TokenStakingOverview.tsx @@ -22,7 +22,7 @@ import { ImageShape, } from '@iota/apps-ui-kit'; import { useNavigate } from 'react-router-dom'; -import { Stake } from '@iota/ui-icons'; +import { Stake } from '@iota/apps-ui-icons'; export function TokenStakingOverview({ accountAddress, 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 064184e9f31..0b16d15cf1f 100644 --- a/apps/wallet/src/ui/app/pages/home/tokens/TokensDetails.tsx +++ b/apps/wallet/src/ui/app/pages/home/tokens/TokensDetails.tsx @@ -3,9 +3,13 @@ // SPDX-License-Identifier: Apache-2.0 import { ExplorerLinkType, Loading, UnlockAccountButton } from '_components'; -import { useAppSelector, useCoinsReFetchingConfig } from '_hooks'; -import { useActiveAccount } from '_src/ui/app/hooks/useActiveAccount'; -import FaucetRequestButton from '_src/ui/app/shared/faucet/FaucetRequestButton'; +import { + useActiveAccount, + useAppSelector, + useCoinsReFetchingConfig, + useExplorerLink, +} from '_hooks'; +import { FaucetRequestButton } from '_src/ui/app/shared/faucet/FaucetRequestButton'; import { useFeature } from '@growthbook/growthbook-react'; import { toast } from 'react-hot-toast'; import { @@ -31,12 +35,11 @@ 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 } from '@iota/ui-icons'; -import Interstitial, { type InterstitialConfig } from '../interstitial'; +import { ArrowBottomLeft, Info, Send } from '@iota/apps-ui-icons'; +import { Interstitial, type InterstitialConfig } from '../interstitial'; import { CoinBalance } from './coin-balance'; import { TokenStakingOverview } from './TokenStakingOverview'; import { useNavigate } from 'react-router-dom'; -import { useExplorerLink } from '_app/hooks/useExplorerLink'; import { MyTokens } from './MyTokens'; import { ReceiveTokensDialog } from './ReceiveTokensDialog'; @@ -44,7 +47,7 @@ interface TokenDetailsProps { coinType?: string; } -function TokenDetails({ coinType }: TokenDetailsProps) { +export function TokenDetails({ coinType }: TokenDetailsProps) { const [dialogReceiveOpen, setDialogReceiveOpen] = useState(false); const navigate = useNavigate(); const [interstitialDismissed, setInterstitialDismissed] = useState<boolean>(false); @@ -234,5 +237,3 @@ function TokenDetails({ coinType }: TokenDetailsProps) { </> ); } - -export default TokenDetails; diff --git a/apps/wallet/src/ui/app/pages/home/tokens/TokensStackIcon.tsx b/apps/wallet/src/ui/app/pages/home/tokens/TokensStackIcon.tsx index 836b8fd3cbe..e140d51c64c 100644 --- a/apps/wallet/src/ui/app/pages/home/tokens/TokensStackIcon.tsx +++ b/apps/wallet/src/ui/app/pages/home/tokens/TokensStackIcon.tsx @@ -37,4 +37,3 @@ export const SvgIotaTokensStack = (props: SVGProps<SVGSVGElement>) => ( </defs> </svg> ); -export default SvgIotaTokensStack; diff --git a/apps/wallet/src/ui/app/pages/home/tokens/coin-balance/index.tsx b/apps/wallet/src/ui/app/pages/home/tokens/coin-balance/index.tsx index 75aecdf86ca..7660cf9bcd7 100644 --- a/apps/wallet/src/ui/app/pages/home/tokens/coin-balance/index.tsx +++ b/apps/wallet/src/ui/app/pages/home/tokens/coin-balance/index.tsx @@ -2,10 +2,12 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 import { useAppSelector } from '_hooks'; -import { useBalanceInUSD, useFormatCoin } from '@iota/core'; +import { CoinFormat, formatBalance, useBalanceInUSD, useFormatCoin } from '@iota/core'; import { Network } from '@iota/iota-sdk/client'; import { IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; import { useMemo } from 'react'; +import { Tooltip, TooltipPosition } from '@iota/apps-ui-kit'; +import BigNumber from 'bignumber.js'; export interface CoinProps { type: string; @@ -37,17 +39,39 @@ function WalletBalanceUsd({ amount: walletBalance }: WalletBalanceUsdProps) { export function CoinBalance({ amount: walletBalance, type }: CoinProps) { const network = useAppSelector((state) => state.app.network); - const [formatted, symbol] = useFormatCoin(walletBalance, type); + const [formatted, symbol, { data: coinMetadata }] = useFormatCoin(walletBalance, type); + + const iotaDecimals = coinMetadata?.decimals ?? 9; + const bnBalance = new BigNumber(walletBalance.toString()).shiftedBy(-1 * iotaDecimals); + const shouldShowTooltip = bnBalance.gt(0) && bnBalance.lt(1); return ( <> <div className="flex items-baseline gap-0.5"> - <div - className="text-headline-lg text-neutral-10 dark:text-neutral-92" - data-testid="coin-balance" - > - {formatted} - </div> + {shouldShowTooltip ? ( + <Tooltip + text={formatBalance( + walletBalance, + coinMetadata?.decimals ?? 9, + CoinFormat.FULL, + )} + position={TooltipPosition.Bottom} + > + <div + className="text-headline-lg text-neutral-10 dark:text-neutral-92" + data-testid="coin-balance" + > + {formatted} + </div> + </Tooltip> + ) : ( + <div + className="text-headline-lg text-neutral-10 dark:text-neutral-92" + data-testid="coin-balance" + > + {formatted} + </div> + )} <div className="text-label-md text-neutral-40">{symbol}</div> </div> {network === Network.Mainnet ? <WalletBalanceUsd amount={walletBalance} /> : null} diff --git a/apps/wallet/src/ui/app/pages/home/tokens/icon-link/index.tsx b/apps/wallet/src/ui/app/pages/home/tokens/icon-link/index.tsx index 2b3d21fca68..e2ea9b847e6 100644 --- a/apps/wallet/src/ui/app/pages/home/tokens/icon-link/index.tsx +++ b/apps/wallet/src/ui/app/pages/home/tokens/icon-link/index.tsx @@ -15,7 +15,7 @@ export interface IconLinkProps { text: string; } -function IconLink({ to, icon, disabled = false, text }: IconLinkProps) { +function IconLinkComponent({ to, icon, disabled = false, text }: IconLinkProps) { return ( <Link to={to} @@ -35,4 +35,4 @@ function IconLink({ to, icon, disabled = false, text }: IconLinkProps) { ); } -export default memo(IconLink); +export const IconLink = memo(IconLinkComponent); diff --git a/apps/wallet/src/ui/app/pages/home/tokens/index.tsx b/apps/wallet/src/ui/app/pages/home/tokens/index.tsx index 98dd57694ab..f7dd11c7d51 100644 --- a/apps/wallet/src/ui/app/pages/home/tokens/index.tsx +++ b/apps/wallet/src/ui/app/pages/home/tokens/index.tsx @@ -3,11 +3,10 @@ // SPDX-License-Identifier: Apache-2.0 import { Route, Routes } from 'react-router-dom'; +import { TokenDetailsPage } from './TokenDetailsPage'; +import { TokenDetails } from './TokensDetails'; -import TokenDetailsPage from './TokenDetailsPage'; -import TokenDetails from './TokensDetails'; - -function TokensPage() { +export function TokensPage() { return ( <Routes> <Route path="/" element={<TokenDetails />} /> @@ -15,5 +14,3 @@ function TokensPage() { </Routes> ); } - -export default TokensPage; diff --git a/apps/wallet/src/ui/app/pages/home/transactions/CompletedTransactions.tsx b/apps/wallet/src/ui/app/pages/home/transactions/CompletedTransactions.tsx index 562144c0886..37c0ad440f3 100644 --- a/apps/wallet/src/ui/app/pages/home/transactions/CompletedTransactions.tsx +++ b/apps/wallet/src/ui/app/pages/home/transactions/CompletedTransactions.tsx @@ -4,9 +4,9 @@ import { ErrorBoundary, Loading, TransactionCard, NoData } from '_components'; import { useQueryTransactionsByAddress } from '@iota/core'; -import { useActiveAddress } from '_src/ui/app/hooks/useActiveAddress'; +import { useActiveAddress } from '_hooks'; import { InfoBox, InfoBoxStyle, InfoBoxType } from '@iota/apps-ui-kit'; -import { Warning } from '@iota/ui-icons'; +import { Warning } from '@iota/apps-ui-icons'; export function CompletedTransactions() { const activeAddress = useActiveAddress(); diff --git a/apps/wallet/src/ui/app/pages/home/transactions/index.tsx b/apps/wallet/src/ui/app/pages/home/transactions/index.tsx index 409d1db7824..3dcbd1deab1 100644 --- a/apps/wallet/src/ui/app/pages/home/transactions/index.tsx +++ b/apps/wallet/src/ui/app/pages/home/transactions/index.tsx @@ -2,13 +2,12 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { useActiveAccount } from '_src/ui/app/hooks/useActiveAccount'; -import { useUnlockedGuard } from '_src/ui/app/hooks/useUnlockedGuard'; +import { useActiveAccount, useUnlockedGuard } from '_hooks'; import { Navigate, useParams } from 'react-router-dom'; import { CompletedTransactions } from './CompletedTransactions'; import { PageTemplate } from '_src/ui/app/components'; -function TransactionBlocksPage() { +export function TransactionBlocksPage() { const activeAccount = useActiveAccount(); const { status } = useParams(); const isPendingTransactions = status === 'pending'; @@ -26,5 +25,3 @@ function TransactionBlocksPage() { </PageTemplate> ); } - -export default TransactionBlocksPage; diff --git a/apps/wallet/src/ui/app/pages/home/transfer-coin/CoinSelector.tsx b/apps/wallet/src/ui/app/pages/home/transfer-coin/CoinSelector.tsx index d94b31d6634..50fbb66dee6 100644 --- a/apps/wallet/src/ui/app/pages/home/transfer-coin/CoinSelector.tsx +++ b/apps/wallet/src/ui/app/pages/home/transfer-coin/CoinSelector.tsx @@ -3,11 +3,11 @@ // SPDX-License-Identifier: Apache-2.0 import { ActiveCoinsCard, Overlay } from '_components'; -import { useUnlockedGuard } from '_src/ui/app/hooks/useUnlockedGuard'; +import { useUnlockedGuard } from '_hooks'; import { IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; import { useNavigate, useSearchParams } from 'react-router-dom'; -function CoinsSelectorPage() { +export function CoinsSelectorPage() { const [searchParams] = useSearchParams(); const coinType = searchParams.get('type') || IOTA_TYPE_ARG; const navigate = useNavigate(); @@ -32,5 +32,3 @@ function CoinsSelectorPage() { </Overlay> ); } - -export default CoinsSelectorPage; diff --git a/apps/wallet/src/ui/app/pages/home/transfer-coin/PreviewTransfer.tsx b/apps/wallet/src/ui/app/pages/home/transfer-coin/PreviewTransfer.tsx index faed355c243..8589527279f 100644 --- a/apps/wallet/src/ui/app/pages/home/transfer-coin/PreviewTransfer.tsx +++ b/apps/wallet/src/ui/app/pages/home/transfer-coin/PreviewTransfer.tsx @@ -3,7 +3,7 @@ // SPDX-License-Identifier: Apache-2.0 import { ExplorerLink, ExplorerLinkType, TxnAmount } from '_components'; -import { useActiveAddress } from '_src/ui/app/hooks/useActiveAddress'; +import { useActiveAddress } from '_hooks'; import { parseAmount, useCoinMetadata, useFormatCoin } from '@iota/core'; import { Divider, KeyValueInfo } from '@iota/apps-ui-kit'; import { formatAddress, IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; diff --git a/apps/wallet/src/ui/app/pages/home/transfer-coin/SendTokenForm.tsx b/apps/wallet/src/ui/app/pages/home/transfer-coin/SendTokenForm.tsx index e1cf2696b6f..a18a8732edd 100644 --- a/apps/wallet/src/ui/app/pages/home/transfer-coin/SendTokenForm.tsx +++ b/apps/wallet/src/ui/app/pages/home/transfer-coin/SendTokenForm.tsx @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { useActiveAddress } from '_app/hooks/useActiveAddress'; +import { useActiveAddress } from '_hooks'; import { Loading } from '_components'; import { useGetAllCoins, @@ -27,7 +27,7 @@ import { ButtonType, ButtonHtmlType, } from '@iota/apps-ui-kit'; -import { Exclamation } from '@iota/ui-icons'; +import { Exclamation } from '@iota/apps-ui-icons'; const INITIAL_VALUES = { to: '', diff --git a/apps/wallet/src/ui/app/pages/home/transfer-coin/index.tsx b/apps/wallet/src/ui/app/pages/home/transfer-coin/index.tsx index f4e3a2555c1..26ed1e1299d 100644 --- a/apps/wallet/src/ui/app/pages/home/transfer-coin/index.tsx +++ b/apps/wallet/src/ui/app/pages/home/transfer-coin/index.tsx @@ -5,9 +5,7 @@ import { Overlay } from '_components'; import { ampli } from '_src/shared/analytics/ampli'; import { getSignerOperationErrorMessage } from '_src/ui/app/helpers/errorMessages'; -import { useActiveAccount } from '_src/ui/app/hooks/useActiveAccount'; -import { useSigner } from '_src/ui/app/hooks/useSigner'; -import { useUnlockedGuard } from '_src/ui/app/hooks/useUnlockedGuard'; +import { useSigner, useActiveAccount, useUnlockedGuard } from '_hooks'; import { COINS_QUERY_REFETCH_INTERVAL, COINS_QUERY_STALE_TIME, @@ -25,11 +23,11 @@ import { Navigate, useNavigate, useSearchParams } from 'react-router-dom'; import { PreviewTransfer } from './PreviewTransfer'; import { SendTokenForm, type SubmitProps } from './SendTokenForm'; import { Button, ButtonType, LoadingIndicator } from '@iota/apps-ui-kit'; -import { Loader } from '@iota/ui-icons'; +import { Loader } from '@iota/apps-ui-icons'; import { useIotaClientQuery } from '@iota/dapp-kit'; import { IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; -function TransferCoinPage() { +export function TransferCoinPage() { const [searchParams] = useSearchParams(); const selectedCoinType = searchParams.get('type'); const [showTransactionPreview, setShowTransactionPreview] = useState<boolean>(false); @@ -89,22 +87,25 @@ function TransferCoinPage() { if (!transaction || !signer) { throw new Error('Missing data'); } - const sentryTransaction = Sentry.startTransaction({ - name: 'send-tokens', - }); - - try { - return signer.signAndExecuteTransaction({ - transactionBlock: transaction, - options: { - showInput: true, - showEffects: true, - showEvents: true, - }, - }); - } finally { - sentryTransaction.finish(); - } + return Sentry.startSpan( + { + name: 'send-tokens', + }, + (span) => { + try { + return signer.signAndExecuteTransaction({ + transactionBlock: transaction, + options: { + showInput: true, + showEffects: true, + showEvents: true, + }, + }); + } finally { + span?.end(); + } + }, + ); }, onSuccess: (response) => { queryClient.invalidateQueries({ queryKey: ['get-coins'] }); @@ -206,5 +207,3 @@ function TransferCoinPage() { </Overlay> ); } - -export default TransferCoinPage; diff --git a/apps/wallet/src/ui/app/pages/restricted/index.tsx b/apps/wallet/src/ui/app/pages/restricted/index.tsx index 8571e51a6c5..0d43c36ff98 100644 --- a/apps/wallet/src/ui/app/pages/restricted/index.tsx +++ b/apps/wallet/src/ui/app/pages/restricted/index.tsx @@ -2,9 +2,9 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { IotaLogoWeb } from '@iota/ui-icons'; +import { IotaLogoWeb } from '@iota/apps-ui-icons'; import { PageMainLayout } from '_src/ui/app/shared/page-main-layout/PageMainLayout'; -import { useInitializedGuard } from '../../hooks'; +import { useInitializedGuard } from '_hooks'; export function RestrictedPage() { useInitializedGuard(true); diff --git a/apps/wallet/src/ui/app/pages/site-connect/index.tsx b/apps/wallet/src/ui/app/pages/site-connect/index.tsx index 74238e2ab93..356a02bceac 100644 --- a/apps/wallet/src/ui/app/pages/site-connect/index.tsx +++ b/apps/wallet/src/ui/app/pages/site-connect/index.tsx @@ -9,20 +9,18 @@ import { SectionHeader, UserApproveContainer, } from '_components'; -import { useAppDispatch, useAppSelector } from '_hooks'; -import type { RootState } from '_redux/RootReducer'; +import { useAppDispatch, useAppSelector, useAccountGroups, useActiveAccount } from '_hooks'; +import type { RootState } from '_src/ui/app/redux/rootReducer'; import { permissionsSelectors, respondToPermissionRequest } from '_redux/slices/permissions'; -import { type SerializedUIAccount } from '_src/background/accounts/Account'; +import { type SerializedUIAccount } from '_src/background/accounts/account'; import { ampli } from '_src/shared/analytics/ampli'; import { useCallback, useEffect, useMemo, useState } from 'react'; import { useParams } from 'react-router-dom'; -import { useAccountGroups } from '../../hooks/useAccountGroups'; -import { useActiveAccount } from '../../hooks/useActiveAccount'; import { PageMainLayoutTitle } from '../../shared/page-main-layout/PageMainLayoutTitle'; import { InfoBox, InfoBoxStyle, InfoBoxType } from '@iota/apps-ui-kit'; -import { Warning, Info } from '@iota/ui-icons'; +import { Warning, Info } from '@iota/apps-ui-icons'; -function SiteConnectPage() { +export function SiteConnectPage() { const { requestID } = useParams(); const permissionsInitialized = useAppSelector(({ permissions }) => permissions.initialized); const loading = !permissionsInitialized; @@ -177,5 +175,3 @@ function SiteConnectPage() { </Loading> ); } - -export default SiteConnectPage; diff --git a/apps/wallet/src/ui/app/redux/RootReducer.ts b/apps/wallet/src/ui/app/redux/rootReducer.ts similarity index 100% rename from apps/wallet/src/ui/app/redux/RootReducer.ts rename to apps/wallet/src/ui/app/redux/rootReducer.ts diff --git a/apps/wallet/src/ui/app/redux/slices/app/AppType.ts b/apps/wallet/src/ui/app/redux/slices/app/appType.ts similarity index 100% rename from apps/wallet/src/ui/app/redux/slices/app/AppType.ts rename to apps/wallet/src/ui/app/redux/slices/app/appType.ts diff --git a/apps/wallet/src/ui/app/redux/slices/app/index.ts b/apps/wallet/src/ui/app/redux/slices/app/index.ts index 35600347357..0a6189c6ada 100644 --- a/apps/wallet/src/ui/app/redux/slices/app/index.ts +++ b/apps/wallet/src/ui/app/redux/slices/app/index.ts @@ -2,15 +2,15 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { walletApiProvider } from '_app/ApiProvider'; -import type { RootState } from '_redux/RootReducer'; +import { walletApiProvider } from '_src/ui/app/apiProvider'; +import type { RootState } from '_src/ui/app/redux/rootReducer'; import type { NetworkEnvType } from '@iota/core'; -import type { AppThunkConfig } from '_store/thunk-extras'; +import type { AppThunkConfig } from '_src/ui/app/redux/store/thunkExtras'; import { getDefaultNetwork, type Network } from '@iota/iota-sdk/client'; import { createAsyncThunk, createSlice } from '@reduxjs/toolkit'; import type { PayloadAction } from '@reduxjs/toolkit'; -import { AppType } from './AppType'; +import { AppType } from './appType'; type AppState = { appType: AppType; diff --git a/apps/wallet/src/ui/app/redux/slices/iota-objects/Coin.ts b/apps/wallet/src/ui/app/redux/slices/iota-objects/coin.ts similarity index 96% rename from apps/wallet/src/ui/app/redux/slices/iota-objects/Coin.ts rename to apps/wallet/src/ui/app/redux/slices/iota-objects/coin.ts index d624c690069..267b4f573ee 100644 --- a/apps/wallet/src/ui/app/redux/slices/iota-objects/Coin.ts +++ b/apps/wallet/src/ui/app/redux/slices/iota-objects/coin.ts @@ -4,7 +4,7 @@ import type { IotaMoveObject, IotaObjectData } from '@iota/iota-sdk/client'; -const COIN_TYPE = '0x2::coin::Coin'; +export const COIN_TYPE = '0x2::coin::Coin'; const COIN_TYPE_ARG_REGEX = /^0x2::coin::Coin<(.+)>$/; export const IOTA_BIP44_COIN_TYPE = 4218; diff --git a/apps/wallet/src/ui/app/redux/slices/permissions/index.ts b/apps/wallet/src/ui/app/redux/slices/permissions/index.ts index 4912cd8720b..349d54bd8bf 100644 --- a/apps/wallet/src/ui/app/redux/slices/permissions/index.ts +++ b/apps/wallet/src/ui/app/redux/slices/permissions/index.ts @@ -3,8 +3,8 @@ // SPDX-License-Identifier: Apache-2.0 import type { Permission } from '_messages/payloads/permissions'; -import type { RootState } from '_redux/RootReducer'; -import type { AppThunkConfig } from '_store/thunk-extras'; +import type { RootState } from '_src/ui/app/redux/rootReducer'; +import type { AppThunkConfig } from '_src/ui/app/redux/store/thunkExtras'; import { createAsyncThunk, createEntityAdapter, diff --git a/apps/wallet/src/ui/app/redux/slices/transaction-requests/index.ts b/apps/wallet/src/ui/app/redux/slices/transaction-requests/index.ts index 3b5e0ee7fdc..7c7d1ca8b6e 100644 --- a/apps/wallet/src/ui/app/redux/slices/transaction-requests/index.ts +++ b/apps/wallet/src/ui/app/redux/slices/transaction-requests/index.ts @@ -2,15 +2,15 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import type { ApprovalRequest } from '_payloads/transactions/ApprovalRequest'; -import type { RootState } from '_redux/RootReducer'; +import type { ApprovalRequest } from '_src/shared/messaging/messages/payloads/transactions/approvalRequest'; +import type { RootState } from '_src/ui/app/redux/rootReducer'; import { getSignerOperationErrorMessage } from '_src/ui/app/helpers/errorMessages'; import { type SignedMessage, type SignedTransaction, type WalletSigner, -} from '_src/ui/app/WalletSigner'; -import type { AppThunkConfig } from '_store/thunk-extras'; +} from '_src/ui/app/walletSigner'; +import type { AppThunkConfig } from '_src/ui/app/redux/store/thunkExtras'; import { type IotaTransactionBlockResponse } from '@iota/iota-sdk/client'; import { Transaction } from '@iota/iota-sdk/transactions'; import { fromB64 } from '@iota/iota-sdk/utils'; diff --git a/apps/wallet/src/ui/app/redux/store/index.ts b/apps/wallet/src/ui/app/redux/store/index.ts index 3e5d2305941..e21ef95d800 100644 --- a/apps/wallet/src/ui/app/redux/store/index.ts +++ b/apps/wallet/src/ui/app/redux/store/index.ts @@ -2,10 +2,10 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import rootReducer from '_redux/RootReducer'; +import rootReducer from '_src/ui/app/redux/rootReducer'; import { configureStore } from '@reduxjs/toolkit'; -import { thunkExtras } from './thunk-extras'; +import { thunkExtras } from './thunkExtras'; const store = configureStore({ reducer: rootReducer, diff --git a/apps/wallet/src/ui/app/redux/store/thunk-extras.ts b/apps/wallet/src/ui/app/redux/store/thunkExtras.ts similarity index 77% rename from apps/wallet/src/ui/app/redux/store/thunk-extras.ts rename to apps/wallet/src/ui/app/redux/store/thunkExtras.ts index 583943762f3..3e7becadb78 100644 --- a/apps/wallet/src/ui/app/redux/store/thunk-extras.ts +++ b/apps/wallet/src/ui/app/redux/store/thunkExtras.ts @@ -3,8 +3,8 @@ // SPDX-License-Identifier: Apache-2.0 import { BackgroundClient } from '_app/background-client'; -import { growthbook } from '_app/experimentation/feature-gating'; -import type { RootState } from '_redux/RootReducer'; +import { growthbook } from '_src/ui/app/experimentation/featureGating'; +import type { RootState } from '_src/ui/app/redux/rootReducer'; import type { AppDispatch } from '_store'; export const thunkExtras = { diff --git a/apps/wallet/src/ui/app/shared/card-layout/index.tsx b/apps/wallet/src/ui/app/shared/card-layout/index.tsx index c77416b4082..51462be3475 100644 --- a/apps/wallet/src/ui/app/shared/card-layout/index.tsx +++ b/apps/wallet/src/ui/app/shared/card-layout/index.tsx @@ -3,7 +3,7 @@ // SPDX-License-Identifier: Apache-2.0 import type { ReactNode } from 'react'; -import { CheckmarkFilled, IotaLogoMark } from '@iota/ui-icons'; +import { CheckmarkFilled, IotaLogoMark } from '@iota/apps-ui-icons'; import { Header } from '@iota/apps-ui-kit'; export interface CardLayoutProps { diff --git a/apps/wallet/src/ui/app/shared/dapp-status/actions/index.ts b/apps/wallet/src/ui/app/shared/dapp-status/actions/index.ts index 17015037fb0..81e6989d859 100644 --- a/apps/wallet/src/ui/app/shared/dapp-status/actions/index.ts +++ b/apps/wallet/src/ui/app/shared/dapp-status/actions/index.ts @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import type { AppThunkConfig } from '_redux/store/thunk-extras'; +import type { AppThunkConfig } from '_src/ui/app/redux/store/thunkExtras'; import { createAsyncThunk } from '@reduxjs/toolkit'; export const appDisconnect = createAsyncThunk< diff --git a/apps/wallet/src/ui/app/shared/dapp-status/index.tsx b/apps/wallet/src/ui/app/shared/dapp-status/index.tsx index 42cb18e8598..794a8166abf 100644 --- a/apps/wallet/src/ui/app/shared/dapp-status/index.tsx +++ b/apps/wallet/src/ui/app/shared/dapp-status/index.tsx @@ -3,19 +3,18 @@ // SPDX-License-Identifier: Apache-2.0 import { Loading } from '_components'; -import { useAppDispatch, useAppSelector } from '_hooks'; +import { useAppDispatch, useAppSelector, useActiveAddress } from '_hooks'; import { createDappStatusSelector } from '_redux/slices/permissions'; import { ampli } from '_src/shared/analytics/ampli'; import { useClick, useDismiss, useFloating, useInteractions } from '@floating-ui/react'; import { AnimatePresence, motion } from 'framer-motion'; import { memo, useCallback, useMemo, useState } from 'react'; -import { useActiveAddress } from '../../hooks/useActiveAddress'; import { ButtonConnectedTo } from '../ButtonConnectedTo'; import { appDisconnect } from './actions'; -import { Link } from '@iota/ui-icons'; +import { Link } from '@iota/apps-ui-icons'; import { Button, ButtonSize, ButtonType } from '@iota/apps-ui-kit'; -function DappStatus() { +function DappStatusComponent() { const dispatch = useAppDispatch(); const activeOriginUrl = useAppSelector(({ app }) => app.activeOrigin); const activeOrigin = useMemo(() => { @@ -147,4 +146,4 @@ function DappStatus() { ); } -export default memo(DappStatus); +export const DappStatus = memo(DappStatusComponent); diff --git a/apps/wallet/src/ui/app/shared/faucet/FaucetMessageInfo.tsx b/apps/wallet/src/ui/app/shared/faucet/FaucetMessageInfo.tsx index ffdd417b5b3..460f56b5340 100644 --- a/apps/wallet/src/ui/app/shared/faucet/FaucetMessageInfo.tsx +++ b/apps/wallet/src/ui/app/shared/faucet/FaucetMessageInfo.tsx @@ -11,7 +11,7 @@ export interface FaucetMessageInfoProps { totalReceived?: number | null; } -function FaucetMessageInfo({ +export function FaucetMessageInfo({ error = null, loading = false, totalReceived = null, @@ -30,5 +30,3 @@ function FaucetMessageInfo({ <>{`${totalReceived ? `${coinsReceivedFormatted} ` : ''}${coinsReceivedSymbol} requested`}</> ); } - -export default FaucetMessageInfo; diff --git a/apps/wallet/src/ui/app/shared/faucet/FaucetRequestButton.tsx b/apps/wallet/src/ui/app/shared/faucet/FaucetRequestButton.tsx index fd8326069b2..0cd90bf29c0 100644 --- a/apps/wallet/src/ui/app/shared/faucet/FaucetRequestButton.tsx +++ b/apps/wallet/src/ui/app/shared/faucet/FaucetRequestButton.tsx @@ -10,9 +10,9 @@ import { toast } from 'react-hot-toast'; import { useFaucetMutation } from './useFaucetMutation'; import { useFaucetRateLimiter } from './useFaucetRateLimiter'; import { Button, ButtonType } from '@iota/apps-ui-kit'; -import FaucetMessageInfo from './FaucetMessageInfo'; +import { FaucetMessageInfo } from './FaucetMessageInfo'; -function FaucetRequestButton(): JSX.Element | null { +export function FaucetRequestButton(): JSX.Element | null { const network = useAppSelector(({ app }) => app.network); const customRpc = useAppSelector(({ app }) => app.customRpc); const networkConfig = customRpc ? getCustomNetwork(customRpc) : getNetwork(network); @@ -50,5 +50,3 @@ function FaucetRequestButton(): JSX.Element | null { /> ) : null; } - -export default FaucetRequestButton; diff --git a/apps/wallet/src/ui/app/shared/faucet/useFaucetMutation.ts b/apps/wallet/src/ui/app/shared/faucet/useFaucetMutation.ts index 527c780e200..dca924bb7cc 100644 --- a/apps/wallet/src/ui/app/shared/faucet/useFaucetMutation.ts +++ b/apps/wallet/src/ui/app/shared/faucet/useFaucetMutation.ts @@ -4,8 +4,7 @@ import { getFaucetRequestStatus, requestIotaFromFaucetV1 } from '@iota/iota-sdk/faucet'; import { useIsMutating, useMutation, type UseMutationOptions } from '@tanstack/react-query'; - -import { useActiveAccount } from '../../hooks/useActiveAccount'; +import { useActiveAccount } from '_hooks'; type UseFaucetMutationOptions = Pick<UseMutationOptions, 'onError'> & { host?: string; diff --git a/apps/wallet/src/ui/app/shared/page-main-layout/PageMainLayout.tsx b/apps/wallet/src/ui/app/shared/page-main-layout/PageMainLayout.tsx index 9896be915fb..07944a44a57 100644 --- a/apps/wallet/src/ui/app/shared/page-main-layout/PageMainLayout.tsx +++ b/apps/wallet/src/ui/app/shared/page-main-layout/PageMainLayout.tsx @@ -5,16 +5,15 @@ import { ErrorBoundary, MenuContent, Navigation, WalletSettingsButton } from '_components'; import cn from 'clsx'; import { createContext, type ReactNode, useState } from 'react'; -import { useAppSelector } from '../../hooks'; -import { AppType } from '../../redux/slices/app/AppType'; -import DappStatus from '../dapp-status'; +import { useAppSelector, useActiveAccount } from '_hooks'; +import { AppType } from '../../redux/slices/app/appType'; +import { DappStatus } from '../dapp-status'; import { Header } from '../header/Header'; import { Toaster } from '../toaster'; -import { IotaLogoMark, Ledger } from '@iota/ui-icons'; -import { useActiveAccount } from '../../hooks/useActiveAccount'; +import { IotaLogoMark, Ledger } from '@iota/apps-ui-icons'; import { Link } from 'react-router-dom'; -import { isLedgerAccountSerializedUI } from '_src/background/accounts/LedgerAccount'; -import { type SerializedUIAccount } from '_src/background/accounts/Account'; +import { isLedgerAccountSerializedUI } from '_src/background/accounts/ledgerAccount'; +import { type SerializedUIAccount } from '_src/background/accounts/account'; import { formatAccountName } from '../../helpers'; export const PageMainLayoutContext = createContext<HTMLDivElement | null>(null); diff --git a/apps/wallet/src/ui/app/staking/delegation-detail/DelegationDetailCard.tsx b/apps/wallet/src/ui/app/staking/delegation-detail/DelegationDetailCard.tsx index d55abd8b0b7..4ed1e6df5fa 100644 --- a/apps/wallet/src/ui/app/staking/delegation-detail/DelegationDetailCard.tsx +++ b/apps/wallet/src/ui/app/staking/delegation-detail/DelegationDetailCard.tsx @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { useAppSelector } from '_hooks'; +import { useAppSelector, useActiveAddress } from '_hooks'; import { ampli } from '_src/shared/analytics/ampli'; import { useBalance, @@ -14,13 +14,13 @@ import { useFormatCoin, formatPercentageDisplay, MIN_NUMBER_IOTA_TO_STAKE, + Validator, } from '@iota/core'; import { useIotaClientQuery } from '@iota/dapp-kit'; import { Network, type StakeObject } from '@iota/iota-sdk/client'; import { NANOS_PER_IOTA, IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; import BigNumber from 'bignumber.js'; import { useMemo } from 'react'; -import { useActiveAddress } from '../../hooks/useActiveAddress'; import { getDelegationDataByStakeId } from '../getDelegationByStakeId'; import { CardType, @@ -35,8 +35,8 @@ import { LoadingIndicator, } from '@iota/apps-ui-kit'; import { useNavigate } from 'react-router-dom'; -import { ValidatorLogo } from '../validators/ValidatorLogo'; -import { Warning } from '@iota/ui-icons'; +import { Warning } from '@iota/apps-ui-icons'; +import toast from 'react-hot-toast'; interface DelegationDetailCardProps { validatorAddress: string; @@ -122,17 +122,7 @@ export function DelegationDetailCard({ validatorAddress, stakedId }: DelegationD } if (isError || errorValidators) { - return ( - <div className="mb-2 flex h-full w-full items-center justify-center p-2"> - <InfoBox - title="Something went wrong" - supportingText={error?.message ?? 'An error occurred'} - style={InfoBoxStyle.Default} - type={InfoBoxType.Error} - icon={<Warning />} - /> - </div> - ); + toast.error(error?.message ?? 'An error occurred fetching validator information'); } function handleAddNewStake() { navigate(stakeByValidatorAddress); @@ -153,7 +143,7 @@ export function DelegationDetailCard({ validatorAddress, stakedId }: DelegationD return ( <div className="flex h-full w-full flex-col justify-between"> <div className="flex flex-col gap-y-md"> - <ValidatorLogo validatorAddress={validatorAddress} type={CardType.Filled} /> + <Validator address={validatorAddress} type={CardType.Filled} /> {hasInactiveValidatorDelegation ? ( <InfoBox type={InfoBoxType.Error} diff --git a/apps/wallet/src/ui/app/staking/delegation-detail/index.tsx b/apps/wallet/src/ui/app/staking/delegation-detail/index.tsx index eb0854b601f..c24a35ffc66 100644 --- a/apps/wallet/src/ui/app/staking/delegation-detail/index.tsx +++ b/apps/wallet/src/ui/app/staking/delegation-detail/index.tsx @@ -5,7 +5,7 @@ import { Overlay } from '_components'; import { useGetDelegatedStake } from '@iota/core'; import { Navigate, useNavigate, useSearchParams } from 'react-router-dom'; -import { useActiveAddress } from '../../hooks/useActiveAddress'; +import { useActiveAddress } from '_hooks'; import { DelegationDetailCard } from './DelegationDetailCard'; import { LoadingIndicator } from '@iota/apps-ui-kit'; diff --git a/apps/wallet/src/ui/app/staking/home/index.tsx b/apps/wallet/src/ui/app/staking/home/index.tsx index 1dd9407de84..10add7f16c3 100644 --- a/apps/wallet/src/ui/app/staking/home/index.tsx +++ b/apps/wallet/src/ui/app/staking/home/index.tsx @@ -3,10 +3,9 @@ // SPDX-License-Identifier: Apache-2.0 import { Route, Routes } from 'react-router-dom'; - -import { useUnlockedGuard } from '../../hooks/useUnlockedGuard'; +import { useUnlockedGuard } from '_hooks'; import { DelegationDetail } from '../delegation-detail'; -import StakePage from '../stake'; +import { StakePage } from '../stake'; import { Validators } from '../validators'; export function StakingPage() { diff --git a/apps/wallet/src/ui/app/staking/stake/StakeForm.tsx b/apps/wallet/src/ui/app/staking/stake/StakeForm.tsx index 093991e6f33..59045e9a01e 100644 --- a/apps/wallet/src/ui/app/staking/stake/StakeForm.tsx +++ b/apps/wallet/src/ui/app/staking/stake/StakeForm.tsx @@ -14,11 +14,11 @@ import { } from '@iota/core'; import { Field, type FieldProps, Form, useFormikContext } from 'formik'; import { memo, useEffect, useMemo } from 'react'; -import { useActiveAddress, useTransactionDryRun } from '../../hooks'; +import { useActiveAddress, useTransactionDryRun } from '_hooks'; import { type FormValues } from './StakingCard'; import { InfoBox, InfoBoxStyle, InfoBoxType, Input, InputType } from '@iota/apps-ui-kit'; import { Transaction } from '@iota/iota-sdk/transactions'; -import { Exclamation } from '@iota/ui-icons'; +import { Exclamation } from '@iota/apps-ui-icons'; import { ExplorerLinkHelper } from '../../components'; export interface StakeFromProps { @@ -28,7 +28,12 @@ export interface StakeFromProps { epoch?: string | number; } -function StakeForm({ validatorAddress, coinBalance, coinType, epoch }: StakeFromProps) { +export function StakeFormComponent({ + validatorAddress, + coinBalance, + coinType, + epoch, +}: StakeFromProps) { const { values, setFieldValue } = useFormikContext<FormValues>(); const activeAddress = useActiveAddress(); const { data: metadata } = useCoinMetadata(coinType); @@ -117,4 +122,4 @@ function StakeForm({ validatorAddress, coinBalance, coinType, epoch }: StakeFrom ); } -export default memo(StakeForm); +export const StakeForm = memo(StakeFormComponent); diff --git a/apps/wallet/src/ui/app/staking/stake/StakingCard.tsx b/apps/wallet/src/ui/app/staking/stake/StakingCard.tsx index a4f94a5de47..0a3510a5ba7 100644 --- a/apps/wallet/src/ui/app/staking/stake/StakingCard.tsx +++ b/apps/wallet/src/ui/app/staking/stake/StakingCard.tsx @@ -3,7 +3,7 @@ // SPDX-License-Identifier: Apache-2.0 import { Loading } from '_components'; -import { Coin } from '_redux/slices/iota-objects/Coin'; +import { Coin } from '_src/ui/app/redux/slices/iota-objects/coin'; import { ampli } from '_src/shared/analytics/ampli'; import { createStakeTransaction, @@ -17,6 +17,7 @@ import { getStakeIotaByIotaId, createValidationSchema, MIN_NUMBER_IOTA_TO_STAKE, + Validator, } from '@iota/core'; import { useIotaClientQuery } from '@iota/dapp-kit'; import type { StakeObject } from '@iota/iota-sdk/client'; @@ -29,10 +30,9 @@ import { useCallback, useMemo } from 'react'; import { toast } from 'react-hot-toast'; import { Navigate, useNavigate, useSearchParams } from 'react-router-dom'; import { getSignerOperationErrorMessage } from '../../helpers/errorMessages'; -import { useActiveAccount } from '../../hooks/useActiveAccount'; -import { useSigner } from '../../hooks/useSigner'; +import { useActiveAccount, useSigner } from '_hooks'; import { getDelegationDataByStakeId } from '../getDelegationByStakeId'; -import StakeForm from './StakeForm'; +import { StakeForm } from './StakeForm'; import { UnStakeForm } from './UnstakeForm'; import { ValidatorFormDetail } from './ValidatorFormDetail'; import { @@ -43,8 +43,7 @@ import { InfoBoxStyle, InfoBoxType, } from '@iota/apps-ui-kit'; -import { ValidatorLogo } from '../validators/ValidatorLogo'; -import { Info, Loader } from '@iota/ui-icons'; +import { Info, Loader } from '@iota/apps-ui-icons'; const INITIAL_VALUES = { amount: '', @@ -52,7 +51,7 @@ const INITIAL_VALUES = { export type FormValues = typeof INITIAL_VALUES; -function StakingCard() { +export function StakingCard() { const coinType = IOTA_TYPE_ARG; const activeAccount = useActiveAccount(); const accountAddress = activeAccount?.address; @@ -121,26 +120,33 @@ function StakingCard() { throw new Error('Failed, missing required field'); } - const sentryTransaction = Sentry.startTransaction({ - name: 'stake', - }); - try { - const transactionBlock = createStakeTransaction(amount, validatorAddress); - const tx = await signer.signAndExecuteTransaction({ - transactionBlock, - options: { - showInput: true, - showEffects: true, - showEvents: true, - }, - }); - await signer.client.waitForTransaction({ - digest: tx.digest, - }); - return tx; - } finally { - sentryTransaction.finish(); - } + return Sentry.startSpan( + { + name: 'stake', + }, + async (span) => { + try { + const transactionBlock = createStakeTransaction( + amount, + validatorAddress, + ); + const tx = await signer.signAndExecuteTransaction({ + transactionBlock, + options: { + showInput: true, + showEffects: true, + showEvents: true, + }, + }); + await signer.client.waitForTransaction({ + digest: tx.digest, + }); + return tx; + } finally { + span?.end(); + } + }, + ); }, onSuccess: (_, { amount, validatorAddress }) => { ampli.stakedIota({ @@ -157,26 +163,30 @@ function StakingCard() { throw new Error('Failed, missing required field.'); } - const sentryTransaction = Sentry.startTransaction({ - name: 'stake', - }); - try { - const transactionBlock = createUnstakeTransaction(stakedIotaId); - const tx = await signer.signAndExecuteTransaction({ - transactionBlock, - options: { - showInput: true, - showEffects: true, - showEvents: true, - }, - }); - await signer.client.waitForTransaction({ - digest: tx.digest, - }); - return tx; - } finally { - sentryTransaction.finish(); - } + return Sentry.startSpan( + { + name: 'stake', + }, + async (span) => { + try { + const transactionBlock = createUnstakeTransaction(stakedIotaId); + const tx = await signer.signAndExecuteTransaction({ + transactionBlock, + options: { + showInput: true, + showEffects: true, + showEvents: true, + }, + }); + await signer.client.waitForTransaction({ + digest: tx.digest, + }); + return tx; + } finally { + span?.end(); + } + }, + ); }, onSuccess: () => { ampli.unstakedIota({ @@ -285,10 +295,7 @@ function StakingCard() { {({ isSubmitting, isValid, submitForm }) => ( <> <div className="flex h-full flex-col gap-md overflow-auto"> - <ValidatorLogo - validatorAddress={validatorAddress} - type={CardType.Filled} - /> + <Validator address={validatorAddress} type={CardType.Filled} /> <ValidatorFormDetail validatorAddress={validatorAddress} unstake={unstake} @@ -347,5 +354,3 @@ function StakingCard() { </div> ); } - -export default StakingCard; diff --git a/apps/wallet/src/ui/app/staking/stake/UnstakeForm.tsx b/apps/wallet/src/ui/app/staking/stake/UnstakeForm.tsx index 51067f5f966..82ed60683b8 100644 --- a/apps/wallet/src/ui/app/staking/stake/UnstakeForm.tsx +++ b/apps/wallet/src/ui/app/staking/stake/UnstakeForm.tsx @@ -14,7 +14,7 @@ import { IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; import { Form } from 'formik'; import { useMemo } from 'react'; -import { useActiveAddress, useTransactionGasBudget } from '../../hooks'; +import { useActiveAddress, useTransactionGasBudget } from '_hooks'; import { Divider, KeyValueInfo, Panel } from '@iota/apps-ui-kit'; export interface StakeFromProps { diff --git a/apps/wallet/src/ui/app/staking/stake/ValidatorFormDetail.tsx b/apps/wallet/src/ui/app/staking/stake/ValidatorFormDetail.tsx index 5d3caf7314a..4772c32d487 100644 --- a/apps/wallet/src/ui/app/staking/stake/ValidatorFormDetail.tsx +++ b/apps/wallet/src/ui/app/staking/stake/ValidatorFormDetail.tsx @@ -4,7 +4,7 @@ import { formatPercentageDisplay, useGetStakingValidatorDetails } from '@iota/core'; import { useSearchParams } from 'react-router-dom'; -import { useActiveAddress } from '../../hooks/useActiveAddress'; +import { useActiveAddress } from '_hooks'; import { InfoBox, InfoBoxStyle, @@ -14,7 +14,7 @@ import { TooltipPosition, LoadingIndicator, } from '@iota/apps-ui-kit'; -import { Warning } from '@iota/ui-icons'; +import { Warning } from '@iota/apps-ui-icons'; interface ValidatorFormDetailProps { validatorAddress: string; diff --git a/apps/wallet/src/ui/app/staking/stake/index.tsx b/apps/wallet/src/ui/app/staking/stake/index.tsx index 4add0478403..60770068945 100644 --- a/apps/wallet/src/ui/app/staking/stake/index.tsx +++ b/apps/wallet/src/ui/app/staking/stake/index.tsx @@ -6,9 +6,9 @@ import { Overlay } from '_components'; import { useNavigate, useSearchParams } from 'react-router-dom'; import { SelectValidatorCard } from '../validators/SelectValidatorCard'; -import StakingCard from './StakingCard'; +import { StakingCard } from './StakingCard'; -function StakePage() { +export function StakePage() { const [searchParams] = useSearchParams(); const validatorAddress = searchParams.get('address'); const unstake = searchParams.get('unstake') === 'true'; @@ -27,5 +27,3 @@ function StakePage() { </Overlay> ); } - -export default StakePage; diff --git a/apps/wallet/src/ui/app/staking/validators/SelectValidatorCard.tsx b/apps/wallet/src/ui/app/staking/validators/SelectValidatorCard.tsx index 015463bc23d..ed14f2a16db 100644 --- a/apps/wallet/src/ui/app/staking/validators/SelectValidatorCard.tsx +++ b/apps/wallet/src/ui/app/staking/validators/SelectValidatorCard.tsx @@ -3,14 +3,13 @@ // SPDX-License-Identifier: Apache-2.0 import { ampli } from '_src/shared/analytics/ampli'; -import { calculateStakeShare, useGetValidatorsApy } from '@iota/core'; +import { calculateStakeShare, useGetValidatorsApy, Validator } from '@iota/core'; import { useIotaClientQuery } from '@iota/dapp-kit'; import cl from 'clsx'; import { useMemo, useState } from 'react'; import { Button, InfoBox, InfoBoxStyle, InfoBoxType, LoadingIndicator } from '@iota/apps-ui-kit'; import { useNavigate } from 'react-router-dom'; -import { ValidatorLogo } from './ValidatorLogo'; -import { Warning } from '@iota/ui-icons'; +import { Warning } from '@iota/apps-ui-icons'; type Validator = { name: string; @@ -96,9 +95,8 @@ export function SelectValidatorCard() { })} key={validator.address} > - <ValidatorLogo - validatorAddress={validator.address} - showApy + <Validator + address={validator.address} onClick={() => { selectValidator(validator); }} diff --git a/apps/wallet/src/ui/app/staking/validators/ValidatorLogo.tsx b/apps/wallet/src/ui/app/staking/validators/ValidatorLogo.tsx deleted file mode 100644 index bf8d05a97b6..00000000000 --- a/apps/wallet/src/ui/app/staking/validators/ValidatorLogo.tsx +++ /dev/null @@ -1,101 +0,0 @@ -// Copyright (c) Mysten Labs, Inc. -// Modifications Copyright (c) 2024 IOTA Stiftung -// SPDX-License-Identifier: Apache-2.0 -import { - Badge, - BadgeType, - Card, - CardAction, - CardActionType, - CardBody, - CardImage, - type CardType, -} from '@iota/apps-ui-kit'; -import { useIotaClientQuery } from '@iota/dapp-kit'; -import { formatAddress } from '@iota/iota-sdk/utils'; -import { useMemo } from 'react'; -import { formatPercentageDisplay, useGetValidatorsApy, ImageIcon, ImageIconSize } from '@iota/core'; - -interface ValidatorLogoProps { - validatorAddress: string; - type?: CardType; - showApy?: boolean; - showActiveStatus?: boolean; - activeEpoch?: string; - onClick?(): void; -} - -export function ValidatorLogo({ - validatorAddress, - type, - showApy, - showActiveStatus = false, - activeEpoch, - onClick, -}: ValidatorLogoProps) { - const { data: system, isPending } = useIotaClientQuery('getLatestIotaSystemState'); - const { data: rollingAverageApys } = useGetValidatorsApy(); - const { apy, isApyApproxZero } = rollingAverageApys?.[validatorAddress] ?? { - apy: null, - }; - - const validatorMeta = useMemo(() => { - if (!system) return null; - - return ( - system.activeValidators.find( - (validator) => validator.iotaAddress === validatorAddress, - ) || null - ); - }, [validatorAddress, system]); - - const stakingPoolActivationEpoch = Number(validatorMeta?.stakingPoolActivationEpoch || 0); - const currentEpoch = Number(system?.epoch || 0); - - // flag as new validator if the validator was activated in the last epoch - // for genesis validators, this will be false - const newValidator = currentEpoch - stakingPoolActivationEpoch <= 1 && currentEpoch !== 0; - - // flag if the validator is at risk of being removed from the active set - const isAtRisk = system?.atRiskValidators.some((item) => item[0] === validatorAddress); - - if (isPending) { - return <div className="flex items-center justify-center">...</div>; - } - // for inactive validators, show the epoch number - const fallBackText = activeEpoch - ? `Staked ${Number(system?.epoch) - Number(activeEpoch)} epochs ago` - : ''; - const validatorName = validatorMeta?.name || fallBackText; - - const subtitle = showActiveStatus ? ( - <div className="flex items-center gap-1"> - {formatAddress(validatorAddress)} - {newValidator && <Badge label="New" type={BadgeType.PrimarySoft} />} - {isAtRisk && <Badge label="At Risk" type={BadgeType.PrimarySolid} />} - </div> - ) : ( - formatAddress(validatorAddress) - ); - return ( - <> - <Card type={type} onClick={onClick}> - <CardImage> - <ImageIcon - src={validatorMeta?.imageUrl ?? null} - label={validatorName} - fallback={validatorName} - size={ImageIconSize.Large} - /> - </CardImage> - <CardBody title={validatorName} subtitle={subtitle} isTextTruncated /> - {showApy && ( - <CardAction - type={CardActionType.SupportingText} - title={formatPercentageDisplay(apy, '-', isApyApproxZero)} - /> - )} - </Card> - </> - ); -} diff --git a/apps/wallet/src/ui/app/staking/validators/ValidatorsCard.tsx b/apps/wallet/src/ui/app/staking/validators/ValidatorsCard.tsx index 606c51ec947..7c5516650ad 100644 --- a/apps/wallet/src/ui/app/staking/validators/ValidatorsCard.tsx +++ b/apps/wallet/src/ui/app/staking/validators/ValidatorsCard.tsx @@ -15,7 +15,7 @@ import { } from '@iota/core'; import { useIotaClientQuery } from '@iota/dapp-kit'; import { useMemo } from 'react'; -import { useActiveAddress } from '../../hooks/useActiveAddress'; +import { useActiveAddress } from '_hooks'; import { Title, TitleSize, @@ -28,7 +28,7 @@ import { DisplayStats, } from '@iota/apps-ui-kit'; import { useNavigate } from 'react-router-dom'; -import { Info, Warning } from '@iota/ui-icons'; +import { Info, Warning } from '@iota/apps-ui-icons'; import { IOTA_TYPE_ARG } from '@iota/iota-sdk/utils'; export function ValidatorsCard() { diff --git a/apps/wallet/src/ui/app/staking/validators/index.tsx b/apps/wallet/src/ui/app/staking/validators/index.tsx index a5ad53c1b61..e24784424ce 100644 --- a/apps/wallet/src/ui/app/staking/validators/index.tsx +++ b/apps/wallet/src/ui/app/staking/validators/index.tsx @@ -9,12 +9,11 @@ import { DELEGATED_STAKES_QUERY_STALE_TIME, } from '@iota/core'; import { useNavigate } from 'react-router-dom'; - -import { useActiveAddress } from '../../hooks/useActiveAddress'; +import { useActiveAddress } from '_hooks'; import { SelectValidatorCard } from './SelectValidatorCard'; import { ValidatorsCard } from './ValidatorsCard'; import { InfoBox, InfoBoxType, InfoBoxStyle } from '@iota/apps-ui-kit'; -import { Warning } from '@iota/ui-icons'; +import { Warning } from '@iota/apps-ui-icons'; export function Validators() { const accountAddress = useActiveAddress(); diff --git a/apps/wallet/src/ui/app/WalletSigner.ts b/apps/wallet/src/ui/app/walletSigner.ts similarity index 100% rename from apps/wallet/src/ui/app/WalletSigner.ts rename to apps/wallet/src/ui/app/walletSigner.ts diff --git a/apps/wallet/src/ui/assets/images/balance_finder_intro.svg b/apps/wallet/src/ui/assets/images/balance_finder_intro.svg new file mode 100644 index 00000000000..15d0910299f --- /dev/null +++ b/apps/wallet/src/ui/assets/images/balance_finder_intro.svg @@ -0,0 +1,9 @@ +<svg width="360" height="270" viewBox="0 0 360 270" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> +<path d="M360 0H0V270H360V0Z" fill="url(#pattern0_1_8)"/> +<defs> +<pattern id="pattern0_1_8" patternContentUnits="objectBoundingBox" width="1" height="1"> +<use xlink:href="#image0_1_8" transform="scale(0.000706215 0.00094162)"/> +</pattern> +<image id="image0_1_8" width="1416" height="1062" xlink:href="data:image/png;base64,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77CD6wdsaWvDrgxmx+LZn3kDq4hjYw2VS8gTGl/hfHHyPfa96Fc5l9gXsVhxeNeMJJ2oEBACtzkCIohv8xusyxMCQkAICIHbGAFf9F2yw7bPtvwqP3S3HXvyQ7Zx9x22fGDVjq3us6Nn7rG1IvtZsmM22jGy80tgxsFeWXICuHquvuwvLI2VRHttsFdFAt/GY+hmXxrGsNmma+M/dJ8de/JMHcP3nLTlNy7a3T+xaWt+mj6Gl8yOllMebXBVsdtFFE9LjGHfz1iyl11IPGoM3+y7q+8XAkJgNyDQ5xIUh7dO2vK583b3mbtqHP7hG7Z+bN02PJfIRrVRlTGavbK0ZK94zuFxWLnEbrj5OkchIASEwISACGKNBiEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhMAeRUAE8R698bpsISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgAhijQEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBITAHkVABPEevfG6bCEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAIYo0BISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEwB5FQATxHr3xumwhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBDTbu8wAABn5SURBVISACGKNASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhMAeRUAE8R698bpsISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgAhijQEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBITAHkVABPEevfG6bCEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAIYo0BISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEwB5FQATxHr3xumwhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISACGKNASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhMAeRUAE8R698bpsISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgAhijQEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBITAHkVABPEevfG6bCEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAIYo0BISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEwB5FQATxHr3xumwhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISACGKNASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhMAeRUAE8R698bpsISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgAhijQEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBITAHkVABPEevfG6bCEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAIYo0BISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEwB5FQATxHr3xumwhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISACGKNASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhMAeRUAE8R698bpsISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgAhijQEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBITAHkVABPEevfG6bCEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAIYo0BISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEwB5FQATxHr3xumwhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISACGKNASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhMAeRUAE8R698bpsISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgAhijQEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBITAHkVABPEevfG6bCEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAIYo0BISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEwB5FQATxHr3xumwhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISACGKNASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhMAeRUAE8R698bpsISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgAhijQEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBITAHkVABPEevfG6bCEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAIYo0BISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEwB5FQATxHr3xumwhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISACGKNASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhMAeRUAE8R698bpsISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgAhijQEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBITAHkVABPEevfG6bCEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAIYo0BISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEwB5FQATxHr3xumwhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISACGKNASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhMAeRUAE8R698bpsISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgAhijQEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBITAHkVABPEevfG6bCEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAIYo0BISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEwB5FQATxHr3xumwhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISACGKNASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhMAeRUAE8R698bpsISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgAhijQEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBITAHkVABPEevfG6bCEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAIYo0BISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEwB5FQATxHr3xumwhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISACGKNASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhMAeRUAE8R698bpsISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgAhijQEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBITAHkVABPEevfG6bCEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAIYo2B/78dOyYAAABAENa/NUFYBKeXBAgQIECAAAECBAgQIECAAAECBAgQmAo4iKfFi02AAAECBAgQIECAAAECBAgQIECAAAEHsQ0QIECAAAECBAgQIECAAAECBAgQIEBgKuAgnhYvNgECBAgQIECAAAECBAgQIECAAAECBBzENkCAAAECBAgQIECAAAECBAgQIECAAIGpgIN4WrzYBAgQIECAAAECBAgQIECAAAECBAgQcBDbAAECBAgQIECAAAECBAgQIECAAAECBKYCDuJp8WITIECAAAECBAgQIECAAAECBAgQIEDAQWwDBAgQIECAAAECBAgQIECAAAECBAgQmAo4iKfFi02AAAECBAgQIECAAAECBAgQIECAAAEHsQ0QIECAAAECBAgQIECAAAECBAgQIEBgKuAgnhYvNgECBAgQIECAAAECBAgQIECAAAECBBzENkCAAAECBAgQIECAAAECBAgQIECAAIGpgIN4WrzYBAgQIECAAAECBAgQIECAAAECBAgQcBDbAAECBAgQIECAAAECBAgQIECAAAECBKYCDuJp8WITIECAAAECBAgQIECAAAECBAgQIEDAQWwDBAgQIECAAAECBAgQIECAAAECBAgQmAo4iKfFi02AAAECBAgQIECAAAECBAgQIECAAAEHsQ0QIECAAAECBAgQIECAAAECBAgQIEBgKuAgnhYvNgECBAgQIECAAAECBAgQIECAAAECBBzENkCAAAECBAgQIECAAAECBAgQIECAAIGpgIN4WrzYBAgQIECAAAECBAgQIECAAAECBAgQcBDbAAECBAgQIECAAAECBAgQIECAAAECBKYCDuJp8WITIECAAAECBAgQIECAAAECBAgQIEDAQWwDBAgQIECAAAECBAgQIECAAAECBAgQmAo4iKfFi02AAAECBAgQIECAAAECBAgQIECAAAEHsQ0QIECAAAECBAgQIECAAAECBAgQIEBgKuAgnhYvNgECBAgQIECAAAECBAgQIECAAAECBBzENkCAAAECBAgQIECAAAECBAgQIECAAIGpgIN4WrzYBAgQIECAAAECBAgQIECAAAECBAgQcBDbAAECBAgQIECAAAECBAgQIECAAAECBKYCDuJp8WITIECAAAECBAgQIECAAAECBAgQIEDAQWwDBAgQIECAAAECBAgQIECAAAECBAgQmAo4iKfFi02AAAECBAgQIECAAAECBAgQIECAAAEHsQ0QIECAAAECBAgQIECAAAECBAgQIEBgKuAgnhYvNgECBAgQIECAAAECBAgQIECAAAECBBzENkCAAAECBAgQIECAAAECBAgQIECAAIGpgIN4WrzYBAgQIECAAAECBAgQIECAAAECBAgQcBDbAAECBAgQIECAAAECBAgQIECAAAECBKYCDuJp8WITIECAAAECBAgQIECAAAECBAgQIEDAQWwDBAgQIECAAAECBAgQIECAAAECBAgQmAo4iKfFi02AAAECBAgQIECAAAECBAgQIECAAAEHsQ0QIECAAAECBAgQIECAAAECBAgQIEBgKuAgnhYvNgECBAgQIECAAAECBAgQIECAAAECBBzENkCAAAECBAgQIECAAAECBAgQIECAAIGpgIN4WrzYBAgQIECAAAECBAgQIECAAAECBAgQcBDbAAECBAgQIECAAAECBAgQIECAAAECBKYCDuJp8WITIECAAAECBAgQIECAAAECBAgQIEDAQWwDBAgQIECAAAECBAgQIECAAAECBAgQmAo4iKfFi02AAAECBAgQIECAAAECBAgQIECAAAEHsQ0QIECAAAECBAgQIECAAAECBAgQIEBgKuAgnhYvNgECBAgQIECAAAECBAgQIECAAAECBBzENkCAAAECBAgQIECAAAECBAgQIECAAIGpgIN4WrzYBAgQIECAAAECBAgQIECAAAECBAgQcBDbAAECBAgQIECAAAECBAgQIECAAAECBKYCDuJp8WITIECAAAECBAgQIECAAAECBAgQIEDAQWwDBAgQIECAAAECBAgQIECAAAECBAgQmAo4iKfFi02AAAECBAgQIECAAAECBAgQIECAAAEHsQ0QIECAAAECBAgQIECAAAECBAgQIEBgKuAgnhYvNgECBAgQIECAAAECBAgQIECAAAECBBzENkCAAAECBAgQIECAAAECBAgQIECAAIGpgIN4WrzYBAgQIECAAAECBAgQIECAAAECBAgQcBDbAAECBAgQIECAAAECBAgQIECAAAECBKYCDuJp8WITIECAAAECBAgQIECAAAECBAgQIEDAQWwDBAgQIECAAAECBAgQIECAAAECBAgQmAo4iKfFi02AAAECBAgQIECAAAECBAgQIECAAAEHsQ0QIECAAAECBAgQIECAAAECBAgQIEBgKuAgnhYvNgECBAgQIECAAAECBAgQIECAAAECBBzENkCAAAECBAgQIECAAAECBAgQIECAAIGpgIN4WrzYBAgQIECAAAECBAgQIECAAAECBAgQcBDbAAECBAgQIECAAAECBAgQIECAAAECBKYCDuJp8WITIECAAAECBAgQIECAAAECBAgQIEDAQWwDBAgQIECAAAECBAgQIECAAAECBAgQmAo4iKfFi02AAAECBAgQIECAAAECBAgQIECAAAEHsQ0QIECAAAECBAgQIECAAAECBAgQIEBgKuAgnhYvNgECBAgQIECAAAECBAgQIECAAAECBBzENkCAAAECBAgQIECAAAECBAgQIECAAIGpgIN4WrzYBAgQIECAAAECBAgQIECAAAECBAgQcBDbAAECBAgQIECAAAECBAgQIECAAAECBKYCDuJp8WITIECAAAECBAgQIECAAAECBAgQIEDAQWwDBAgQIECAAAECBAgQIECAAAECBAgQmAo4iKfFi02AAAECBAgQIECAAAECBAgQIECAAAEHsQ0QIECAAAECBAgQIECAAAECBAgQIEBgKuAgnhYvNgECBAgQIECAAAECBAgQIECAAAECBBzENkCAAAECBAgQIECAAAECBAgQIECAAIGpgIN4WrzYBAgQIECAAAECBAgQIECAAAECBAgQcBDbAAECBAgQIECAAAECBAgQIECAAAECBKYCDuJp8WITIECAAAECBAgQIECAAAECBAgQIEDAQWwDBAgQIECAAAECBAgQIECAAAECBAgQmAo4iKfFi02AAAECBAgQIECAAAECBAgQIECAAAEHsQ0QIECAAAECBAgQIECAAAECBAgQIEBgKuAgnhYvNgECBAgQIECAAAECBAgQIECAAAECBBzENkCAAAECBAgQIECAAAECBAgQIECAAIGpgIN4WrzYBAgQIECAAAECBAgQIECAAAECBAgQcBDbAAECBAgQIECAAAECBAgQIECAAAECBKYCDuJp8WITIECAAAECBAgQIECAAAECBAgQIEDAQWwDBAgQIECAAAECBAgQIECAAAECBAgQmAo4iKfFi02AAAECBAgQIECAAAECBAgQIECAAAEHsQ0QIECAAAECBAgQIECAAAECBAgQIEBgKuAgnhYvNgECBAgQIECAAAECBAgQIECAAAECBBzENkCAAAECBAgQIECAAAECBAgQIECAAIGpgIN4WrzYBAgQIECAAAECBAgQIECAAAECBAgQcBDbAAECBAgQIECAAAECBAgQIECAAAECBKYCDuJp8WITIECAAAECBAgQIECAAAECBAgQIEDAQWwDBAgQIECAAAECBAgQIECAAAECBAgQmAo4iKfFi02AAAECBAgQIECAAAECBAgQIECAAAEHsQ0QIECAAAECBAgQIECAAAECBAgQIEBgKuAgnhYvNgECBAgQIECAAAECBAgQIECAAAECBBzENkCAAAECBAgQIECAAAECBAgQIECAAIGpgIN4WrzYBAgQIECAAAECBAgQIECAAAECBAgQcBDbAAECBAgQIECAAAECBAgQIECAAAECBKYCDuJp8WITIECAAAECBAgQIECAAAECBAgQIEDAQWwDBAgQIECAAAECBAgQIECAAAECBAgQmAo4iKfFi02AAAECBAgQIECAAAECBAgQIECAAAEHsQ0QIECAAAECBAgQIECAAAECBAgQIEBgKuAgnhYvNgECBAgQIECAAAECBAgQIECAAAECBBzENkCAAAECBAgQIECAAAECBAgQIECAAIGpgIN4WrzYBAgQIECAAAECBAgQIECAAAECBAgQcBDbAAECBAgQIECAAAECBAgQIECAAAECBKYCDuJp8WITIECAAAECBAgQIECAAAECBAgQIEDAQWwDBAgQIECAAAECBAgQIECAAAECBAgQmAo4iKfFi02AAAECBAgQIECAAAECBAgQIECAAAEHsQ0QIECAAAECBAgQIECAAAECBAgQIEBgKuAgnhYvNgECBAgQIECAAAECBAgQIECAAAECBBzENkCAAAECBAgQIECAAAECBAgQIECAAIGpgIN4WrzYBAgQIECAAAECBAgQIECAAAECBAgQcBDbAAECBAgQIECAAAECBAgQIECAAAECBKYCDuJp8WITIECAAAECBAgQIECAAAECBAgQIEDAQWwDBAgQIECAAAECBAgQIECAAAECBAgQmAo4iKfFi02AAAECBAgQIECAAAECBAgQIECAAAEHsQ0QIECAAAECBAgQIECAAAECBAgQIEBgKuAgnhYvNgECBAgQIECAAAECBAgQIECAAAECBBzENkCAAAECBAgQIECAAAECBAgQIECAAIGpgIN4WrzYBAgQIECAAAECBAgQIECAAAECBAgQcBDbAAECBAgQIECAAAECBAgQIECAAAECBKYCDuJp8WITIECAAAECBAgQIECAAAECBAgQIEDAQWwDBAgQIECAAAECBAgQIECAAAECBAgQmAo4iKfFi02AAAECBAgQIECAAAECBAgQIECAAAEHsQ0QIECAAAECBAgQIECAAAECBAgQIEBgKuAgnhYvNgECBAgQIECAAAECBAgQIECAAAECBBzENkCAAAECBAgQIECAAAECBAgQIECAAIGpgIN4WrzYBAgQIECAAAECBAgQIECAAAECBAgQcBDbAAECBAgQIECAAAECBAgQIECAAAECBKYCDuJp8WITIECAAAECBAgQIECAAAECBAgQIEDAQWwDBAgQIECAAAECBAgQIECAAAECBAgQmAo4iKfFi02AAAECBAgQIECAAAECBAgQIECAAAEHsQ0QIECAAAECBAgQIECAAAECBAgQIEBgKuAgnhYvNgECBAgQIECAAAECBAgQIECAAAECBBzENkCAAAECBAgQIECAAAECBAgQIECAAIGpgIN4WrzYBAgQIECAAAECBAgQIECAAAECBAgQcBDbAAECBAgQIECAAAECBAgQIECAAAECBKYCDuJp8WITIECAAAECBAgQIECAAAECBAgQIEDAQWwDBAgQIECAAAECBAgQIECAAAECBAgQmAo4iKfFi02AAAECBAgQIECAAAECBAgQIECAAAEHsQ0QIECAAAECBAgQIECAAAECBAgQIEBgKuAgnhYvNgECBAgQIECAAAECBAgQIECAAAECBBzENkCAAAECBAgQIECAAAECBAgQIECAAIGpgIN4WrzYBAgQIECAAAECBAgQIECAAAECBAgQcBDbAAECBAgQIECAAAECBAgQIECAAAECBKYCDuJp8WITIECAAAECBAgQIECAAAECBAgQIEDAQWwDBAgQIECAAAECBAgQIECAAAECBAgQmAo4iKfFi02AAAECBAgQIECAAAECBAgQIECAAAEHsQ0QIECAAAECBAgQIECAAAECBAgQIEBgKuAgnhYvNgECBAgQIECAAAECBAgQIECAAAECBBzENkCAAAECBAgQIECAAAECBAgQIECAAIGpgIN4WrzYBAgQIECAAAECBAgQIECAAAECBAgQCGh+qRSsfn6uAAAAAElFTkSuQmCC"/> +</defs> +</svg> diff --git a/apps/wallet/src/ui/assets/images/balance_finder_intro_darkmode.svg b/apps/wallet/src/ui/assets/images/balance_finder_intro_darkmode.svg new file mode 100644 index 00000000000..606b35b3640 --- /dev/null +++ b/apps/wallet/src/ui/assets/images/balance_finder_intro_darkmode.svg @@ -0,0 +1,9 @@ +<svg width="360" height="270" viewBox="0 0 360 270" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> +<path d="M0 0H360V270H0V0Z" fill="url(#pattern0_7485_6388)"/> +<defs> +<pattern id="pattern0_7485_6388" patternContentUnits="objectBoundingBox" width="1" height="1"> +<use xlink:href="#image0_7485_6388" transform="scale(0.000706215 0.00094162)"/> +</pattern> +<image id="image0_7485_6388" width="1416" height="1062" xlink:href="data:image/png;base64,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"/> +</defs> +</svg> diff --git a/apps/wallet/src/ui/index.tsx b/apps/wallet/src/ui/index.tsx index f3ef312b1c3..d3328c97491 100644 --- a/apps/wallet/src/ui/index.tsx +++ b/apps/wallet/src/ui/index.tsx @@ -4,15 +4,14 @@ import '@fontsource-variable/inter'; import '@fontsource-variable/red-hat-mono'; - import { ErrorBoundary } from '_components'; import { initAppType } from '_redux/slices/app'; -import { AppType, getFromLocationSearch } from '_redux/slices/app/AppType'; +import { AppType, getFromLocationSearch } from '_src/ui/app/redux/slices/app/appType'; import { initAmplitude } from '_src/shared/analytics/amplitude'; import { setAttributes } from '_src/shared/experimentation/features'; -import initSentry from '_src/ui/app/helpers/sentry'; +import { initSentry } from '_src/ui/app/helpers'; import store from '_store'; -import { thunkExtras } from '_store/thunk-extras'; +import { thunkExtras } from '_src/ui/app/redux/store/thunkExtras'; import { KioskClientProvider, ThemeProvider } from '@iota/core'; import { GrowthBookProvider } from '@growthbook/growthbook-react'; import { IotaClientProvider } from '@iota/dapp-kit'; @@ -22,15 +21,14 @@ import { Fragment, StrictMode } from 'react'; import { createRoot } from 'react-dom/client'; import { Provider } from 'react-redux'; import { HashRouter } from 'react-router-dom'; - -import App from './app'; -import { walletApiProvider } from './app/ApiProvider'; +import { App } from './app'; +import { walletApiProvider } from './app/apiProvider'; import { AccountsFormProvider } from './app/components/accounts/AccountsFormContext'; import { UnlockAccountProvider } from './app/components/accounts/UnlockAccountContext'; import { IotaLedgerClientProvider } from './app/components/ledger/IotaLedgerClientProvider'; -import { growthbook } from './app/experimentation/feature-gating'; +import { growthbook } from './app/experimentation/featureGating'; import { persister, queryClient } from './app/helpers/queryClient'; -import { useAppSelector } from './app/hooks'; +import { useAppSelector } from '_hooks'; import './styles/global.scss'; import 'bootstrap-icons/font/bootstrap-icons.scss'; diff --git a/apps/wallet/tailwind.config.ts b/apps/wallet/tailwind.config.ts index 088b09b22c6..e837e56436f 100644 --- a/apps/wallet/tailwind.config.ts +++ b/apps/wallet/tailwind.config.ts @@ -5,7 +5,7 @@ import { type Config } from 'tailwindcss'; import animatePlugin from 'tailwindcss-animate'; // Note: exception for the tailwind preset import -import uiKitStaticPreset from '../../apps/ui-kit/src/lib/tailwind/static.preset'; +import uiKitStaticPreset from '../../apps/ui-kit/src/lib/tailwind/static.presets'; export default { presets: [uiKitStaticPreset], diff --git a/apps/wallet/tests/balanceChanges.spec.ts b/apps/wallet/tests/balance-changes.spec.ts similarity index 100% rename from apps/wallet/tests/balanceChanges.spec.ts rename to apps/wallet/tests/balance-changes.spec.ts diff --git a/apps/wallet/tests/demo-app/src/index.tsx b/apps/wallet/tests/demo-app/src/index.tsx index 8ee934abd37..09f32b3a042 100644 --- a/apps/wallet/tests/demo-app/src/index.tsx +++ b/apps/wallet/tests/demo-app/src/index.tsx @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -import { type IotaWallet } from '_src/dapp-interface/WalletStandardInterface'; +import { type IotaWallet } from '_src/dapp-interface/walletStandardInterface'; import { Transaction } from '@iota/iota-sdk/transactions'; import { getWallets, ReadonlyWalletAccount, type Wallet } from '@iota/wallet-standard'; import { useEffect, useState } from 'react'; diff --git a/apps/wallet/tests/sites-to-cs-api.spec.ts b/apps/wallet/tests/sites-to-cs-api.spec.ts index 3ed5774e19f..b4e2ec028e5 100644 --- a/apps/wallet/tests/sites-to-cs-api.spec.ts +++ b/apps/wallet/tests/sites-to-cs-api.spec.ts @@ -5,7 +5,7 @@ import { type Page } from '@playwright/test'; import { expect, test } from './fixtures'; import { createWallet } from './utils/auth'; -import { demoDappConnect } from './utils/dapp-connect'; +import { demoDappConnect } from './utils/dappConnect'; import dotenv from 'dotenv'; dotenv.config(); diff --git a/apps/wallet/tests/sites-to-cs-messaging.spec.ts b/apps/wallet/tests/sites-to-cs-messaging.spec.ts index aac667175db..eca803c5263 100644 --- a/apps/wallet/tests/sites-to-cs-messaging.spec.ts +++ b/apps/wallet/tests/sites-to-cs-messaging.spec.ts @@ -5,7 +5,7 @@ import { type Page } from '@playwright/test'; import { expect, test } from './fixtures'; import { createWallet } from './utils/auth'; -import { demoDappConnect } from './utils/dapp-connect'; +import { demoDappConnect } from './utils/dappConnect'; import { generateWalletMessageStreamIdentifiers } from '../src/shared/utils/generateWalletMessageStreamIdentifiers'; import dotenv from 'dotenv'; diff --git a/apps/wallet/tests/utils/dapp-connect.ts b/apps/wallet/tests/utils/dappConnect.ts similarity index 100% rename from apps/wallet/tests/utils/dapp-connect.ts rename to apps/wallet/tests/utils/dappConnect.ts diff --git a/bridge/evm/contracts/BridgeConfig.sol b/bridge/evm/contracts/BridgeConfig.sol index d9a9069976b..4a10ee5e3c5 100644 --- a/bridge/evm/contracts/BridgeConfig.sol +++ b/bridge/evm/contracts/BridgeConfig.sol @@ -8,7 +8,7 @@ import "./interfaces/IBridgeConfig.sol"; /// @title BridgeConfig /// @notice This contract manages a registry of supported tokens and supported chain IDs for the IotaBridge. -/// It also provides functions to convert token amounts to Iota decimal adjusted amounts and vice versa. +/// It also provides functions to convert token amounts to IOTA decimal adjusted amounts and vice versa. contract BridgeConfig is IBridgeConfig, CommitteeUpgradeable { /* ========== STATE VARIABLES ========== */ @@ -166,11 +166,11 @@ contract BridgeConfig is IBridgeConfig, CommitteeUpgradeable { bool native ) private { require(tokenAddress != address(0), "BridgeConfig: Invalid token address"); - require(iotaDecimal > 0, "BridgeConfig: Invalid Iota decimal"); + require(iotaDecimal > 0, "BridgeConfig: Invalid IOTA decimal"); require(tokenPrice > 0, "BridgeConfig: Invalid token price"); uint8 erc20Decimals = IERC20Metadata(tokenAddress).decimals(); - require(erc20Decimals >= iotaDecimal, "BridgeConfig: Invalid Iota decimal"); + require(erc20Decimals >= iotaDecimal, "BridgeConfig: Invalid IOTA decimal"); supportedTokens[tokenID] = Token(tokenAddress, iotaDecimal, native); tokenPrices[tokenID] = tokenPrice; diff --git a/bridge/evm/contracts/IotaBridge.sol b/bridge/evm/contracts/IotaBridge.sol index cd4362d0765..dc1fe6351e0 100644 --- a/bridge/evm/contracts/IotaBridge.sol +++ b/bridge/evm/contracts/IotaBridge.sol @@ -16,7 +16,7 @@ import "./interfaces/IWETH9.sol"; /// @title IotaBridge /// @notice This contract implements a token bridge that enables users to deposit and withdraw /// supported tokens to and from other chains. The bridge supports the transfer of Ethereum and ERC20 -/// tokens. Bridge operations are managed by a committee of Iota validators that are responsible +/// tokens. Bridge operations are managed by a committee of IOTA validators that are responsible /// for verifying and processing bridge messages. The bridge is designed to be upgradeable and /// can be paused in case of an emergency. The bridge also enforces limits on the amount of /// assets that can be withdrawn to prevent abuse. @@ -131,7 +131,7 @@ contract IotaBridge is IIotaBridge, CommitteeUpgradeable, PausableUpgradeable { /// have approved this contract to transfer the given token. /// @param tokenID The ID of the token to be bridged. /// @param amount The amount of tokens to be bridged. - /// @param recipientAddress The address on the Iota chain where the tokens will be sent. + /// @param recipientAddress The address on the IOTA chain where the tokens will be sent. /// @param destinationChainID The ID of the destination chain. function bridgeERC20( uint8 tokenID, diff --git a/bridge/evm/contracts/interfaces/IIotaBridge.sol b/bridge/evm/contracts/interfaces/IIotaBridge.sol index f7f70a307f6..ad874d85ee7 100644 --- a/bridge/evm/contracts/interfaces/IIotaBridge.sol +++ b/bridge/evm/contracts/interfaces/IIotaBridge.sol @@ -3,14 +3,14 @@ pragma solidity ^0.8.20; /// @title IIotaBridge -/// @dev Interface for the Iota Bridge contract. +/// @dev Interface for the IOTA Bridge contract. interface IIotaBridge { /// @notice Emitted when tokens are deposited to be bridged. /// @param sourceChainID The ID of the source chain (this chain). /// @param nonce The nonce of the transaction on source chain. /// @param destinationChainID The ID of the destination chain. /// @param tokenID The code of the token. - /// @param iotaAdjustedAmount The amount of tokens to transfer, adjusted for Iota decimals. + /// @param iotaAdjustedAmount The amount of tokens to transfer, adjusted for IOTA decimals. /// @param senderAddress The address of the sender. /// @param recipientAddress The address of the sender. event TokensDeposited( diff --git a/bridge/evm/contracts/utils/BridgeUtils.sol b/bridge/evm/contracts/utils/BridgeUtils.sol index 2b094549f6b..9db8093cc02 100644 --- a/bridge/evm/contracts/utils/BridgeUtils.sol +++ b/bridge/evm/contracts/utils/BridgeUtils.sol @@ -3,7 +3,7 @@ pragma solidity ^0.8.20; /// @title BridgeUtils -/// @notice This library defines the message format and constants for the Iota native bridge. It also +/// @notice This library defines the message format and constants for the IOTA native bridge. It also /// provides functions to encode and decode bridge messages and their payloads. /// @dev This library only utilizes internal functions to enable upgradeability via the OpenZeppelin /// UUPS proxy pattern (external libraries are not supported). @@ -118,11 +118,11 @@ library BridgeUtils { } } - /// @notice Converts the provided token amount to the Iota decimal adjusted amount. + /// @notice Converts the provided token amount to the IOTA decimal adjusted amount. /// @param erc20Decimal The erc20 decimal value for the token. /// @param iotaDecimal The iota decimal value for the token. - /// @param amount The ERC20 amount of the tokens to convert to Iota. - /// @return Iota converted amount. + /// @param amount The ERC20 amount of the tokens to convert to IOTA. + /// @return IOTA converted amount. function convertERC20ToIotaDecimal(uint8 erc20Decimal, uint8 iotaDecimal, uint256 amount) internal pure @@ -136,7 +136,7 @@ library BridgeUtils { return uint64(amount); } - require(erc20Decimal > iotaDecimal, "BridgeUtils: Invalid Iota decimal"); + require(erc20Decimal > iotaDecimal, "BridgeUtils: Invalid IOTA decimal"); // Difference in decimal places uint256 factor = 10 ** (erc20Decimal - iotaDecimal); @@ -151,10 +151,10 @@ library BridgeUtils { return uint64(amount); } - /// @notice Converts the provided Iota decimal adjusted amount to the ERC20 token amount. + /// @notice Converts the provided IOTA decimal adjusted amount to the ERC20 token amount. /// @param erc20Decimal The erc20 decimal value for the token. /// @param iotaDecimal The iota decimal value for the token. - /// @param amount The Iota amount of the tokens to convert to ERC20. + /// @param amount The IOTA amount of the tokens to convert to ERC20. /// @return ERC20 converted amount. function convertIotaToERC20Decimal(uint8 erc20Decimal, uint8 iotaDecimal, uint64 amount) internal @@ -165,7 +165,7 @@ library BridgeUtils { return uint256(amount); } - require(erc20Decimal > iotaDecimal, "BridgeUtils: Invalid Iota decimal"); + require(erc20Decimal > iotaDecimal, "BridgeUtils: Invalid IOTA decimal"); // Difference in decimal places uint256 factor = 10 ** (erc20Decimal - iotaDecimal); @@ -176,7 +176,7 @@ library BridgeUtils { /// @dev The function will revert if the payload length is invalid. /// TokenTransfer payload is 64 bytes. /// byte 0 : sender address length - /// bytes 1-32 : sender address (as we only support Iota now, it has to be 32 bytes long) + /// bytes 1-32 : sender address (as we only support IOTA now, it has to be 32 bytes long) /// bytes 33 : target chain id /// byte 34 : target address length /// bytes 35-54 : target address @@ -195,7 +195,7 @@ library BridgeUtils { require( senderAddressLength == 32, - "BridgeUtils: Invalid sender address length, Iota address must be 32 bytes" + "BridgeUtils: Invalid sender address length, IOTA address must be 32 bytes" ); // used to offset already read bytes @@ -225,9 +225,9 @@ library BridgeUtils { // why `add(recipientAddressLength, offset)`? // At this point, offset = 35, recipientAddressLength = 20. `mload(add(payload, 55))` - // reads the next 32 bytes from bytes 23 in paylod, because the first 32 bytes + // reads the next 32 bytes from bytes 23 in payload, because the first 32 bytes // of payload stores its length. So in reality, bytes 23 - 54 is loaded. During - // casting to address (20 bytes), the least sigificiant bytes are retained, namely + // casting to address (20 bytes), the least significant bytes are retained, namely // `recipientAddress` is bytes 35-54 assembly { recipientAddress := mload(add(_payload, add(recipientAddressLength, offset))) @@ -245,9 +245,9 @@ library BridgeUtils { // Why `add(amountLength, offset)`? // At this point, offset = 56, amountLength = 8. `mload(add(payload, 64))` - // reads the next 32 bytes from bytes 32 in paylod, because the first 32 bytes + // reads the next 32 bytes from bytes 32 in payload, because the first 32 bytes // of payload stores its length. So in reality, bytes 32 - 63 is loaded. During - // casting to uint64 (8 bytes), the least sigificiant bytes are retained, namely + // casting to uint64 (8 bytes), the least significant bytes are retained, namely // `recipientAddress` is bytes 56-63 assembly { amount := mload(add(_payload, add(amountLength, offset))) @@ -391,7 +391,7 @@ library BridgeUtils { /// @return native whether the token is native to the chain. /// @return tokenIDs the token ID to be added. /// @return tokenAddresses the address of the token to be added. - /// @return iotaDecimals the Iota decimal places of the tokens to be added. + /// @return iotaDecimals the IOTA decimal places of the tokens to be added. /// @return tokenPrices the price of the tokens to be added. function decodeAddTokensPayload(bytes memory _payload) internal diff --git a/bridge/evm/script/deploy_bridge.s.sol b/bridge/evm/script/deploy_bridge.s.sol index 5f15f006d00..5397073c3e8 100644 --- a/bridge/evm/script/deploy_bridge.s.sol +++ b/bridge/evm/script/deploy_bridge.s.sol @@ -68,7 +68,7 @@ contract DeployBridge is Script { } // deploy bridge config - // price of Iota (id = 0) should not be included in tokenPrices + // price of IOTA (id = 0) should not be included in tokenPrices require( deployConfig.supportedTokens.length == deployConfig.tokenPrices.length, "supportedTokens.length + 1 != tokenPrices.length" @@ -149,7 +149,7 @@ contract DeployBridge is Script { uint8[] memory _destinationChains = new uint8[](1); _destinationChains[0] = 1; - // deploy Iota Bridge ======================================================================== + // deploy IOTA Bridge ======================================================================== address iotaBridge = Upgrades.deployUUPSProxy( "IotaBridge.sol", diff --git a/bridge/evm/test/BridgeConfigTest.t.sol b/bridge/evm/test/BridgeConfigTest.t.sol index 32eceea61fb..f87d64c5c76 100644 --- a/bridge/evm/test/BridgeConfigTest.t.sol +++ b/bridge/evm/test/BridgeConfigTest.t.sol @@ -195,7 +195,7 @@ contract BridgeConfigTest is BridgeBaseTest { signatures[3] = getSignature(messageHash, committeeMemberPkD); // add token should fail because the iota decimal is greater than the eth decimal - vm.expectRevert(bytes("BridgeConfig: Invalid Iota decimal")); + vm.expectRevert(bytes("BridgeConfig: Invalid IOTA decimal")); config.addTokensWithSignatures(signatures, message); } diff --git a/bridge/evm/test/BridgeUtilsTest.t.sol b/bridge/evm/test/BridgeUtilsTest.t.sol index c9e93074d32..8a16fd71d46 100644 --- a/bridge/evm/test/BridgeUtilsTest.t.sol +++ b/bridge/evm/test/BridgeUtilsTest.t.sol @@ -17,12 +17,12 @@ contract BridgeUtilsTest is BridgeBaseTest { } function testConvertERC20ToIotaDecimalInvalidIotaDecimal() public { - vm.expectRevert(bytes("BridgeUtils: Invalid Iota decimal")); + vm.expectRevert(bytes("BridgeUtils: Invalid IOTA decimal")); BridgeUtils.convertERC20ToIotaDecimal(10, 11, 100); } function testconvertIotaToERC20DecimalInvalidIotaDecimal() public { - vm.expectRevert(bytes("BridgeUtils: Invalid Iota decimal")); + vm.expectRevert(bytes("BridgeUtils: Invalid IOTA decimal")); BridgeUtils.convertIotaToERC20Decimal(10, 11, 100); } diff --git a/bridge/evm/test/IotaBridgeTest.t.sol b/bridge/evm/test/IotaBridgeTest.t.sol index f21a8ff7969..11e26000e37 100644 --- a/bridge/evm/test/IotaBridgeTest.t.sol +++ b/bridge/evm/test/IotaBridgeTest.t.sol @@ -103,7 +103,7 @@ contract IotaBridgeTest is BridgeBaseTest, IIotaBridge { recipientAddressLength: 0, recipientAddress: bridgerA, tokenID: BridgeUtils.ETH, - // This is Iota amount (eth decimal 8) + // This is IOTA amount (eth decimal 8) amount: 100_000_000 }); BridgeUtils.Message memory message = BridgeUtils.Message({ @@ -131,7 +131,7 @@ contract IotaBridgeTest is BridgeBaseTest, IIotaBridge { recipientAddressLength: 0, recipientAddress: bridgerA, tokenID: BridgeUtils.ETH, - // This is Iota amount (eth decimal 8) + // This is IOTA amount (eth decimal 8) amount: 100_000_000 }); BridgeUtils.Message memory message = BridgeUtils.Message({ diff --git a/chocolatey/iota.nuspec b/chocolatey/iota.nuspec index 173e11fe35d..c547358e932 100644 --- a/chocolatey/iota.nuspec +++ b/chocolatey/iota.nuspec @@ -6,17 +6,17 @@ enclosed in quotation marks, you should use an editor that supports UTF-8, not t <id>iota</id> <version>$version$</version> <owners>iota</owners> - <title>Main Iota Binary + Main IOTA Binary iota https://iota.org/ - https://github.com/iotaledger/iota/blob/main/LICENSE + https://github.com/iotaledger/iota/blob/develop/LICENSE https://assets-global.website-files.com/6425f546844727ce5fb9e5ab/643775f4a15c9a9e10426daa_Iota_Favicon_256.png https://github.com/iotaledger/iota/ https://github.com/iotaledger/iota/issues iota https://community.chocolatey.org/packages/iota.portable Run a local iota binary - Iota is the first internet-scale programmable blockchain platform + IOTA is the first internet-scale programmable blockchain platform https://github.com/iotaledger/iota/releases/tag/mainnet-v$version$ diff --git a/consensus/config/src/committee.rs b/consensus/config/src/committee.rs index 9b809a614cc..0793d9d8b8b 100644 --- a/consensus/config/src/committee.rs +++ b/consensus/config/src/committee.rs @@ -16,7 +16,7 @@ use crate::{AuthorityPublicKey, NetworkPublicKey, ProtocolPublicKey}; pub type Epoch = u64; /// Voting power of an authority, roughly proportional to the actual amount of -/// Iota staked by the authority. +/// IOTA staked by the authority. /// Total stake / voting power of all authorities should sum to 10,000. pub type Stake = u64; @@ -58,8 +58,8 @@ impl Committee { } } - /// ----------------------------------------------------------------------- - /// Accessors to Committee fields. + // ----------------------------------------------------------------------- + // Accessors to Committee fields. pub fn epoch(&self) -> Epoch { self.epoch @@ -92,8 +92,8 @@ impl Committee { .map(|(i, a)| (AuthorityIndex(i as u32), a)) } - /// ----------------------------------------------------------------------- - /// Helpers for Committee properties. + // ----------------------------------------------------------------------- + // Helpers for Committee properties. /// Returns true if the provided stake has reached quorum (2f+1). pub fn reached_quorum(&self, stake: Stake) -> bool { diff --git a/consensus/config/src/parameters.rs b/consensus/config/src/parameters.rs index 61d2b3eba7f..be777fbbd27 100644 --- a/consensus/config/src/parameters.rs +++ b/consensus/config/src/parameters.rs @@ -9,7 +9,7 @@ use serde::{Deserialize, Serialize}; /// Operational configurations of a consensus authority. /// /// All fields should tolerate inconsistencies among authorities, without -/// affecting safety of the protocol. Otherwise, they need to be part of Iota +/// affecting safety of the protocol. Otherwise, they need to be part of IOTA /// protocol config or epoch state on-chain. /// /// NOTE: fields with default values are specified in the serde default diff --git a/consensus/core/src/authority_node.rs b/consensus/core/src/authority_node.rs index 70f81c271fb..7c66745bc4e 100644 --- a/consensus/core/src/authority_node.rs +++ b/consensus/core/src/authority_node.rs @@ -11,7 +11,7 @@ use prometheus::Registry; use tracing::{info, warn}; use crate::{ - CommitConsumer, + CommitConsumer, CommitConsumerMonitor, authority_service::AuthorityService, block_manager::BlockManager, block_verifier::SignedBlockVerifier, @@ -33,7 +33,7 @@ use crate::{ transaction::{TransactionClient, TransactionConsumer, TransactionVerifier}, }; -/// ConsensusAuthority is used by Iota to manage the lifetime of AuthorityNode. +/// ConsensusAuthority is used by IOTA to manage the lifetime of AuthorityNode. /// It hides the details of the implementation from the caller, /// MysticetiManager. pub enum ConsensusAuthority { @@ -93,6 +93,12 @@ impl ConsensusAuthority { } } + pub async fn replay_complete(&self) { + match self { + Self::WithTonic(authority) => authority.replay_complete().await, + } + } + #[cfg(test)] fn context(&self) -> &Arc { match self { @@ -116,6 +122,8 @@ where start_time: Instant, transaction_client: Arc, synchronizer: Arc, + commit_consumer_monitor: Arc, + commit_syncer_handle: CommitSyncerHandle, leader_timeout_handle: LeaderTimeoutTaskHandle, core_thread_handle: CoreThreadHandle, @@ -187,6 +195,9 @@ where let store_path = context.parameters.db_path.as_path().to_str().unwrap(); let store = Arc::new(RocksDBStore::new(store_path)); let dag_state = Arc::new(RwLock::new(DagState::new(context.clone(), store.clone()))); + + let highest_known_commit_at_startup = dag_state.read().last_commit_index(); + let sync_last_known_own_block = boot_counter == 0 && dag_state.read().highest_accepted_round() == 0 && !context @@ -209,6 +220,8 @@ where )); let commit_consumer_monitor = commit_consumer.monitor(); + commit_consumer_monitor + .set_highest_observed_commit_at_startup(highest_known_commit_at_startup); let commit_observer = CommitObserver::new( context.clone(), commit_consumer, @@ -254,7 +267,7 @@ where context.clone(), core_dispatcher.clone(), commit_vote_monitor.clone(), - commit_consumer_monitor, + commit_consumer_monitor.clone(), network_client.clone(), block_verifier.clone(), dag_state.clone(), @@ -302,6 +315,7 @@ where transaction_client: Arc::new(tx_client), synchronizer, commit_syncer_handle, + commit_consumer_monitor, leader_timeout_handle, core_thread_handle, broadcaster, @@ -352,6 +366,10 @@ where pub(crate) fn transaction_client(&self) -> Arc { self.transaction_client.clone() } + + pub(crate) async fn replay_complete(&self) { + self.commit_consumer_monitor.replay_complete().await; + } } #[cfg(test)] diff --git a/consensus/core/src/block.rs b/consensus/core/src/block.rs index c08bcce1f46..fbe1ae2fb9c 100644 --- a/consensus/core/src/block.rs +++ b/consensus/core/src/block.rs @@ -34,7 +34,7 @@ pub(crate) const GENESIS_ROUND: Round = 0; /// Block proposal as epoch UNIX timestamp in milliseconds. pub type BlockTimestampMs = u64; -/// Iota transaction in serialised bytes +/// IOTA transaction in serialised bytes #[derive(Clone, Eq, PartialEq, Serialize, Deserialize, Default, Debug)] pub struct Transaction { data: Bytes, diff --git a/consensus/core/src/commit.rs b/consensus/core/src/commit.rs index fc2221a84b0..36735cfd771 100644 --- a/consensus/core/src/commit.rs +++ b/consensus/core/src/commit.rs @@ -308,7 +308,7 @@ pub struct CommittedSubDag { /// a index incremented by 1. pub commit_ref: CommitRef, /// Optional scores that are provided as part of the consensus output to - /// Iota that can then be used by Iota for future submission to + /// IOTA that can then be used by IOTA for future submission to /// consensus. pub reputation_scores_desc: Vec<(AuthorityIndex, u64)>, } diff --git a/consensus/core/src/commit_consumer.rs b/consensus/core/src/commit_consumer.rs index aca8df61bba..6147f7d88f8 100644 --- a/consensus/core/src/commit_consumer.rs +++ b/consensus/core/src/commit_consumer.rs @@ -2,9 +2,10 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -use std::sync::{Arc, atomic::AtomicU32}; +use std::sync::{Arc, RwLock}; use iota_metrics::monitored_mpsc::UnboundedSender; +use tokio::sync::watch; use crate::{CommitIndex, CommittedSubDag}; @@ -39,24 +40,65 @@ impl CommitConsumer { } pub struct CommitConsumerMonitor { - highest_handled_commit: AtomicU32, + // highest commit that has been handled by IOTA + highest_handled_commit: watch::Sender, + + // the highest commit found in local storage at startup + highest_observed_commit_at_startup: RwLock, } impl CommitConsumerMonitor { pub(crate) fn new(last_handled_commit: CommitIndex) -> Self { Self { - highest_handled_commit: AtomicU32::new(last_handled_commit), + highest_handled_commit: watch::Sender::new(last_handled_commit), + highest_observed_commit_at_startup: RwLock::new(0), } } pub(crate) fn highest_handled_commit(&self) -> CommitIndex { - self.highest_handled_commit - .load(std::sync::atomic::Ordering::Acquire) + *self.highest_handled_commit.borrow() } pub fn set_highest_handled_commit(&self, highest_handled_commit: CommitIndex) { self.highest_handled_commit - .store(highest_handled_commit, std::sync::atomic::Ordering::Release); + .send_replace(highest_handled_commit); + } + + pub fn highest_observed_commit_at_startup(&self) -> CommitIndex { + *self.highest_observed_commit_at_startup.read().unwrap() + } + + pub fn set_highest_observed_commit_at_startup( + &self, + highest_observed_commit_at_startup: CommitIndex, + ) { + let highest_handled_commit = self.highest_handled_commit(); + assert!( + highest_observed_commit_at_startup >= highest_handled_commit, + "we cannot have handled a commit that we do not know about: {} < {}", + highest_observed_commit_at_startup, + highest_handled_commit, + ); + + let mut commit = self.highest_observed_commit_at_startup.write().unwrap(); + + assert!( + *commit == 0, + "highest_known_commit_at_startup can only be set once" + ); + *commit = highest_observed_commit_at_startup; + } + + pub(crate) async fn replay_complete(&self) { + let highest_observed_commit_at_startup = self.highest_observed_commit_at_startup(); + let mut rx = self.highest_handled_commit.subscribe(); + loop { + let highest_handled = *rx.borrow_and_update(); + if highest_handled >= highest_observed_commit_at_startup { + return; + } + rx.changed().await.unwrap(); + } } } diff --git a/consensus/core/src/commit_syncer.rs b/consensus/core/src/commit_syncer.rs index ef6ce101cb3..8dec50c2a83 100644 --- a/consensus/core/src/commit_syncer.rs +++ b/consensus/core/src/commit_syncer.rs @@ -15,7 +15,7 @@ //! when blocks are included in commits with >= 2f+1 certifiers by stake, these //! blocks must have passed verifications on some honest validators, so //! re-verifying them is unnecessary. In fact, the quorum certified commits -//! themselves can be trusted to be sent to Iota directly, but for simplicity +//! themselves can be trusted to be sent to IOTA directly, but for simplicity //! this is not done. Blocks from trusted commits still go through Core and //! committer. //! diff --git a/consensus/core/src/linearizer.rs b/consensus/core/src/linearizer.rs index 54f20e7f537..7ebfba9cc8d 100644 --- a/consensus/core/src/linearizer.rs +++ b/consensus/core/src/linearizer.rs @@ -158,7 +158,7 @@ impl Linearizer { committed_sub_dags.push(sub_dag); } - // Committed blocks must be persisted to storage before sending them to Iota and + // Committed blocks must be persisted to storage before sending them to IOTA and // executing their transactions. // Commit metadata can be persisted more lazily because they are recoverable. // Uncommitted blocks can wait to persist too. diff --git a/consensus/core/src/network/metrics_layer.rs b/consensus/core/src/network/metrics_layer.rs index 01c35cc31c5..c8d4d962102 100644 --- a/consensus/core/src/network/metrics_layer.rs +++ b/consensus/core/src/network/metrics_layer.rs @@ -2,15 +2,15 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 +//! Tower layer adapters that allow specifying callbacks for request and +//! response handling can be implemented for different networking stacks. + use std::sync::Arc; use prometheus::HistogramTimer; use super::metrics::NetworkRouteMetrics; -/// Tower layer adapters that allow specifying callbacks for request and -/// response handling can be implemented for different networking stacks. - pub(crate) trait SizedRequest { fn size(&self) -> usize; fn route(&self) -> String; diff --git a/consensus/core/src/test_dag_parser.rs b/consensus/core/src/test_dag_parser.rs index 486db4ef36e..f00c50a6f75 100644 --- a/consensus/core/src/test_dag_parser.rs +++ b/consensus/core/src/test_dag_parser.rs @@ -52,7 +52,6 @@ use crate::{ /// dag_builder.print(); // print the parsed DAG /// dag_builder.persist_all_blocks(dag_state.clone()); // persist all blocks to DagState /// ``` - pub(crate) fn parse_dag(dag_string: &str) -> IResult<&str, DagBuilder> { let (input, _) = tuple((tag("DAG"), multispace0, char('{')))(dag_string)?; diff --git a/consensus/core/src/transaction.rs b/consensus/core/src/transaction.rs index f22eeeba635..fb8dbb8c99f 100644 --- a/consensus/core/src/transaction.rs +++ b/consensus/core/src/transaction.rs @@ -226,7 +226,7 @@ impl TransactionClient { } } -/// `TransactionVerifier` implementation is supplied by Iota to validate +/// `TransactionVerifier` implementation is supplied by IOTA to validate /// transactions in a block, before acceptance of the block. pub trait TransactionVerifier: Send + Sync + 'static { /// Determines if this batch can be voted on diff --git a/crates/iota-adapter-transactional-tests/Cargo.toml b/crates/iota-adapter-transactional-tests/Cargo.toml index cbbf533c426..1112a3474de 100644 --- a/crates/iota-adapter-transactional-tests/Cargo.toml +++ b/crates/iota-adapter-transactional-tests/Cargo.toml @@ -5,7 +5,7 @@ authors = ["IOTA Foundation "] edition = "2021" license = "Apache-2.0" publish = false -description = "Transactional tests for Iota Adapter" +description = "Transactional tests for IOTA Adapter" [dev-dependencies] # external dependencies diff --git a/crates/iota-adapter-transactional-tests/tests/entry_points/generic_by_ref_invalid.exp b/crates/iota-adapter-transactional-tests/tests/entry_points/generic_by_ref_invalid.exp index 82813a5d23d..af712cd7028 100644 --- a/crates/iota-adapter-transactional-tests/tests/entry_points/generic_by_ref_invalid.exp +++ b/crates/iota-adapter-transactional-tests/tests/entry_points/generic_by_ref_invalid.exp @@ -5,20 +5,20 @@ A: object(0,0) task 1, lines 9-12: //# publish -Error: Transaction Effects Status: Iota Move Bytecode Verification Error. Please run the Iota Move Verifier for more information. +Error: Transaction Effects Status: IOTA Move Bytecode Verification Error. Please run the IOTA Move Verifier for more information. Execution Error: ExecutionError: ExecutionError { inner: ExecutionErrorInner { kind: IotaMoveVerificationError, source: Some("Invalid entry point parameter type. Expected primitive or object type. Got: &T0"), command: Some(0) } } task 2, lines 14-17: //# publish -Error: Transaction Effects Status: Iota Move Bytecode Verification Error. Please run the Iota Move Verifier for more information. +Error: Transaction Effects Status: IOTA Move Bytecode Verification Error. Please run the IOTA Move Verifier for more information. Execution Error: ExecutionError: ExecutionError { inner: ExecutionErrorInner { kind: IotaMoveVerificationError, source: Some("Invalid entry point parameter type. Expected primitive or object type. Got: &mut T0"), command: Some(0) } } task 3, lines 19-22: //# publish -Error: Transaction Effects Status: Iota Move Bytecode Verification Error. Please run the Iota Move Verifier for more information. +Error: Transaction Effects Status: IOTA Move Bytecode Verification Error. Please run the IOTA Move Verifier for more information. Execution Error: ExecutionError: ExecutionError { inner: ExecutionErrorInner { kind: IotaMoveVerificationError, source: Some("Invalid entry point parameter type. Expected primitive or object type. Got: &T0"), command: Some(0) } } task 4, lines 24-27: //# publish -Error: Transaction Effects Status: Iota Move Bytecode Verification Error. Please run the Iota Move Verifier for more information. +Error: Transaction Effects Status: IOTA Move Bytecode Verification Error. Please run the IOTA Move Verifier for more information. Execution Error: ExecutionError: ExecutionError { inner: ExecutionErrorInner { kind: IotaMoveVerificationError, source: Some("Invalid entry point parameter type. Expected primitive or object type. Got: &mut T0"), command: Some(0) } } diff --git a/crates/iota-adapter-transactional-tests/tests/enums/enum_with_key_only.exp b/crates/iota-adapter-transactional-tests/tests/enums/enum_with_key_only.exp index 10c7961e704..e676ae72cd3 100644 --- a/crates/iota-adapter-transactional-tests/tests/enums/enum_with_key_only.exp +++ b/crates/iota-adapter-transactional-tests/tests/enums/enum_with_key_only.exp @@ -2,7 +2,7 @@ processed 6 tasks task 1, lines 7-38: //# publish -Error: Transaction Effects Status: Iota Move Bytecode Verification Error. Please run the Iota Move Verifier for more information. +Error: Transaction Effects Status: IOTA Move Bytecode Verification Error. Please run the IOTA Move Verifier for more information. Execution Error: ExecutionError: ExecutionError { inner: ExecutionErrorInner { kind: IotaMoveVerificationError, source: Some("Enum X cannot have the 'key' ability. Enums cannot have the 'key' ability."), command: Some(0) } } task 2, line 40: diff --git a/crates/iota-adapter-transactional-tests/tests/enums/enum_with_key_only_uid_field.exp b/crates/iota-adapter-transactional-tests/tests/enums/enum_with_key_only_uid_field.exp index 1bf0ae5713c..3289f2895a1 100644 --- a/crates/iota-adapter-transactional-tests/tests/enums/enum_with_key_only_uid_field.exp +++ b/crates/iota-adapter-transactional-tests/tests/enums/enum_with_key_only_uid_field.exp @@ -2,7 +2,7 @@ processed 6 tasks task 1, lines 7-46: //# publish -Error: Transaction Effects Status: Iota Move Bytecode Verification Error. Please run the Iota Move Verifier for more information. +Error: Transaction Effects Status: IOTA Move Bytecode Verification Error. Please run the IOTA Move Verifier for more information. Execution Error: ExecutionError: ExecutionError { inner: ExecutionErrorInner { kind: IotaMoveVerificationError, source: Some("Enum X cannot have the 'key' ability. Enums cannot have the 'key' ability."), command: Some(0) } } task 2, line 48: diff --git a/crates/iota-adapter-transactional-tests/tests/enums/enum_with_key_store.exp b/crates/iota-adapter-transactional-tests/tests/enums/enum_with_key_store.exp index d35bae25d13..94035a4ef9d 100644 --- a/crates/iota-adapter-transactional-tests/tests/enums/enum_with_key_store.exp +++ b/crates/iota-adapter-transactional-tests/tests/enums/enum_with_key_store.exp @@ -2,7 +2,7 @@ processed 11 tasks task 1, lines 7-89: //# publish -Error: Transaction Effects Status: Iota Move Bytecode Verification Error. Please run the Iota Move Verifier for more information. +Error: Transaction Effects Status: IOTA Move Bytecode Verification Error. Please run the IOTA Move Verifier for more information. Execution Error: ExecutionError: ExecutionError { inner: ExecutionErrorInner { kind: IotaMoveVerificationError, source: Some("Enum X cannot have the 'key' ability. Enums cannot have the 'key' ability."), command: Some(0) } } task 2, line 91: diff --git a/crates/iota-adapter-transactional-tests/tests/enums/enum_with_key_store_uid_field.exp b/crates/iota-adapter-transactional-tests/tests/enums/enum_with_key_store_uid_field.exp index 01175813bf2..c8fc8b16efb 100644 --- a/crates/iota-adapter-transactional-tests/tests/enums/enum_with_key_store_uid_field.exp +++ b/crates/iota-adapter-transactional-tests/tests/enums/enum_with_key_store_uid_field.exp @@ -2,7 +2,7 @@ processed 11 tasks task 1, lines 7-105: //# publish -Error: Transaction Effects Status: Iota Move Bytecode Verification Error. Please run the Iota Move Verifier for more information. +Error: Transaction Effects Status: IOTA Move Bytecode Verification Error. Please run the IOTA Move Verifier for more information. Execution Error: ExecutionError: ExecutionError { inner: ExecutionErrorInner { kind: IotaMoveVerificationError, source: Some("Enum X cannot have the 'key' ability. Enums cannot have the 'key' ability."), command: Some(0) } } task 2, line 107: diff --git a/crates/iota-adapter-transactional-tests/tests/init/entry_new.exp b/crates/iota-adapter-transactional-tests/tests/init/entry_new.exp index 7a6336cfa87..e15ba170bd5 100644 --- a/crates/iota-adapter-transactional-tests/tests/init/entry_new.exp +++ b/crates/iota-adapter-transactional-tests/tests/init/entry_new.exp @@ -2,7 +2,7 @@ processed 3 tasks task 1, lines 9-18: //# publish -Error: Transaction Effects Status: Iota Move Bytecode Verification Error. Please run the Iota Move Verifier for more information. +Error: Transaction Effects Status: IOTA Move Bytecode Verification Error. Please run the IOTA Move Verifier for more information. Execution Error: ExecutionError: ExecutionError { inner: ExecutionErrorInner { kind: IotaMoveVerificationError, source: Some("_::m. 'init' cannot be 'entry'"), command: Some(0) } } task 2, line 19: diff --git a/crates/iota-adapter-transactional-tests/tests/publish/init_param.exp b/crates/iota-adapter-transactional-tests/tests/publish/init_param.exp index 3e7498ef22e..056f62ab500 100644 --- a/crates/iota-adapter-transactional-tests/tests/publish/init_param.exp +++ b/crates/iota-adapter-transactional-tests/tests/publish/init_param.exp @@ -2,5 +2,5 @@ processed 2 tasks task 1, lines 6-28: //# publish -Error: Transaction Effects Status: Iota Move Bytecode Verification Error. Please run the Iota Move Verifier for more information. +Error: Transaction Effects Status: IOTA Move Bytecode Verification Error. Please run the IOTA Move Verifier for more information. Execution Error: ExecutionError: ExecutionError { inner: ExecutionErrorInner { kind: IotaMoveVerificationError, source: Some("Expected last parameter for _::M1::init to be &mut iota::tx_context::TxContext or &iota::tx_context::TxContext, but found &mut iota::tx_context::TxContext"), command: Some(0) } } diff --git a/crates/iota-adapter-transactional-tests/tests/publish/init_public.exp b/crates/iota-adapter-transactional-tests/tests/publish/init_public.exp index bf37defa5ed..2d9e59a6aee 100644 --- a/crates/iota-adapter-transactional-tests/tests/publish/init_public.exp +++ b/crates/iota-adapter-transactional-tests/tests/publish/init_public.exp @@ -2,5 +2,5 @@ processed 2 tasks task 1, lines 6-28: //# publish -Error: Transaction Effects Status: Iota Move Bytecode Verification Error. Please run the Iota Move Verifier for more information. +Error: Transaction Effects Status: IOTA Move Bytecode Verification Error. Please run the IOTA Move Verifier for more information. Execution Error: ExecutionError: ExecutionError { inner: ExecutionErrorInner { kind: IotaMoveVerificationError, source: Some("_::M1. 'init' function must be private"), command: Some(0) } } diff --git a/crates/iota-adapter-transactional-tests/tests/publish/init_ret.exp b/crates/iota-adapter-transactional-tests/tests/publish/init_ret.exp index 76c2847072f..efea232dc2f 100644 --- a/crates/iota-adapter-transactional-tests/tests/publish/init_ret.exp +++ b/crates/iota-adapter-transactional-tests/tests/publish/init_ret.exp @@ -2,5 +2,5 @@ processed 2 tasks task 1, lines 6-28: //# publish -Error: Transaction Effects Status: Iota Move Bytecode Verification Error. Please run the Iota Move Verifier for more information. +Error: Transaction Effects Status: IOTA Move Bytecode Verification Error. Please run the IOTA Move Verifier for more information. Execution Error: ExecutionError: ExecutionError { inner: ExecutionErrorInner { kind: IotaMoveVerificationError, source: Some("_::M1, 'init' function cannot have return values"), command: Some(0) } } diff --git a/crates/iota-adapter-transactional-tests/tests/transfer_object/transfer_coin.move b/crates/iota-adapter-transactional-tests/tests/transfer_object/transfer_coin.move index 75b2057f9a8..3a5b6316760 100644 --- a/crates/iota-adapter-transactional-tests/tests/transfer_object/transfer_coin.move +++ b/crates/iota-adapter-transactional-tests/tests/transfer_object/transfer_coin.move @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -// tests TransferObject with a IOTA coin +// tests TransferObject with an IOTA coin //# init --accounts A B C diff --git a/crates/iota-adapter-transactional-tests/tests/upgrade/add_ability_during_upgrade.exp b/crates/iota-adapter-transactional-tests/tests/upgrade/add_ability_during_upgrade.exp index 95e29002e95..72f21648323 100644 --- a/crates/iota-adapter-transactional-tests/tests/upgrade/add_ability_during_upgrade.exp +++ b/crates/iota-adapter-transactional-tests/tests/upgrade/add_ability_during_upgrade.exp @@ -41,7 +41,7 @@ Execution Error: ExecutionError: ExecutionError { inner: ExecutionErrorInner { k task 8, lines 46-49: //# upgrade --package Test_V0 --upgrade-capability 1,1 --sender A -Error: Transaction Effects Status: Iota Move Bytecode Verification Error. Please run the Iota Move Verifier for more information. +Error: Transaction Effects Status: IOTA Move Bytecode Verification Error. Please run the IOTA Move Verifier for more information. Execution Error: ExecutionError: ExecutionError { inner: ExecutionErrorInner { kind: IotaMoveVerificationError, source: Some("First field of struct Foo must be 'id', dummy_field found"), command: Some(1) } } task 9, lines 51-57: diff --git a/crates/iota-analytics-indexer/README.md b/crates/iota-analytics-indexer/README.md new file mode 100644 index 00000000000..7018b1323fb --- /dev/null +++ b/crates/iota-analytics-indexer/README.md @@ -0,0 +1,119 @@ +# IOTA Analytics Indexer + +The IOTA Analytics Indexer is a service that exports data from the main IOTA network to a remote big object store (S3/GCS/Azure) for further analytical processing. It does not perform any analysis on its own. + +## **Key Features** + +- Exports data from the IOTA network to a remote big object store +- Provides BigQuery and Snowflake schemas for the exported data + +> [!NOTE] +> BigQuery and Snowflake are cloud-based data warehousing solutions. +> After getting data there one can analyse it in the cloud using SQL queries. +> +> BigQuery is part of Google Cloud Platform: [https://cloud.google.com/bigquery] +> +> Snowflake isn't part of any large cloud provider: [https://snowflake.com] + +## **Relation to iota-indexer** + +### iota-indexer + +Currently iota-indexer is computing and storing analytical metrics about: + +- network statistics (amount of transactions, transactions per second) +- (active) addresses (transactions senders/recipients) +- move calls + +Those metrics are computed by a separate analytical worker instance of the indexer, but it uses the main DB as the main indexer instance. + +It seems that some of the values stored in main indexer tables by iota-indexer's `fullnode_sync_worker` are only stored there for analytical purposes (move calls, tx recipients) and could potentially be excluded from further processing if it was not for analytical reasons. + +### iota-analytics-indexer + +The `iota-analytics-indexer` is not computing any analytical metrics directly. +It is only exporting data for further processing via external tools (BigQuery/SnowFlake). + +On this premise, the functionality in `iota-indexer` that is currently used for extracting analytics (and thus unrelated to the JSON-RPC/GraphQL service) could be moved out and delegated to another tool that processes data exported by `iota-analytics-indexer`. +Then the sync logic in `iota-indexer` could be simplified as well to store only data that is needed for the purposes of the RPC APIs. + +## **Schemas** + +The crate provides: + +- [BigQuery Schemas](src/store/bq/schemas/) +- [SnowFlake Schemas](src/store/snowflake/schemas/) +- [Rust struct representations](src/tables.rs) + +for the data that it is exporting. + +The tables covered by the schemas: + +- CHECKPOINT +- EVENT +- MOVE_CALL +- OBJECT +- MOVE_PACKAGE +- TRANSACTION_OBJECT - input and output objects for given transactions +- TRANSACTION + +> [!NOTE] +> The following rust structs currently do not have DB schemas prepared: +> +> - DynamicFieldEntry +> - WrappedObjectEntry + +## **Architecture** + +When running the indexer, one needs to specify object type that would be extracted from checkpoints and uploaded to the cloud. + +The following object types are supported: + +- Checkpoint +- Object +- Transaction +- TransactionObjects +- Event +- MoveCall +- MovePackage +- DynamicField +- WrappedObject + +Only one object type can be passed in given run, to process multiple object types it is needed to run multiple analytics indexer instances. + +In general, the data flow is as follows: + +- Checkpoints are read via JSON RPC using reused code from `iota_data_ingestion_core`. +- Checkpoints are processed by an appropriate handler (e.g. `EventHandler`), which extracts relevant objects from each transaction of the checkpoint. +- Objects are passed to the Writer, which writes the objects to a local temporary store in CSV or Parquet format. +- The `AnalyticsProcessor` syncs the objects from the local store to the remote store (S3/GCS/Azure, or also local, for testing purposes). +- Every 5 minutes the last processed checkpoint ID is fetched from BigQuery/Snowflake and reported as a metric. + +> [!NOTE] +> It is assumed that data from the big object store will be readable from BigQuery/Snowflake automatically, the indexer is not putting the data in BigQuery/Snowflake tables explicitly. + +Here is a graph summarizing the data flow: + +```mermaid +flowchart TD + FNODE["Fullnode/Indexer"] <-->|JSON RPC| CPREADER["`IndexerExecutor/CheckpointReader from the **iota_data_ingestion_core** package`"]; + subgraph "`**iota-analytics-indexer**`" + CPREADER -->|"`Executor calls **AnalyticsProcessor** for each checkpoint, which in turn passes the checkpoint to appropriate Handler`"| HANDLER["CheckpointHandler/EventHandler etc., depending on indexer configuration"] + HANDLER -->|"`**AnalyticsProcessor** reads object data extracted from the checkpoint by the Handler and passes it to the Writer`"| WRITER["CSVWriter/ParquetWriter"] + WRITER -->|Writes objects to temporary local storage| DISK[Temporary Local Storage] + DISK --> REMOTESYNC["`Task inside of **AnalyticsProcessor** that removes files from Local Storage and uploads them to Remote Storage(S3/GCS/Azure)`"] + WRITER -->|"`Once every few checkpoints, **AnalyticsProcessor** calls cut() to prepare file to be sent, FileMetadata is sent to the Remote Sync Task which triggers the sync`"| REMOTESYNC + REMOTESYNC -->|Some process outside of analytics indexer makes the newly uploaded data available via BigQuery/Snowflake tables| BQSF["BigQuery/Snowflake"] + BQSF -->|"Every 5 minutes max processed checkpoint number is read from the tables"| METRICS[Analytics Indexer Prometheus Metrics] + end + +linkStyle 6 stroke:red,stroke-width:2px,stroke-dasharray:3; +``` + +## **Metrics** + +The following Prometheus metrics are served by `iota-analytics-indexer` to monitor the indexer execution: + +- **total_received**: count of checkpoints processed in given run +- **last_uploaded_checkpoint**: id of last checkpoint uploaded to the big object store +- **max_checkpoint_on_store**: id of last checkpoint available via BigQuery/Snowflake tables diff --git a/crates/iota-analytics-indexer/src/lib.rs b/crates/iota-analytics-indexer/src/lib.rs index a2d4b25b894..a778e4da270 100644 --- a/crates/iota-analytics-indexer/src/lib.rs +++ b/crates/iota-analytics-indexer/src/lib.rs @@ -65,56 +65,56 @@ const DYNAMIC_FIELD_PREFIX: &str = "dynamic_field"; const WRAPPED_OBJECT_PREFIX: &str = "wrapped_object"; #[derive(Parser, Clone, Debug)] -#[clap( - name = "Iota Analytics Indexer", +#[command( + name = "IOTA Analytics Indexer", about = "Indexer service to upload data for the analytics pipeline.", rename_all = "kebab-case" )] pub struct AnalyticsIndexerConfig { /// The url of the checkpoint client to connect to. - #[clap(long)] + #[arg(long)] pub rest_url: String, /// The url of the metrics client to connect to. - #[clap(long, default_value = "127.0.0.1", global = true)] + #[arg(long, default_value = "127.0.0.1", global = true)] pub client_metric_host: String, /// The port of the metrics client to connect to. - #[clap(long, default_value = "8081", global = true)] + #[arg(long, default_value = "8081", global = true)] pub client_metric_port: u16, /// Directory to contain the temporary files for checkpoint entries. - #[clap(long, global = true, default_value = "/tmp")] + #[arg(long, global = true, default_value = "/tmp")] pub checkpoint_dir: PathBuf, /// Number of checkpoints to process before uploading to the datastore. - #[clap(long, default_value = "10000", global = true)] + #[arg(long, default_value = "10000", global = true)] pub checkpoint_interval: u64, /// Maximum file size in mb before uploading to the datastore. - #[clap(long, default_value = "100", global = true)] + #[arg(long, default_value = "100", global = true)] pub max_file_size_mb: u64, /// Checkpoint sequence number to start the download from - #[clap(long, default_value = None, global = true)] + #[arg(long, default_value = None, global = true)] pub starting_checkpoint_seq_num: Option, /// Time to process in seconds before uploading to the datastore. - #[clap(long, default_value = "600", global = true)] + #[arg(long, default_value = "600", global = true)] pub time_interval_s: u64, // Remote object store where data gets written to #[command(flatten)] pub remote_store_config: ObjectStoreConfig, // Remote object store path prefix to use while writing - #[clap(long, default_value = None, global = true)] + #[arg(long, default_value = None, global = true)] pub remote_store_path_prefix: Option, // File format to store data in i.e. csv, parquet, etc - #[clap(long, value_enum, default_value = "csv", global = true)] + #[arg(long, value_enum, default_value = "csv", global = true)] pub file_format: FileFormat, // Type of data to write i.e. checkpoint, object, transaction, etc - #[clap(long, value_enum, long, global = true)] + #[arg(long, value_enum, long, global = true)] pub file_type: FileType, - #[clap( + #[arg( long, - default_value = "https://checkpoints.mainnet.iota.io", + default_value = "https://checkpoints.mainnet.iota.cafe", global = true )] pub remote_store_url: String, // Directory to contain the package cache for pipelines - #[clap( + #[arg( long, value_enum, long, @@ -122,37 +122,37 @@ pub struct AnalyticsIndexerConfig { default_value = "/opt/iota/db/package_cache" )] pub package_cache_path: PathBuf, - #[clap(long, default_value = None, global = true)] + #[arg(long, default_value = None, global = true)] pub bq_service_account_key_file: Option, - #[clap(long, default_value = None, global = true)] + #[arg(long, default_value = None, global = true)] pub bq_project_id: Option, - #[clap(long, default_value = None, global = true)] + #[arg(long, default_value = None, global = true)] pub bq_dataset_id: Option, - #[clap(long, default_value = None, global = true)] + #[arg(long, default_value = None, global = true)] pub bq_table_id: Option, - #[clap(long, default_value = None, global = true)] + #[arg(long, default_value = None, global = true)] pub bq_checkpoint_col_id: Option, - #[clap(long, global = true)] + #[arg(long, global = true)] pub report_bq_max_table_checkpoint: bool, - #[clap(long, default_value = None, global = true)] + #[arg(long, default_value = None, global = true)] pub sf_account_identifier: Option, - #[clap(long, default_value = None, global = true)] + #[arg(long, default_value = None, global = true)] pub sf_warehouse: Option, - #[clap(long, default_value = None, global = true)] + #[arg(long, default_value = None, global = true)] pub sf_database: Option, - #[clap(long, default_value = None, global = true)] + #[arg(long, default_value = None, global = true)] pub sf_schema: Option, - #[clap(long, default_value = None, global = true)] + #[arg(long, default_value = None, global = true)] pub sf_username: Option, - #[clap(long, default_value = None, global = true)] + #[arg(long, default_value = None, global = true)] pub sf_role: Option, - #[clap(long, default_value = None, global = true)] + #[arg(long, default_value = None, global = true)] pub sf_password: Option, - #[clap(long, default_value = None, global = true)] + #[arg(long, default_value = None, global = true)] pub sf_table_id: Option, - #[clap(long, default_value = None, global = true)] + #[arg(long, default_value = None, global = true)] pub sf_checkpoint_col_id: Option, - #[clap(long, global = true)] + #[arg(long, global = true)] pub report_sf_max_table_checkpoint: bool, } diff --git a/crates/iota-analytics-indexer/src/main.rs b/crates/iota-analytics-indexer/src/main.rs index 3e08ce16efc..281f6ade02e 100644 --- a/crates/iota-analytics-indexer/src/main.rs +++ b/crates/iota-analytics-indexer/src/main.rs @@ -42,7 +42,7 @@ async fn main() -> Result<()> { batch_size: 10, ..Default::default() }; - let (executor, exit_sender) = setup_single_workflow( + let (executor, token) = setup_single_workflow( processor, remote_store_url, watermark, @@ -51,13 +51,11 @@ async fn main() -> Result<()> { ) .await?; - tokio::spawn(async { + tokio::spawn(async move { signal::ctrl_c() .await .expect("Failed to install Ctrl+C handler"); - exit_sender - .send(()) - .expect("Failed to gracefully process shutdown"); + token.cancel(); }); executor.await?; Ok(()) diff --git a/crates/iota-aws-orchestrator/assets/plot.py b/crates/iota-aws-orchestrator/assets/plot.py index a30f6f08511..17817417b5f 100644 --- a/crates/iota-aws-orchestrator/assets/plot.py +++ b/crates/iota-aws-orchestrator/assets/plot.py @@ -419,7 +419,7 @@ def plot_duration(self, file, precision): if __name__ == "__main__": parser = argparse.ArgumentParser( - prog='Iota Plotter', + prog='IOTA Plotter', description='Simple script to plot measurement data' ) parser.add_argument( diff --git a/crates/iota-aws-orchestrator/src/main.rs b/crates/iota-aws-orchestrator/src/main.rs index 7e1696c3ed9..91ff63896a1 100644 --- a/crates/iota-aws-orchestrator/src/main.rs +++ b/crates/iota-aws-orchestrator/src/main.rs @@ -39,7 +39,7 @@ pub struct Opts { /// The path to the settings file. This file contains basic information to /// deploy testbeds and run benchmarks such as the url of the git repo, /// the commit to deploy, etc. - #[clap( + #[arg( long, value_name = "FILE", default_value = "crates/iota-aws-orchestrator/assets/settings.json", @@ -48,7 +48,7 @@ pub struct Opts { settings_path: String, /// The type of operation to run. - #[clap(subcommand)] + #[command(subcommand)] operation: Operation, } @@ -56,7 +56,7 @@ pub struct Opts { pub enum Operation { /// Get or modify the status of the testbed. Testbed { - #[clap(subcommand)] + #[command(subcommand)] action: TestbedAction, }, @@ -64,79 +64,79 @@ pub enum Operation { Benchmark { /// Percentage of shared vs owned objects; 0 means only owned objects /// and 100 means only shared objects. - #[clap(long, default_value = "0", global = true)] + #[arg(long, default_value = "0", global = true)] benchmark_type: String, /// The committee size to deploy. - #[clap(long, value_name = "INT")] + #[arg(long, value_name = "INT")] committee: usize, /// Number of faulty nodes. - #[clap(long, value_name = "INT", default_value = "0", global = true)] + #[arg(long, value_name = "INT", default_value = "0", global = true)] faults: usize, /// Whether the faulty nodes recover. - #[clap(long, action, default_value = "false", global = true)] + #[arg(long, action, default_value = "false", global = true)] crash_recovery: bool, /// The interval to crash nodes in seconds. - #[clap(long, value_parser = parse_duration, default_value = "60", global = true)] + #[arg(long, value_parser = parse_duration, default_value = "60", global = true)] crash_interval: Duration, /// The minimum duration of the benchmark in seconds. - #[clap(long, value_parser = parse_duration, default_value = "600", global = true)] + #[arg(long, value_parser = parse_duration, default_value = "600", global = true)] duration: Duration, /// The interval between measurements collection in seconds. - #[clap(long, value_parser = parse_duration, default_value = "15", global = true)] + #[arg(long, value_parser = parse_duration, default_value = "15", global = true)] scrape_interval: Duration, /// Whether to skip testbed updates before running benchmarks. - #[clap(long, action, default_value = "false", global = true)] + #[arg(long, action, default_value = "false", global = true)] skip_testbed_update: bool, /// Whether to skip testbed configuration before running benchmarks. - #[clap(long, action, default_value = "false", global = true)] + #[arg(long, action, default_value = "false", global = true)] skip_testbed_configuration: bool, /// Whether to download and analyze the client and node log files. - #[clap(long, action, default_value = "false", global = true)] + #[arg(long, action, default_value = "false", global = true)] log_processing: bool, /// The number of instances running exclusively load generators. If set /// to zero the orchestrator collocates one load generator with /// each node. - #[clap(long, value_name = "INT", default_value = "0", global = true)] + #[arg(long, value_name = "INT", default_value = "0", global = true)] dedicated_clients: usize, /// Whether to forgo a grafana and prometheus instance and leave the /// testbed unmonitored. - #[clap(long, action, default_value = "false", global = true)] + #[arg(long, action, default_value = "false", global = true)] skip_monitoring: bool, /// The timeout duration for ssh commands (in seconds). - #[clap(long, action, value_parser = parse_duration, default_value = "30", global = true)] + #[arg(long, action, value_parser = parse_duration, default_value = "30", global = true)] timeout: Duration, /// The number of times the orchestrator should retry an ssh command. - #[clap(long, value_name = "INT", default_value = "5", global = true)] + #[arg(long, value_name = "INT", default_value = "5", global = true)] retries: usize, /// The load to submit to the system. - #[clap(subcommand)] + #[command(subcommand)] load_type: Load, }, /// Print a summary of the specified measurements collection. Summarize { /// The path to the settings file. - #[clap(long, value_name = "FILE")] + #[arg(long, value_name = "FILE")] path: String, }, } #[derive(Parser)] -#[clap(rename_all = "kebab-case")] +#[command(rename_all = "kebab-case")] pub enum TestbedAction { /// Display the testbed status. Status, @@ -145,13 +145,13 @@ pub enum TestbedAction { /// the setting file. Deploy { /// Number of instances to deploy. - #[clap(long)] + #[arg(long)] instances: usize, /// The region where to deploy the instances. If this parameter is not /// specified, the command deploys the specified number of /// instances in all regions listed in the setting file. - #[clap(long)] + #[arg(long)] region: Option, }, @@ -159,7 +159,7 @@ pub enum TestbedAction { /// existing testbed. Start { /// Number of instances to deploy. - #[clap(long, default_value = "200")] + #[arg(long, default_value = "200")] instances: usize, }, @@ -175,7 +175,7 @@ pub enum Load { /// The fixed loads (in tx/s) to submit to the nodes. FixedLoad { /// A list of fixed load (tx/s). - #[clap( + #[arg( long, value_name = "INT", num_args(1..), @@ -187,11 +187,11 @@ pub enum Load { /// Search for the maximum load that the system can sustainably handle. Search { /// The initial load (in tx/s) to test and use a baseline. - #[clap(long, value_name = "INT", default_value = "250")] + #[arg(long, value_name = "INT", default_value = "250")] starting_load: usize, /// The maximum number of iterations before converging on a breaking /// point. - #[clap(long, value_name = "INT", default_value = "5")] + #[arg(long, value_name = "INT", default_value = "5")] max_iterations: usize, }, } diff --git a/crates/iota-aws-orchestrator/src/protocol/iota.rs b/crates/iota-aws-orchestrator/src/protocol/iota.rs index 8eaf3931f43..ac3d3e88c3d 100644 --- a/crates/iota-aws-orchestrator/src/protocol/iota.rs +++ b/crates/iota-aws-orchestrator/src/protocol/iota.rs @@ -50,7 +50,7 @@ impl FromStr for IotaBenchmarkType { impl BenchmarkType for IotaBenchmarkType {} -/// All configurations information to run a Iota client or validator. +/// All configurations information to run an IOTA client or validator. pub struct IotaProtocol { working_dir: PathBuf, } @@ -60,7 +60,7 @@ impl ProtocolCommands for IotaProtocol { vec![ // Install typical iota dependencies. "sudo apt-get -y install curl git-all clang cmake gcc libssl-dev pkg-config libclang-dev", - // This dependency is missing from the Iota docs. + // This dependency is missing from the IOTA docs. "sudo apt-get -y install libpq-dev", ] } @@ -214,7 +214,7 @@ impl ProtocolCommands for IotaProtocol { impl IotaProtocol { const CLIENT_METRICS_PORT: u16 = GenesisConfig::BENCHMARKS_PORT_OFFSET + 2000; - /// Make a new instance of the Iota protocol commands generator. + /// Make a new instance of the IOTA protocol commands generator. pub fn new(settings: &Settings) -> Self { Self { working_dir: [&settings.working_dir, &iota_config::IOTA_CONFIG_DIR.into()] diff --git a/crates/iota-benchmark/src/in_memory_wallet.rs b/crates/iota-benchmark/src/in_memory_wallet.rs index 62cffdfb7b7..40273a31e14 100644 --- a/crates/iota-benchmark/src/in_memory_wallet.rs +++ b/crates/iota-benchmark/src/in_memory_wallet.rs @@ -18,7 +18,7 @@ use crate::{ workloads::Gas, }; -/// A Iota account and all of the objects it owns +/// An IOTA account and all of the objects it owns #[derive(Debug)] pub struct IotaAccount { key: Arc, diff --git a/crates/iota-benchmark/src/options.rs b/crates/iota-benchmark/src/options.rs index 7b7c36c92b3..922a3afa47e 100644 --- a/crates/iota-benchmark/src/options.rs +++ b/crates/iota-benchmark/src/options.rs @@ -10,69 +10,69 @@ use strum_macros::EnumString; use crate::drivers::Interval; #[derive(Parser)] -#[clap(name = "Stress Testing Framework")] +#[command(name = "Stress Testing Framework")] pub struct Opts { - /// Size of the Iota committee. - #[clap(long, default_value = "4", global = true)] + /// Size of the IOTA committee. + #[arg(long, default_value = "4", global = true)] pub committee_size: u64, /// Num of accounts to use for transfer objects - #[clap(long, default_value = "5", global = true)] + #[arg(long, default_value = "5", global = true)] pub num_transfer_accounts: u64, /// Num server threads - #[clap(long, default_value = "24", global = true)] + #[arg(long, default_value = "24", global = true)] pub num_server_threads: u64, /// Num client threads /// ideally same as number of workers - #[clap(long, default_value = "3", global = true)] + #[arg(long, default_value = "3", global = true)] pub num_client_threads: u64, - #[clap(long, default_value = "", global = true)] + #[arg(long, default_value = "", global = true)] pub log_path: String, /// [Required for remote benchmark] /// Path where genesis.blob is stored when running remote benchmark - #[clap(long, default_value = "/tmp/genesis.blob", global = true)] + #[arg(long, default_value = "/tmp/genesis.blob", global = true)] pub genesis_blob_path: String, /// [Required for remote benchmark] /// Path where keypair for primary gas account is stored. The format of /// this file is same as what `iota keytool generate` outputs - #[clap(long, default_value = "", global = true)] + #[arg(long, default_value = "", global = true)] pub keystore_path: String, /// [Required for remote benchmark] /// Object id of the primary gas coin used for benchmark /// NOTE: THe remote network should have this coin in its genesis config /// with large enough gas. - #[clap(long, default_value = "", global = true)] + #[arg(long, default_value = "", global = true)] pub primary_gas_owner_id: String, - #[clap(long, default_value = "500", global = true)] + #[arg(long, default_value = "500", global = true)] pub gas_request_chunk_size: u64, /// Whether to run local or remote benchmark /// NOTE: For running remote benchmark we must have the following /// genesis_blob_path, keypair_path and primary_gas_id - #[clap(long, action = clap::ArgAction::Set, default_value = "true", global = true)] + #[arg(long, action = clap::ArgAction::Set, default_value = "true", global = true)] pub local: bool, /// Required in remote benchmark, namely when local = false /// Multiple fullnodes can be specified. - #[clap(long, num_args(1..), value_delimiter = ',', global = true)] + #[arg(long, num_args(1..), value_delimiter = ',', global = true)] pub fullnode_rpc_addresses: Vec, /// Whether to submit transactions to a fullnode. /// If true, use FullNodeProxy. /// Otherwise, use LocalValidatorAggregatorProxy. /// This param only matters when local = false, namely local runs always /// use a LocalValidatorAggregatorProxy. - #[clap(long, action = clap::ArgAction::Set, default_value = "false", global = true)] + #[arg(long, action = clap::ArgAction::Set, default_value = "false", global = true)] pub use_fullnode_for_execution: bool, /// True to use FullNodeReconfigObserver, /// Otherwise use EmbeddedReconfigObserver, - #[clap(long, action = clap::ArgAction::Set, default_value = "false", global = true)] + #[arg(long, action = clap::ArgAction::Set, default_value = "false", global = true)] pub use_fullnode_for_reconfig: bool, /// Default workload is 100% transfer object - #[clap(subcommand)] + #[command(subcommand)] pub run_spec: RunSpec, - #[clap(long, default_value = "127.0.0.1", global = true)] + #[arg(long, default_value = "127.0.0.1", global = true)] pub client_metric_host: String, - #[clap(long, default_value = "8081", global = true)] + #[arg(long, default_value = "8081", global = true)] pub client_metric_port: u16, /// Whether or no to download TXes during follow - #[clap(long, global = true)] + #[arg(long, global = true)] pub download_txes: bool, /// Number of transactions or duration to /// run the benchmark for. Default set to @@ -83,38 +83,37 @@ pub struct Opts { /// And if we wanted to run the test for /// 10,000 transactions we could set it to /// "10000" - #[clap(long, global = true, default_value = "unbounded")] + #[arg(long, global = true, default_value = "unbounded")] pub run_duration: Interval, /// Path where benchmark stats is stored - #[clap(long, default_value = "/tmp/bench_result", global = true)] + #[arg(long, default_value = "/tmp/bench_result", global = true)] pub benchmark_stats_path: String, /// Path where previous benchmark stats is stored to use for comparison - #[clap(long, default_value = "", global = true)] + #[arg(long, default_value = "", global = true)] pub compare_with: String, // Stat collection interval seconds - #[clap(long, default_value = "10", global = true)] + #[arg(long, default_value = "10", global = true)] pub stat_collection_interval: u64, // Enable stress stat collection. When enabled the sysinfo crate will be used // to gather system information. For example cpu usage will be polled every // 1 second and the P50/P99 usage statistics will be outputted either at // the end of the benchmark or periodically during a continuous run. - #[clap(long, action, global = true)] + #[arg(long, action, global = true)] pub stress_stat_collection: bool, // When starting multiple stress clients, stagger the start time by a random multiplier // between 0 and this value, times initialization time which is 1min. This helps to avoid // transaction conflicts between clients. - #[clap(long, default_value = "0", global = true)] + #[arg(long, default_value = "0", global = true)] pub staggered_start_max_multiplier: u32, - /// Start the stress test at a given protocol version. (Usually unnecessary /// if stress test is built at the same commit as the validators. - #[clap(long, global = true)] + #[arg(long, global = true)] pub protocol_version: Option, } #[derive(Debug, Clone, Parser, Eq, PartialEq, EnumString)] #[non_exhaustive] -#[clap(rename_all = "kebab-case")] +#[command(rename_all = "kebab-case")] pub enum RunSpec { // Allow the ability to mix shared object and // single owner transactions in the benchmarking @@ -163,30 +162,30 @@ pub enum RunSpec { // `num_of_benchmark_groups = 2`, then we expect all the arguments under this // subcommand to contain two values on their vectors - one for each benchmark set. // If an argument doesn't contain the right number of values then it will panic. - #[clap(long, default_value = "1")] + #[arg(long, default_value = "1")] num_of_benchmark_groups: u32, // relative weight of shared counter // transaction in the benchmark workload - #[clap(long, num_args(1..), value_delimiter = ',', default_values_t = [0])] + #[arg(long, num_args(1..), value_delimiter = ',', default_values_t = [0])] shared_counter: Vec, // relative weight of transfer object // transactions in the benchmark workload - #[clap(long, num_args(1..), value_delimiter = ',', default_values_t = [1])] + #[arg(long, num_args(1..), value_delimiter = ',', default_values_t = [1])] transfer_object: Vec, // relative weight of delegation transactions in the benchmark workload - #[clap(long, num_args(1..), value_delimiter = ',', default_values_t = [0])] + #[arg(long, num_args(1..), value_delimiter = ',', default_values_t = [0])] delegation: Vec, // relative weight of batch payment transactions in the benchmark workload - #[clap(long, num_args(1..), value_delimiter = ',', default_values_t = [0])] + #[arg(long, num_args(1..), value_delimiter = ',', default_values_t = [0])] batch_payment: Vec, // relative weight of adversarial transactions in the benchmark workload - #[clap(long, num_args(1..), value_delimiter = ',', default_values_t = [0])] + #[arg(long, num_args(1..), value_delimiter = ',', default_values_t = [0])] adversarial: Vec, // relative weight of shared deletion transactions in the benchmark workload - #[clap(long, num_args(1..), value_delimiter = ',', default_values_t = [0])] + #[arg(long, num_args(1..), value_delimiter = ',', default_values_t = [0])] shared_deletion: Vec, // relative weight of randomness transactions in the benchmark workload - #[clap(long, num_args(1..), value_delimiter = ',', default_values_t = [0])] + #[arg(long, num_args(1..), value_delimiter = ',', default_values_t = [0])] randomness: Vec, // --- workload-specific options --- (TODO: use subcommands or similar) @@ -196,43 +195,43 @@ pub enum RunSpec { // counter. The way total number of counters to // create is computed roughly as: // total_shared_counters = max(1, qps * (1.0 - hotness/100.0)) - #[clap(long, num_args(1..), value_delimiter = ',', default_values_t = [50])] + #[arg(long, num_args(1..), value_delimiter = ',', default_values_t = [50])] shared_counter_hotness_factor: Vec, // The number of shared counters this stress client will create and use. // This parameter takes precedence over `shared_counter_hotness_factor`, meaning that when // this parameter is specified, `shared_counter_hotness_factor` is ignored when // deciding the number of shared counters to create. - #[clap(long, num_args(1..), value_delimiter = ',')] + #[arg(long, num_args(1..), value_delimiter = ',')] num_shared_counters: Option>, // Maximum gas price increment over the RGP for shared counter transactions. // The actual increment for each transaction is chosen at random a value between 0 and this // value. - #[clap(long, num_args(1..), value_delimiter = ',', default_values_t = [0])] + #[arg(long, num_args(1..), value_delimiter = ',', default_values_t = [0])] shared_counter_max_tip: Vec, // batch size use for batch payment workload - #[clap(long, num_args(1..), value_delimiter = ',', default_values_t = [15])] + #[arg(long, num_args(1..), value_delimiter = ',', default_values_t = [15])] batch_payment_size: Vec, // type and load % of adversarial transactions in the benchmark workload. // Format is "{adversarial_type}-{load_factor}". // `load_factor` is a number between 0.0 and 1.0 which dictates how much load per tx // Default is (0-0.5) implying random load at 50% load. See `AdversarialPayloadType` enum // for `adversarial_type` - #[clap(long, num_args(1..), value_delimiter = ',', default_values_t = ["0-1.0".to_string()])] + #[arg(long, num_args(1..), value_delimiter = ',', default_values_t = ["0-1.0".to_string()])] adversarial_cfg: Vec, // --- generic options --- // Target qps - #[clap(long, num_args(1..), value_delimiter = ',', default_values_t = [1000])] + #[arg(long, num_args(1..), value_delimiter = ',', default_values_t = [1000])] target_qps: Vec, // Number of workers - #[clap(long, num_args(1..), value_delimiter = ',', default_values_t = [12])] + #[arg(long, num_args(1..), value_delimiter = ',', default_values_t = [12])] num_workers: Vec, // Max in-flight ratio - #[clap(long, num_args(1..), value_delimiter = ',', default_values_t = [5])] + #[arg(long, num_args(1..), value_delimiter = ',', default_values_t = [5])] in_flight_ratio: Vec, // Setting the duration of each benchmark. Benchmarks will run in sequence. - #[clap(long, num_args(1..), value_delimiter = ',', default_values_t = [Interval::from_str("unbounded").unwrap()])] + #[arg(long, num_args(1..), value_delimiter = ',', default_values_t = [Interval::from_str("unbounded").unwrap()])] duration: Vec, }, } diff --git a/crates/iota-bridge-cli/src/lib.rs b/crates/iota-bridge-cli/src/lib.rs index 74392f8977c..dc7062f0dfa 100644 --- a/crates/iota-bridge-cli/src/lib.rs +++ b/crates/iota-bridge-cli/src/lib.rs @@ -47,9 +47,9 @@ use tracing::info; pub const SEPOLIA_BRIDGE_PROXY_ADDR: &str = "0xAE68F87938439afEEDd6552B0E83D2CbC2473623"; #[derive(Parser)] -#[clap(rename_all = "kebab-case")] +#[command(rename_all = "kebab-case")] pub struct Args { - #[clap(subcommand)] + #[command(subcommand)] pub command: BridgeCommand, } @@ -59,156 +59,156 @@ pub enum Network { } #[derive(Parser)] -#[clap(rename_all = "kebab-case")] +#[command(rename_all = "kebab-case")] pub enum BridgeCommand { - #[clap(name = "create-bridge-validator-key")] + #[command(name = "create-bridge-validator-key")] CreateBridgeValidatorKey { path: PathBuf }, - #[clap(name = "create-bridge-client-key")] + #[command(name = "create-bridge-client-key")] CreateBridgeClientKey { path: PathBuf, - #[clap(long = "use-ecdsa", default_value = "false")] + #[arg(long = "use-ecdsa", default_value = "false")] use_ecdsa: bool, }, /// Read bridge key from a file and print related information /// If `is-validator-key` is true, the key must be a secp256k1 key - #[clap(name = "examine-key")] + #[command(name = "examine-key")] ExamineKey { path: PathBuf, - #[clap(long = "is-validator-key")] + #[arg(long = "is-validator-key")] is_validator_key: bool, }, - #[clap(name = "create-bridge-node-config-template")] + #[command(name = "create-bridge-node-config-template")] CreateBridgeNodeConfigTemplate { path: PathBuf, - #[clap(long = "run-client")] + #[arg(long = "run-client")] run_client: bool, }, /// Governance client to facilitate and execute Bridge governance actions - #[clap(name = "governance")] + #[command(name = "governance")] Governance { /// Path of BridgeCliConfig - #[clap(long = "config-path")] + #[arg(long = "config-path")] config_path: PathBuf, - #[clap(long = "chain-id")] + #[arg(long = "chain-id")] chain_id: u8, - #[clap(subcommand)] + #[command(subcommand)] cmd: GovernanceClientCommands, /// If true, only collect signatures but not execute on chain - #[clap(long = "dry-run")] + #[arg(long = "dry-run")] dry_run: bool, }, /// View current status of Eth bridge - #[clap(name = "view-eth-bridge")] + #[command(name = "view-eth-bridge")] ViewEthBridge { - #[clap(long = "network")] + #[arg(long = "network")] network: Option, - #[clap(long = "bridge-proxy")] + #[arg(long = "bridge-proxy")] bridge_proxy: Option, - #[clap(long = "eth-rpc-url")] + #[arg(long = "eth-rpc-url")] eth_rpc_url: String, }, /// View current list of registered validators - #[clap(name = "view-bridge-registration")] + #[command(name = "view-bridge-registration")] ViewBridgeRegistration { - #[clap(long = "iota-rpc-url")] + #[arg(long = "iota-rpc-url")] iota_rpc_url: String, }, - /// View current status of Iota bridge - #[clap(name = "view-iota-bridge")] + /// View current status of IOTA bridge + #[command(name = "view-iota-bridge")] ViewIotaBridge { - #[clap(long = "iota-rpc-url")] + #[arg(long = "iota-rpc-url")] iota_rpc_url: String, - #[clap(long, default_value = "false")] + #[arg(long, default_value = "false")] hex: bool, - #[clap(long, default_value = "false")] + #[arg(long, default_value = "false")] ping: bool, }, /// Client to facilitate and execute Bridge actions - #[clap(name = "client")] + #[command(name = "client")] Client { /// Path of BridgeCliConfig - #[clap(long = "config-path")] + #[arg(long = "config-path")] config_path: PathBuf, - #[clap(subcommand)] + #[command(subcommand)] cmd: BridgeClientCommands, }, } #[derive(Parser)] -#[clap(rename_all = "kebab-case")] +#[command(rename_all = "kebab-case")] pub enum GovernanceClientCommands { - #[clap(name = "emergency-button")] + #[command(name = "emergency-button")] EmergencyButton { - #[clap(name = "nonce", long)] + #[arg(name = "nonce", long)] nonce: u64, - #[clap(name = "action-type", long)] + #[arg(name = "action-type", long)] action_type: EmergencyActionType, }, - #[clap(name = "update-committee-blocklist")] + #[command(name = "update-committee-blocklist")] UpdateCommitteeBlocklist { - #[clap(name = "nonce", long)] + #[arg(name = "nonce", long)] nonce: u64, - #[clap(name = "blocklist-type", long)] + #[arg(name = "blocklist-type", long)] blocklist_type: BlocklistType, - #[clap(name = "pubkey-hex", use_value_delimiter = true, long)] + #[arg(name = "pubkey-hex", use_value_delimiter = true, long)] pubkeys_hex: Vec, }, - #[clap(name = "update-limit")] + #[command(name = "update-limit")] UpdateLimit { - #[clap(name = "nonce", long)] + #[arg(name = "nonce", long)] nonce: u64, - #[clap(name = "sending-chain", long)] + #[arg(name = "sending-chain", long)] sending_chain: u8, - #[clap(name = "new-usd-limit", long)] + #[arg(name = "new-usd-limit", long)] new_usd_limit: u64, }, - #[clap(name = "update-asset-price")] + #[command(name = "update-asset-price")] UpdateAssetPrice { - #[clap(name = "nonce", long)] + #[arg(name = "nonce", long)] nonce: u64, - #[clap(name = "token-id", long)] + #[arg(name = "token-id", long)] token_id: u8, - #[clap(name = "new-usd-price", long)] + #[arg(name = "new-usd-price", long)] new_usd_price: u64, }, - #[clap(name = "add-tokens-on-iota")] + #[command(name = "add-tokens-on-iota")] AddTokensOnIota { - #[clap(name = "nonce", long)] + #[arg(name = "nonce", long)] nonce: u64, - #[clap(name = "token-ids", use_value_delimiter = true, long)] + #[arg(name = "token-ids", use_value_delimiter = true, long)] token_ids: Vec, - #[clap(name = "token-type-names", use_value_delimiter = true, long)] + #[arg(name = "token-type-names", use_value_delimiter = true, long)] token_type_names: Vec, - #[clap(name = "token-prices", use_value_delimiter = true, long)] + #[arg(name = "token-prices", use_value_delimiter = true, long)] token_prices: Vec, }, - #[clap(name = "add-tokens-on-evm")] + #[command(name = "add-tokens-on-evm")] AddTokensOnEvm { - #[clap(name = "nonce", long)] + #[arg(name = "nonce", long)] nonce: u64, - #[clap(name = "token-ids", use_value_delimiter = true, long)] + #[arg(name = "token-ids", use_value_delimiter = true, long)] token_ids: Vec, - #[clap(name = "token-type-names", use_value_delimiter = true, long)] + #[arg(name = "token-type-names", use_value_delimiter = true, long)] token_addresses: Vec, - #[clap(name = "token-prices", use_value_delimiter = true, long)] + #[arg(name = "token-prices", use_value_delimiter = true, long)] token_prices: Vec, - #[clap(name = "token-iota-decimals", use_value_delimiter = true, long)] + #[arg(name = "token-iota-decimals", use_value_delimiter = true, long)] token_iota_decimals: Vec, }, - #[clap(name = "upgrade-evm-contract")] + #[command(name = "upgrade-evm-contract")] UpgradeEVMContract { - #[clap(name = "nonce", long)] + #[arg(name = "nonce", long)] nonce: u64, - #[clap(name = "proxy-address", long)] + #[arg(name = "proxy-address", long)] proxy_address: EthAddress, /// The address of the new implementation contract - #[clap(name = "implementation-address", long)] + #[arg(name = "implementation-address", long)] implementation_address: EthAddress, /// Function selector with params types, e.g. `foo(uint256,bool,string)` - #[clap(name = "function-selector", long)] + #[arg(name = "function-selector", long)] function_selector: Option, /// Params to be passed to the function, e.g. `420,false,hello` - #[clap(name = "params", use_value_delimiter = true, long)] + #[arg(name = "params", use_value_delimiter = true, long)] params: Vec, }, } @@ -379,7 +379,7 @@ pub fn select_contract_address( #[derive(Clone, Debug, Deserialize, Serialize)] #[serde(rename_all = "kebab-case")] pub struct BridgeCliConfig { - /// Rpc url for Iota fullnode, used for query stuff and submit transactions. + /// Rpc url for IOTA fullnode, used for query stuff and submit transactions. pub iota_rpc_url: String, /// Rpc url for Eth fullnode, used for query stuff. pub eth_rpc_url: String, @@ -391,7 +391,7 @@ pub struct BridgeCliConfig { /// - Base64 encoded `privkey` for Raw key /// - Hex encoded `privkey` for Raw key /// At least one of `iota_key_path` or `eth_key_path` must be provided. - /// If only one is provided, it will be used for both Iota and Eth. + /// If only one is provided, it will be used for both IOTA and Eth. pub iota_key_path: Option, /// See `iota_key_path`. Must be Secp256k1 key. pub eth_key_path: Option, @@ -400,7 +400,7 @@ pub struct BridgeCliConfig { impl Config for BridgeCliConfig {} pub struct LoadedBridgeCliConfig { - /// Rpc url for Iota fullnode, used for query stuff and submit transactions. + /// Rpc url for IOTA fullnode, used for query stuff and submit transactions. pub iota_rpc_url: String, /// Rpc url for Eth fullnode, used for query stuff. pub eth_rpc_url: String, @@ -412,7 +412,7 @@ pub struct LoadedBridgeCliConfig { pub eth_bridge_config_proxy_address: EthAddress, /// Proxy address for BridgeLimiter deployed on Eth pub eth_bridge_limiter_proxy_address: EthAddress, - /// Key pair for Iota operations + /// Key pair for IOTA operations iota_key: IotaKeyPair, /// Key pair for Eth operations, must be Secp256k1 key eth_signer: EthSigner, @@ -469,7 +469,7 @@ impl LoadedBridgeCliConfig { let eth_address = eth_signer.address(); let eth_chain_id = provider.get_chainid().await?; let iota_address = IotaAddress::from(&iota_key.public()); - println!("Using Iota address: {:?}", iota_address); + println!("Using IOTA address: {:?}", iota_address); println!("Using Eth address: {:?}", eth_address); println!("Using Eth chain: {:?}", eth_chain_id); @@ -504,7 +504,7 @@ impl LoadedBridgeCliConfig { .get_coins(iota_client_address, None, None, None) .await? .data; - // TODO: is 5 Iota a good number? + // TODO: is 5 IOTA a good number? let gas = gases .into_iter() .find(|coin| coin.balance >= 5_000_000_000) @@ -517,31 +517,31 @@ impl LoadedBridgeCliConfig { } } #[derive(Parser)] -#[clap(rename_all = "kebab-case")] +#[command(rename_all = "kebab-case")] pub enum BridgeClientCommands { - #[clap(name = "deposit-native-ether-on-eth")] + #[command(name = "deposit-native-ether-on-eth")] DepositNativeEtherOnEth { - #[clap(long)] + #[arg(long)] ether_amount: f64, - #[clap(long)] + #[arg(long)] target_chain: u8, - #[clap(long)] + #[arg(long)] iota_recipient_address: IotaAddress, }, - #[clap(name = "deposit-on-iota")] + #[command(name = "deposit-on-iota")] DepositOnIota { - #[clap(long)] + #[arg(long)] coin_object_id: ObjectID, - #[clap(long)] + #[arg(long)] coin_type: String, - #[clap(long)] + #[arg(long)] target_chain: u8, - #[clap(long)] + #[arg(long)] recipient_address: EthAddress, }, - #[clap(name = "claim-on-eth")] + #[command(name = "claim-on-eth")] ClaimOnEth { - #[clap(long)] + #[arg(long)] seq_num: u64, }, } @@ -665,7 +665,7 @@ async fn deposit_on_iota( ); let signed_tx = Transaction::from_data(tx_data, vec![sig]); let tx_digest = *signed_tx.digest(); - info!(?tx_digest, "Sending deposit transction to Iota."); + info!(?tx_digest, "Sending deposit transction to IOTA."); let resp = iota_bridge_client .execute_transaction_block_with_effects(signed_tx) .await @@ -715,7 +715,7 @@ async fn claim_on_eth( let message = eth_iota_bridge::Message::from(parsed_message); let tx = eth_iota_bridge.transfer_bridged_tokens_with_signatures(signatures, message); let _eth_claim_tx_receipt = tx.send().await.unwrap().await.unwrap().unwrap(); - info!("Iota to Eth bridge transfer claimed"); + info!("IOTA to Eth bridge transfer claimed"); Ok(()) } diff --git a/crates/iota-bridge-cli/src/main.rs b/crates/iota-bridge-cli/src/main.rs index ed90c1d7c2e..0a4f1b44304 100644 --- a/crates/iota-bridge-cli/src/main.rs +++ b/crates/iota-bridge-cli/src/main.rs @@ -99,7 +99,7 @@ async fn main() -> anyhow::Result<()> { ); let agg = BridgeAuthorityAggregator::new(bridge_committee); - // Handle Iota Side + // Handle IOTA Side if chain_id.is_iota_chain() { let iota_chain_id = BridgeChainId::try_from(bridge_summary.chain_id).unwrap(); assert_eq!( @@ -109,7 +109,7 @@ async fn main() -> anyhow::Result<()> { ); // Create BridgeAction let iota_action = make_action(iota_chain_id, &cmd); - println!("Action to execute on Iota: {:?}", iota_action); + println!("Action to execute on IOTA: {:?}", iota_action); let certified_action = agg .request_committee_signatures(iota_action) .await @@ -144,10 +144,10 @@ async fn main() -> anyhow::Result<()> { .await .expect("Failed to execute transaction block with effects"); if resp.status_ok().unwrap() { - println!("Iota Transaction succeeded: {:?}", resp.digest); + println!("IOTA Transaction succeeded: {:?}", resp.digest); } else { println!( - "Iota Transaction failed: {:?}. Effects: {:?}", + "IOTA Transaction failed: {:?}. Effects: {:?}", resp.digest, resp.effects ); } diff --git a/crates/iota-bridge-indexer/config.yaml b/crates/iota-bridge-indexer/config.yaml index 5ce78b55a94..2363925284f 100644 --- a/crates/iota-bridge-indexer/config.yaml +++ b/crates/iota-bridge-indexer/config.yaml @@ -12,7 +12,7 @@ # concurrency: 1 # Bridge genesis checkpoint in IOTA, for testnet = 43917829 # bridge_genesis_checkpoint: -# Ethereum to Iota bridge contract address +# Ethereum to IOTA bridge contract address # eth_iota_bridge_contract_address: # Starting block number # start_block: @@ -23,4 +23,4 @@ # checkpoint size of each backfill worker, use 432000 for 1 worker per day, assume 5 checkpoint per second # back_fill_lot_size: # Optional starting checkpoint for realtime ingestion task -# resume_from_checkpoint: +# resume_from_checkpoint: diff --git a/crates/iota-bridge-indexer/src/iota_bridge_indexer.rs b/crates/iota-bridge-indexer/src/iota_bridge_indexer.rs index a1f6be3d743..82673332753 100644 --- a/crates/iota-bridge-indexer/src/iota_bridge_indexer.rs +++ b/crates/iota-bridge-indexer/src/iota_bridge_indexer.rs @@ -234,7 +234,7 @@ fn process_iota_event( Ok(if ev.type_.address == BRIDGE_ADDRESS { match ev.type_.name.as_str() { "TokenDepositedEvent" => { - info!("Observed Iota Deposit {:?}", ev); + info!("Observed IOTA Deposit {:?}", ev); // todo: metrics.total_iota_token_deposited.inc(); let move_event: MoveTokenDepositedEvent = bcs::from_bytes(&ev.contents)?; Some(ProcessedTxnData::TokenTransfer(TokenTransfer { @@ -257,7 +257,7 @@ fn process_iota_event( })) } "TokenTransferApproved" => { - info!("Observed Iota Approval {:?}", ev); + info!("Observed IOTA Approval {:?}", ev); // todo: metrics.total_iota_token_transfer_approved.inc(); let event: MoveTokenTransferApproved = bcs::from_bytes(&ev.contents)?; Some(ProcessedTxnData::TokenTransfer(TokenTransfer { @@ -274,7 +274,7 @@ fn process_iota_event( })) } "TokenTransferClaimed" => { - info!("Observed Iota Claim {:?}", ev); + info!("Observed IOTA Claim {:?}", ev); // todo: metrics.total_iota_token_transfer_claimed.inc(); let event: MoveTokenTransferClaimed = bcs::from_bytes(&ev.contents)?; Some(ProcessedTxnData::TokenTransfer(TokenTransfer { diff --git a/crates/iota-bridge-indexer/src/iota_transaction_handler.rs b/crates/iota-bridge-indexer/src/iota_transaction_handler.rs index 5317677a84c..30d88b05c17 100644 --- a/crates/iota-bridge-indexer/src/iota_transaction_handler.rs +++ b/crates/iota-bridge-indexer/src/iota_transaction_handler.rs @@ -92,7 +92,7 @@ pub fn into_token_transfers( } match ev.type_.name.as_str() { "TokenDepositedEvent" => { - info!("Observed Iota Deposit {:?}", ev); + info!("Observed IOTA Deposit {:?}", ev); metrics.total_iota_token_deposited.inc(); let move_event: MoveTokenDepositedEvent = bcs::from_bytes(&ev.bcs)?; transfers.push(ProcessedTxnData::TokenTransfer(TokenTransfer { @@ -115,7 +115,7 @@ pub fn into_token_transfers( })); } "TokenTransferApproved" => { - info!("Observed Iota Approval {:?}", ev); + info!("Observed IOTA Approval {:?}", ev); metrics.total_iota_token_transfer_approved.inc(); let event: MoveTokenTransferApproved = bcs::from_bytes(&ev.bcs)?; transfers.push(ProcessedTxnData::TokenTransfer(TokenTransfer { @@ -132,7 +132,7 @@ pub fn into_token_transfers( })); } "TokenTransferClaimed" => { - info!("Observed Iota Claim {:?}", ev); + info!("Observed IOTA Claim {:?}", ev); metrics.total_iota_token_transfer_claimed.inc(); let event: MoveTokenTransferClaimed = bcs::from_bytes(&ev.bcs)?; transfers.push(ProcessedTxnData::TokenTransfer(TokenTransfer { diff --git a/crates/iota-bridge-indexer/src/main.rs b/crates/iota-bridge-indexer/src/main.rs index 4d96bad8a90..15055fd00b5 100644 --- a/crates/iota-bridge-indexer/src/main.rs +++ b/crates/iota-bridge-indexer/src/main.rs @@ -33,7 +33,7 @@ use tracing::info; #[derive(Parser, Clone, Debug)] struct Args { /// Path to a yaml config - #[clap(long, short)] + #[arg(long, short)] config_path: Option, } diff --git a/crates/iota-bridge/src/action_executor.rs b/crates/iota-bridge/src/action_executor.rs index a1070ae3aab..75b6e1a268d 100644 --- a/crates/iota-bridge/src/action_executor.rs +++ b/crates/iota-bridge/src/action_executor.rs @@ -485,7 +485,7 @@ where return; } - info!("Building Iota transaction"); + info!("Building IOTA transaction"); let rgp = iota_client.get_reference_gas_price_until_success().await; let tx_data = match build_iota_transaction( *iota_address, @@ -527,7 +527,7 @@ where return; } - info!(?tx_digest, ?gas_object_ref, "Sending transaction to Iota"); + info!(?tx_digest, ?gas_object_ref, "Sending transaction to IOTA"); match iota_client .execute_transaction_block_with_effects(signed_tx) .await @@ -541,7 +541,7 @@ where error!( ?action_key, ?tx_digest, - "Iota transaction failed at signing: {err:?}" + "IOTA transaction failed at signing: {err:?}" ); metrics.err_iota_transaction_submission.inc(); let metrics_clone = metrics.clone(); @@ -599,7 +599,7 @@ where "Expected TokenTransferAlreadyClaimed, TokenTransferClaimed, TokenTransferApproved or TokenTransferAlreadyApproved event but got: {:?}", events, ); - info!(?tx_digest, "Iota transaction executed successfully"); + info!(?tx_digest, "IOTA transaction executed successfully"); store .remove_pending_actions(&[action.digest()]) .unwrap_or_else(|e| { @@ -617,7 +617,7 @@ where metrics.err_iota_transaction_execution.inc(); error!( ?tx_digest, - "Manual intervention is needed. Iota transaction executed and failed with error: {error:?}" + "Manual intervention is needed. IOTA transaction executed and failed with error: {error:?}" ); } } diff --git a/crates/iota-bridge/src/config.rs b/crates/iota-bridge/src/config.rs index 1714fe4270a..f1f37a81419 100644 --- a/crates/iota-bridge/src/config.rs +++ b/crates/iota-bridge/src/config.rs @@ -67,9 +67,9 @@ pub struct EthConfig { #[derive(Clone, Debug, Deserialize, Serialize)] #[serde(rename_all = "kebab-case")] pub struct IotaConfig { - /// Rpc url for Iota fullnode, used for query stuff and submit transactions. + /// Rpc url for IOTA fullnode, used for query stuff and submit transactions. pub iota_rpc_url: String, - /// The expected BridgeChainId on Iota side. + /// The expected BridgeChainId on IOTA side. pub iota_bridge_chain_id: u8, /// Path of the file where bridge client key (any IotaKeyPair) is stored. /// If `run_client` is true, and this is None, then use @@ -114,7 +114,7 @@ pub struct BridgeNodeConfig { /// A list of approved governance actions. Action in this list will be /// signed when requested by client. pub approved_governance_actions: Vec, - /// Iota configuration + /// IOTA configuration pub iota: IotaConfig, /// Eth configuration pub eth: EthConfig, @@ -132,7 +132,7 @@ impl BridgeNodeConfig { BridgeChainId::try_from(self.eth.eth_bridge_chain_id)?, ) { return Err(anyhow!( - "Route between Iota chain id {} and Eth chain id {} is not valid", + "Route between IOTA chain id {} and Eth chain id {} is not valid", self.iota.iota_bridge_chain_id, self.eth.eth_bridge_chain_id, )); @@ -308,12 +308,12 @@ impl BridgeNodeConfig { Some(path) => read_key(path, false), }?; - // If bridge chain id is Iota Mainent or Testnet, we expect to see chain + // If bridge chain id is IOTA Mainent or Testnet, we expect to see chain // identifier to match accordingly. let iota_identifier = iota_client .get_chain_identifier() .await - .map_err(|e| anyhow!("Error getting chain identifier from Iota: {:?}", e))?; + .map_err(|e| anyhow!("Error getting chain identifier from IOTA: {:?}", e))?; if self.iota.iota_bridge_chain_id == BridgeChainId::IotaMainnet as u8 && iota_identifier != get_mainnet_chain_identifier().to_string() { @@ -333,7 +333,7 @@ impl BridgeNodeConfig { ); } info!( - "Connected to Iota chain: {}, Bridge chain id: {}", + "Connected to IOTA chain: {}, Bridge chain id: {}", iota_identifier, self.iota.iota_bridge_chain_id, ); @@ -428,11 +428,11 @@ pub async fn pick_highest_balance_coin( }) .await; if highest_balance_coin.is_none() { - return Err(anyhow!("No Iota coins found for address {:?}", address)); + return Err(anyhow!("No IOTA coins found for address {:?}", address)); } if highest_balance < minimal_amount { return Err(anyhow!( - "Found no single coin that has >= {} balance Iota for address {:?}", + "Found no single coin that has >= {} balance IOTA for address {:?}", minimal_amount, address, )); diff --git a/crates/iota-bridge/src/e2e_tests/basic.rs b/crates/iota-bridge/src/e2e_tests/basic.rs index d752a8322f1..3b4e3ebe738 100644 --- a/crates/iota-bridge/src/e2e_tests/basic.rs +++ b/crates/iota-bridge/src/e2e_tests/basic.rs @@ -152,7 +152,7 @@ async fn test_bridge_from_eth_to_iota_to_eth() { let call = eth_iota_bridge.transfer_bridged_tokens_with_signatures(signatures, message); let eth_claim_tx_receipt = send_eth_tx_and_get_tx_receipt(call).await; assert_eq!(eth_claim_tx_receipt.status.unwrap().as_u64(), 1); - info!("Iota to Eth bridge transfer claimed"); + info!("IOTA to Eth bridge transfer claimed"); // Assert eth_address_1 has received ETH assert_eq!( eth_signer.get_balance(eth_address_1, None).await.unwrap(), @@ -160,7 +160,7 @@ async fn test_bridge_from_eth_to_iota_to_eth() { ); } -// Test add new coins on both Iota and Eth +// Test add new coins on both IOTA and Eth // Also test bridge node handling `NewTokenEvent`` #[tokio::test(flavor = "multi_thread", worker_threads = 8)] #[ignore = "https://github.com/iotaledger/iota/issues/3224"] @@ -175,7 +175,7 @@ async fn test_add_new_coins_on_iota_and_eth() { let bridge_arg = bridge_test_cluster.get_mut_bridge_arg().await.unwrap(); - // Register tokens on Iota + // Register tokens on IOTA let token_id = 5; let token_iota_decimal = 9; // this needs to match ka.move let token_price = 10000; @@ -258,7 +258,7 @@ async fn test_add_new_coins_on_iota_and_eth() { _ => false, } })); - info!("Approved new token on Iota"); + info!("Approved new token on IOTA"); // Assert new token is correctly added let treasury_summary = bridge_test_cluster @@ -456,7 +456,7 @@ pub async fn initiate_bridge_erc20_to_iota( .tap_ok(|_| { info!( nonce, - token_id, amount_u64, "Eth to Iota bridge transfer claimed" + token_id, amount_u64, "Eth to IOTA bridge transfer claimed" ); }) } @@ -477,7 +477,7 @@ pub async fn initiate_bridge_eth_to_iota( let eth_chain_id = bridge_test_cluster.eth_chain_id(); let token_id = TOKEN_ID_ETH; - let iota_amount = (U256::from(amount) * U256::exp10(8)).as_u64(); // DP for Ether on Iota + let iota_amount = (U256::from(amount) * U256::exp10(8)).as_u64(); // DP for Ether on IOTA let eth_tx = deposit_native_eth_to_sol_contract( ð_signer, @@ -517,7 +517,7 @@ pub async fn initiate_bridge_eth_to_iota( ) .await .tap_ok(|_| { - info!("Eth to Iota bridge transfer claimed"); + info!("Eth to IOTA bridge transfer claimed"); }) } @@ -554,7 +554,7 @@ pub async fn initiate_bridge_iota_to_eth( { Ok(resp) => { if !resp.status_ok().unwrap() { - return Err(anyhow!("Iota TX error")); + return Err(anyhow!("IOTA TX error")); } else { resp } @@ -604,7 +604,7 @@ pub async fn initiate_bridge_iota_to_eth( ) .await .unwrap(); - info!("Iota to Eth bridge transfer approved."); + info!("IOTA to Eth bridge transfer approved."); Ok(bridge_event) } diff --git a/crates/iota-bridge/src/e2e_tests/complex.rs b/crates/iota-bridge/src/e2e_tests/complex.rs index c258002c824..76ab551688c 100644 --- a/crates/iota-bridge/src/e2e_tests/complex.rs +++ b/crates/iota-bridge/src/e2e_tests/complex.rs @@ -62,7 +62,7 @@ async fn test_iota_bridge_paused() { initiate_bridge_eth_to_iota(&bridge_test_cluster, 10, 0) .await .unwrap(); - // verify Eth was transferred to Iota address + // verify Eth was transferred to IOTA address let eth_coin_type = iota_token_type_tags.get(&TOKEN_ID_ETH).unwrap(); let eth_coin = bridge_client .iota_client() @@ -111,10 +111,10 @@ async fn test_iota_bridge_paused() { // verify bridge paused assert!(bridge_client.get_bridge_summary().await.unwrap().is_frozen); - // Transfer from eth to iota should fail on Iota + // Transfer from eth to iota should fail on IOTA let eth_to_iota_bridge_action = initiate_bridge_eth_to_iota(&bridge_test_cluster, 10, 1).await; assert!(eth_to_iota_bridge_action.is_err()); - // message should not be recorded on Iota when the bridge is paused + // message should not be recorded on IOTA when the bridge is paused let res = bridge_test_cluster .bridge_client() .get_token_transfer_action_onchain_status_until_success( @@ -123,7 +123,7 @@ async fn test_iota_bridge_paused() { ) .await; assert_eq!(BridgeActionStatus::NotFound, res); - // Transfer from Iota to eth should fail + // Transfer from IOTA to eth should fail let iota_to_eth_bridge_action = initiate_bridge_iota_to_eth( &bridge_test_cluster, EthAddress::random(), diff --git a/crates/iota-bridge/src/error.rs b/crates/iota-bridge/src/error.rs index de290334a58..cd344de337c 100644 --- a/crates/iota-bridge/src/error.rs +++ b/crates/iota-bridge/src/error.rs @@ -18,7 +18,7 @@ pub enum BridgeError { NoBridgeEventsInTxPosition, // Found a bridge event but not in a recognized Eth bridge contract BridgeEventInUnrecognizedEthContract, - // Found a bridge event but not in a recognized Iota bridge package + // Found a bridge event but not in a recognized IOTA bridge package BridgeEventInUnrecognizedIotaPackage, // Found BridgeEvent but not BridgeAction BridgeEventNotActionable, @@ -60,7 +60,7 @@ pub enum BridgeError { AuthorityUrlInvalid, // Action is not token transfer ActionIsNotTokenTransferAction, - // Iota transaction failure due to generic error + // IOTA transaction failure due to generic error IotaTxFailureGeneric(String), // Zero value bridge transfer should not be allowed ZeroValueBridgeTransfer(String), diff --git a/crates/iota-bridge/src/events.rs b/crates/iota-bridge/src/events.rs index 101db3aca1c..7d6ae66f936 100644 --- a/crates/iota-bridge/src/events.rs +++ b/crates/iota-bridge/src/events.rs @@ -221,7 +221,7 @@ pub struct EmittedIotaToEthTokenBridgeV1 { pub iota_address: IotaAddress, pub eth_address: EthAddress, pub token_id: u8, - // The amount of tokens deposited with decimal points on Iota side + // The amount of tokens deposited with decimal points on IOTA side pub amount_iota_adjusted: u64, } diff --git a/crates/iota-bridge/src/iota_client.rs b/crates/iota-bridge/src/iota_client.rs index 63da0c725c8..3d7ed87baf3 100644 --- a/crates/iota-bridge/src/iota_client.rs +++ b/crates/iota-bridge/src/iota_client.rs @@ -58,7 +58,7 @@ impl IotaBridgeClient { .build(rpc_url) .await .map_err(|e| { - anyhow!("Can't establish connection with Iota Rpc {rpc_url}. Error: {e}") + anyhow!("Can't establish connection with IOTA Rpc {rpc_url}. Error: {e}") })?; let self_ = Self { inner }; self_.describe().await?; @@ -132,7 +132,7 @@ where Ok(events) } - /// Returns BridgeAction from a Iota Transaction with transaction hash + /// Returns BridgeAction from an IOTA Transaction with transaction hash /// and the event index. If event is declared in an unrecognized /// package, return error. pub async fn get_bridge_action_by_tx_digest_and_event_idx_maybe( @@ -792,7 +792,7 @@ mod tests { .await; let id_token_map = iota_client.get_token_id_map().await.unwrap(); - // 1. Create a Eth -> Iota Transfer (recipient is sender address), approve with + // 1. Create a Eth -> IOTA Transfer (recipient is sender address), approve with // validator secrets and assert its status to be Claimed let action = get_test_eth_to_iota_bridge_action(None, Some(usdc_amount), Some(sender), None); @@ -818,7 +818,7 @@ mod tests { .unwrap(); assert_eq!(status, BridgeActionStatus::Claimed); - // 2. Create a Iota -> Eth Transfer, approve with validator secrets and assert + // 2. Create an IOTA -> Eth Transfer, approve with validator secrets and assert // its status to be Approved // We need to actually send tokens to bridge to initialize the record. let eth_recv_address = EthAddress::random(); diff --git a/crates/iota-bridge/src/iota_mock_client.rs b/crates/iota-bridge/src/iota_mock_client.rs index acf4fa4fd27..c7738276cda 100644 --- a/crates/iota-bridge/src/iota_mock_client.rs +++ b/crates/iota-bridge/src/iota_mock_client.rs @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -//! A mock implementation of Iota JSON-RPC client. +//! A mock implementation of IOTA JSON-RPC client. use std::{ collections::{HashMap, VecDeque}, diff --git a/crates/iota-bridge/src/iota_syncer.rs b/crates/iota-bridge/src/iota_syncer.rs index dfc7a40cb85..fbfaa506cdf 100644 --- a/crates/iota-bridge/src/iota_syncer.rs +++ b/crates/iota-bridge/src/iota_syncer.rs @@ -3,7 +3,7 @@ // SPDX-License-Identifier: Apache-2.0 //! The IotaSyncer module is responsible for synchronizing Events emitted -//! on Iota blockchain from concerned modules of bridge package 0x9. +//! on IOTA blockchain from concerned modules of bridge package 0x9. use std::{collections::HashMap, sync::Arc}; @@ -106,11 +106,11 @@ where events_sender .send((module.clone(), events.data)) .await - .expect("All Iota event channel receivers are closed"); + .expect("All IOTA event channel receivers are closed"); if let Some(next) = events.next_cursor { cursor = Some(next); } - tracing::info!(?module, ?cursor, "Observed {len} new Iota events"); + tracing::info!(?module, ?cursor, "Observed {len} new IOTA events"); } } } diff --git a/crates/iota-bridge/src/iota_transaction_builder.rs b/crates/iota-bridge/src/iota_transaction_builder.rs index 550f5d83d74..c39891ab2fc 100644 --- a/crates/iota-bridge/src/iota_transaction_builder.rs +++ b/crates/iota-bridge/src/iota_transaction_builder.rs @@ -80,7 +80,7 @@ pub fn build_iota_transaction( rgp, ), BridgeAction::EvmContractUpgradeAction(_) => { - // It does not need a Iota tranaction to execute EVM contract upgrade + // It does not need an IOTA tranaction to execute EVM contract upgrade unreachable!() } BridgeAction::AddTokensOnIotaAction(_) => build_add_tokens_on_iota_transaction( @@ -91,7 +91,7 @@ pub fn build_iota_transaction( rgp, ), BridgeAction::AddTokensOnEvmAction(_) => { - // It does not need a Iota tranaction to add tokens on EVM + // It does not need an IOTA tranaction to add tokens on EVM unreachable!() } } @@ -672,7 +672,7 @@ mod tests { .await; let id_token_map = iota_client.get_token_id_map().await.unwrap(); - // 1. Test Eth -> Iota Transfer approval + // 1. Test Eth -> IOTA Transfer approval let action = get_test_eth_to_iota_bridge_action(None, Some(usdc_amount), Some(sender), None); // `approve_action_with_validator_secrets` covers transaction building @@ -687,7 +687,7 @@ mod tests { .await .unwrap(); - // 2. Test Iota -> Eth Transfer approval + // 2. Test IOTA -> Eth Transfer approval let bridge_event = bridge_token( context, EthAddress::random(), diff --git a/crates/iota-bridge/src/main.rs b/crates/iota-bridge/src/main.rs index ee238ba4165..81ebf611b97 100644 --- a/crates/iota-bridge/src/main.rs +++ b/crates/iota-bridge/src/main.rs @@ -19,11 +19,9 @@ use tracing::info; bin_version::bin_version!(); #[derive(Parser)] -#[clap(rename_all = "kebab-case")] -#[clap(name = env!("CARGO_BIN_NAME"))] -#[clap(version = VERSION)] +#[command(rename_all = "kebab-case", name = env!("CARGO_BIN_NAME"), version = VERSION)] struct Args { - #[clap(long)] + #[arg(long)] pub config_path: PathBuf, } diff --git a/crates/iota-bridge/src/orchestrator.rs b/crates/iota-bridge/src/orchestrator.rs index 8604d0fe28d..c44e162f5bb 100644 --- a/crates/iota-bridge/src/orchestrator.rs +++ b/crates/iota-bridge/src/orchestrator.rs @@ -3,7 +3,7 @@ // SPDX-License-Identifier: Apache-2.0 //! `BridgeOrchestrator` is the component that: -//! 1. monitors Iota and Ethereum events with the help of `IotaSyncer` and +//! 1. monitors IOTA and Ethereum events with the help of `IotaSyncer` and //! `EthSyncer` //! 2. updates WAL table and cursor tables //! 2. hands actions to `BridgeExecutor` for execution @@ -117,7 +117,7 @@ where if events.is_empty() { continue; } - info!("Received {} Iota events: {:?}", events.len(), events); + info!("Received {} IOTA events: {:?}", events.len(), events); metrics .iota_watcher_received_events .inc_by(events.len() as u64); @@ -134,7 +134,7 @@ where } Err(e) => { panic!( - "Iota Event could not be deserialzed to IotaBridgeEvent: {:?}", + "IOTA Event could not be deserialzed to IotaBridgeEvent: {:?}", e ); } @@ -147,12 +147,12 @@ where if opt_bridge_event.is_none() { // TODO: we probably should not miss any events, log for now. metrics.iota_watcher_unrecognized_events.inc(); - error!("Iota event not recognized: {:?}", iota_event); + error!("IOTA event not recognized: {:?}", iota_event); continue; } // Unwrap safe: checked above let bridge_event: IotaBridgeEvent = opt_bridge_event.unwrap(); - info!("Observed Iota bridge event: {:?}", bridge_event); + info!("Observed IOTA bridge event: {:?}", bridge_event); // Send event to monitor monitor_tx @@ -169,7 +169,7 @@ where if !actions.is_empty() { info!( - "Received {} actions from Iota: {:?}", + "Received {} actions from IOTA: {:?}", actions.len(), actions ); @@ -193,7 +193,7 @@ where .update_iota_event_cursor(identifier, cursor) .expect("Store operation should not fail"); } - panic!("Iota event channel was closed unexpectedly"); + panic!("IOTA event channel was closed unexpectedly"); } async fn run_eth_watcher( diff --git a/crates/iota-bridge/src/server/handler.rs b/crates/iota-bridge/src/server/handler.rs index 951a6869b73..b1292bf3e44 100644 --- a/crates/iota-bridge/src/server/handler.rs +++ b/crates/iota-bridge/src/server/handler.rs @@ -28,7 +28,7 @@ use crate::{ #[async_trait] pub trait BridgeRequestHandlerTrait { /// Handles a request to sign a BridgeAction that bridges assets - /// from Ethereum to Iota. The inputs are a transaction hash on Ethereum + /// from Ethereum to IOTA. The inputs are a transaction hash on Ethereum /// that emitted the bridge event and the Event index in that transaction async fn handle_eth_tx_hash( &self, @@ -36,7 +36,7 @@ pub trait BridgeRequestHandlerTrait { event_idx: u16, ) -> Result, BridgeError>; /// Handles a request to sign a BridgeAction that bridges assets - /// from Iota to Ethereum. The inputs are a transaction digest on Iota + /// from IOTA to Ethereum. The inputs are a transaction digest on IOTA /// that emitted the bridge event and the Event index in that transaction async fn handle_iota_tx_digest( &self, @@ -80,7 +80,7 @@ where self.iota_client .get_bridge_action_by_tx_digest_and_event_idx_maybe(&tx_digest, event_idx) .await - .tap_ok(|action| info!("Iota action found: {:?}", action)) + .tap_ok(|action| info!("IOTA action found: {:?}", action)) } } diff --git a/crates/iota-bridge/src/server/mod.rs b/crates/iota-bridge/src/server/mod.rs index 2085b4cc19e..a6affca3caf 100644 --- a/crates/iota-bridge/src/server/mod.rs +++ b/crates/iota-bridge/src/server/mod.rs @@ -424,7 +424,7 @@ async fn handle_add_tokens_on_iota( if !chain_id.is_iota_chain() { return Err(BridgeError::InvalidBridgeClientRequest( - "handle_add_tokens_on_iota only expects Iota chain id".to_string(), + "handle_add_tokens_on_iota only expects IOTA chain id".to_string(), )); } @@ -505,7 +505,7 @@ async fn handle_add_tokens_on_evm( })?; if chain_id.is_iota_chain() { return Err(BridgeError::InvalidBridgeClientRequest( - "handle_add_tokens_on_evm does not expect Iota chain id".to_string(), + "handle_add_tokens_on_evm does not expect IOTA chain id".to_string(), )); } diff --git a/crates/iota-bridge/src/test_utils.rs b/crates/iota-bridge/src/test_utils.rs index 5a4bda4f769..00a02d95d64 100644 --- a/crates/iota-bridge/src/test_utils.rs +++ b/crates/iota-bridge/src/test_utils.rs @@ -336,7 +336,7 @@ pub fn get_certified_action_with_validator_secrets( /// Approve a bridge action with the given validator secrets. Return the /// newly created token object reference if `expected_token_receiver` is Some -/// (only relevant when the action is eth -> Iota transfer), +/// (only relevant when the action is eth -> IOTA transfer), /// Otherwise return None. /// Note: for iota -> eth transfers, the actual deposit needs to be recorded. /// Use `bridge_token` to do it. diff --git a/crates/iota-bridge/src/types.rs b/crates/iota-bridge/src/types.rs index 334a679ef02..2b1e669a1b1 100644 --- a/crates/iota-bridge/src/types.rs +++ b/crates/iota-bridge/src/types.rs @@ -343,7 +343,7 @@ pub struct AddTokensOnEvmAction { #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash)] #[enum_dispatch(BridgeMessageEncoding)] pub enum BridgeAction { - /// Iota to Eth bridge action + /// IOTA to Eth bridge action IotaToEthBridgeAction(IotaToEthBridgeAction), /// Eth to iota bridge action EthToIotaBridgeAction(EthToIotaBridgeAction), diff --git a/crates/iota-bridge/src/utils.rs b/crates/iota-bridge/src/utils.rs index 91b9549ddfe..4f342e6c4ff 100644 --- a/crates/iota-bridge/src/utils.rs +++ b/crates/iota-bridge/src/utils.rs @@ -67,7 +67,7 @@ pub fn generate_bridge_authority_key_and_write_to_file( ); let iota_address = IotaAddress::from(&kp.public); println!( - "Corresponding Iota address by this ecdsa key: {:?}", + "Corresponding IOTA address by this ecdsa key: {:?}", iota_address ); let base64_encoded = kp.encode_base64(); @@ -94,7 +94,7 @@ pub fn generate_bridge_client_key_and_write_to_file( IotaKeyPair::from(kp) }; let iota_address = IotaAddress::from(&kp.public()); - println!("Corresponding Iota address by this key: {:?}", iota_address); + println!("Corresponding IOTA address by this key: {:?}", iota_address); let contents = kp.encode_base64(); std::fs::write(path, contents) @@ -168,7 +168,7 @@ pub fn examine_key(path: &PathBuf, is_validator_key: bool) -> Result<(), anyhow: kp.public().as_bytes().to_vec() } }; - println!("Corresponding Iota address: {:?}", iota_address); + println!("Corresponding IOTA address: {:?}", iota_address); println!("Corresponding PublicKey: {:?}", Hex::encode(pubkey)); Ok(()) } diff --git a/crates/iota-cluster-test/src/cluster.rs b/crates/iota-cluster-test/src/cluster.rs index 3c1d993f992..14375a8ae6c 100644 --- a/crates/iota-cluster-test/src/cluster.rs +++ b/crates/iota-cluster-test/src/cluster.rs @@ -34,16 +34,10 @@ use tracing::info; use super::config::{ClusterTestOpt, Env}; -const DEVNET_FAUCET_ADDR: &str = "https://faucet.devnet.iota.io:443"; -const STAGING_FAUCET_ADDR: &str = "https://faucet.staging.iota.io:443"; -const CONTINUOUS_FAUCET_ADDR: &str = "https://faucet.ci.iota.io:443"; -const CONTINUOUS_NOMAD_FAUCET_ADDR: &str = "https://faucet.nomad.ci.iota.io:443"; -const TESTNET_FAUCET_ADDR: &str = "https://faucet.testnet.iota.io:443"; -const DEVNET_FULLNODE_ADDR: &str = "https://rpc.devnet.iota.io:443"; -const STAGING_FULLNODE_ADDR: &str = "https://fullnode.staging.iota.io:443"; -const CONTINUOUS_FULLNODE_ADDR: &str = "https://fullnode.ci.iota.io:443"; -const CONTINUOUS_NOMAD_FULLNODE_ADDR: &str = "https://fullnode.nomad.ci.iota.io:443"; -const TESTNET_FULLNODE_ADDR: &str = "https://fullnode.testnet.iota.io:443"; +const DEVNET_FAUCET_ADDR: &str = "https://faucet.devnet.iota.cafe:443"; +const TESTNET_FAUCET_ADDR: &str = "https://faucet.testnet.iota.cafe:443"; +const DEVNET_FULLNODE_ADDR: &str = "https://api.devnet.iota.cafe:443"; +const TESTNET_FULLNODE_ADDR: &str = "https://api.testnet.iota.cafe:443"; pub struct ClusterFactory; @@ -94,18 +88,6 @@ impl Cluster for RemoteRunningCluster { String::from(DEVNET_FULLNODE_ADDR), String::from(DEVNET_FAUCET_ADDR), ), - Env::Staging => ( - String::from(STAGING_FULLNODE_ADDR), - String::from(STAGING_FAUCET_ADDR), - ), - Env::Ci => ( - String::from(CONTINUOUS_FULLNODE_ADDR), - String::from(CONTINUOUS_FAUCET_ADDR), - ), - Env::CiNomad => ( - String::from(CONTINUOUS_NOMAD_FULLNODE_ADDR), - String::from(CONTINUOUS_NOMAD_FAUCET_ADDR), - ), Env::Testnet => ( String::from(TESTNET_FULLNODE_ADDR), String::from(TESTNET_FAUCET_ADDR), @@ -195,7 +177,7 @@ impl Cluster for LocalNewCluster { // Check if we already have a config directory that is passed if let Some(config_dir) = options.config_dir.clone() { assert!(options.epoch_duration_ms.is_none()); - // Load the config of the Iota authority. + // Load the config of the IOTA authority. let network_config_path = config_dir.join(IOTA_NETWORK_CONFIG); let NetworkConfigLight { validator_configs, @@ -203,7 +185,7 @@ impl Cluster for LocalNewCluster { committee_with_network: _, } = PersistedConfig::read(&network_config_path).map_err(|err| { err.context(format!( - "Cannot open Iota network config file at {:?}", + "Cannot open IOTA network config file at {:?}", network_config_path )) })?; diff --git a/crates/iota-cluster-test/src/config.rs b/crates/iota-cluster-test/src/config.rs index 85814590fab..1877c5999e4 100644 --- a/crates/iota-cluster-test/src/config.rs +++ b/crates/iota-cluster-test/src/config.rs @@ -11,44 +11,39 @@ use regex::Regex; #[derive(Parser, Clone, ValueEnum, Debug)] pub enum Env { Devnet, - Staging, - Ci, - CiNomad, Testnet, CustomRemote, NewLocal, } #[derive(derive_more::Debug, Parser)] -#[clap(name = "", rename_all = "kebab-case")] +#[command(name = "", rename_all = "kebab-case")] pub struct ClusterTestOpt { - #[clap(value_enum)] + #[arg(value_enum)] pub env: Env, - #[clap(long)] + #[arg(long)] pub faucet_address: Option, - #[clap(long)] + #[arg(long)] pub fullnode_address: Option, - #[clap(long)] + #[arg(long)] pub epoch_duration_ms: Option, /// URL for the indexer RPC server - #[clap(long)] + #[arg(long)] pub indexer_address: Option, /// URL for the Indexer Postgres DB - #[clap(long)] + #[arg(long)] #[debug("{}", ObfuscatedPgAddress(pg_address))] pub pg_address: Option, - #[clap(long)] + #[arg(long)] pub config_dir: Option, /// URL for the indexer RPC server - #[clap(long)] + #[arg(long)] pub graphql_address: Option, /// Locations for local migration snapshots. - #[clap(long, name = "path")] - #[arg(num_args(0..))] + #[arg(long, name = "path", num_args(0..))] pub local_migration_snapshots: Vec, /// Remote migration snapshots. - #[clap(long, name = "iota|")] - #[arg(num_args(0..))] + #[arg(long, name = "iota|", num_args(0..))] pub remote_migration_snapshots: Vec, } diff --git a/crates/iota-cluster-test/src/helper.rs b/crates/iota-cluster-test/src/helper.rs index c25a6854e8e..2d60b4683f3 100644 --- a/crates/iota-cluster-test/src/helper.rs +++ b/crates/iota-cluster-test/src/helper.rs @@ -12,7 +12,7 @@ use iota_types::{ use move_core_types::language_storage::TypeTag; use tracing::{debug, trace}; -/// A util struct that helps verify Iota Object. +/// A util struct that helps verify IOTA Object. /// Use builder style to construct the conditions. /// When optionals fields are not set, related checks are omitted. /// Consuming functions such as `check` perform the check and panics if diff --git a/crates/iota-cluster-test/src/lib.rs b/crates/iota-cluster-test/src/lib.rs index 855ab846157..89a55318af0 100644 --- a/crates/iota-cluster-test/src/lib.rs +++ b/crates/iota-cluster-test/src/lib.rs @@ -79,7 +79,7 @@ impl TestContext { if gas_coins.len() < minimum_coins { panic!( - "Expect to get at least {minimum_coins} Iota Coins for address {addr}, but only got {}", + "Expect to get at least {minimum_coins} IOTA Coins for address {addr}, but only got {}", gas_coins.len() ) } diff --git a/crates/iota-common/src/sync/mod.rs b/crates/iota-common/src/sync/mod.rs index b474955f390..a5a1ba10fb2 100644 --- a/crates/iota-common/src/sync/mod.rs +++ b/crates/iota-common/src/sync/mod.rs @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -/// Low level utilities shared across Iota. +/// Low level utilities shared across IOTA. pub mod async_once_cell; pub mod notify_once; pub mod notify_read; diff --git a/crates/iota-config/data/fullnode-template-with-path.yaml b/crates/iota-config/data/fullnode-template-with-path.yaml index 12854a33135..dc95921b7c9 100644 --- a/crates/iota-config/data/fullnode-template-with-path.yaml +++ b/crates/iota-config/data/fullnode-template-with-path.yaml @@ -1,4 +1,4 @@ -# Update this value to the location you want Iota to store its database +# Update this value to the location you want IOTA to store its database db-path: "iotadb" # For ipv4, update this to "/ipv4/X.X.X.X/tcp/8080/http" diff --git a/crates/iota-config/data/fullnode-template.yaml b/crates/iota-config/data/fullnode-template.yaml index b161d62372b..9aa48c4e7ba 100644 --- a/crates/iota-config/data/fullnode-template.yaml +++ b/crates/iota-config/data/fullnode-template.yaml @@ -1,4 +1,4 @@ -# Update this value to the location you want Iota to store its database +# Update this value to the location you want IOTA to store its database db-path: "/opt/iota/db" # For ipv4, update this to "/ipv4/X.X.X.X/tcp/8080/http" diff --git a/crates/iota-config/src/genesis.rs b/crates/iota-config/src/genesis.rs index d7c850ca148..5be816f64ce 100644 --- a/crates/iota-config/src/genesis.rs +++ b/crates/iota-config/src/genesis.rs @@ -159,7 +159,7 @@ impl Genesis { pub fn iota_system_wrapper_object(&self) -> IotaSystemStateWrapper { get_iota_system_state_wrapper(&self.objects()) - .expect("Iota System State Wrapper object must always exist") + .expect("IOTA System State Wrapper object must always exist") } pub fn contains_migrations(&self) -> bool { @@ -167,7 +167,7 @@ impl Genesis { } pub fn iota_system_object(&self) -> IotaSystemState { - get_iota_system_state(&self.objects()).expect("Iota System State object must always exist") + get_iota_system_state(&self.objects()).expect("IOTA System State object must always exist") } pub fn clock(&self) -> Clock { @@ -321,11 +321,11 @@ impl UnsignedGenesis { pub fn iota_system_wrapper_object(&self) -> IotaSystemStateWrapper { get_iota_system_state_wrapper(&self.objects()) - .expect("Iota System State Wrapper object must always exist") + .expect("IOTA System State Wrapper object must always exist") } pub fn iota_system_object(&self) -> IotaSystemState { - get_iota_system_state(&self.objects()).expect("Iota System State object must always exist") + get_iota_system_state(&self.objects()).expect("IOTA System State object must always exist") } pub fn authenticator_state_object(&self) -> Option { @@ -454,7 +454,7 @@ impl TokenDistributionSchedule { for allocation in &self.allocations { total_nanos = total_nanos .checked_add(allocation.amount_nanos) - .expect("TokenDistributionSchedule allocates more than the maximum supply which equals u64::MAX", ); + .expect("TokenDistributionSchedule allocates more than the maximum supply which equals u64::MAX"); } } @@ -516,12 +516,7 @@ impl TokenDistributionSchedule { /// Helper to read a TokenDistributionSchedule from a csv file. /// /// The file is encoded such that the final entry in the CSV file is used to - /// denote the allocation to the stake subsidy fund. It must be in the - /// following format: - /// `0x0000000000000000000000000000000000000000000000000000000000000000, - ///
minted supply
,` - /// - /// All entries in a token distribution schedule must add up to 10B Iota. + /// denote the allocation to the stake subsidy fund. pub fn from_csv(reader: R) -> Result { let mut reader = csv::Reader::from_reader(reader); let mut allocations: Vec = @@ -568,7 +563,17 @@ impl TokenDistributionSchedule { #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "kebab-case")] pub struct TokenAllocation { + /// Indicates the address that owns the tokens. It means that this + /// `TokenAllocation` can serve to stake some funds to the + /// `staked_with_validator` during genesis, but it's the `recipient_address` + /// which will receive the associated StakedIota (or TimelockedStakedIota) + /// object. pub recipient_address: IotaAddress, + /// Indicates an amount of nanos that is: + /// - minted for the `recipient_address` and staked to a validator, only in + /// the case `staked_with_validator` is Some + /// - minted for the `recipient_address` and transferred that address, + /// otherwise. pub amount_nanos: u64, /// Indicates if this allocation should be staked at genesis and with which @@ -628,3 +633,117 @@ impl TokenDistributionScheduleBuilder { schedule } } + +/// Represents the allocation of stake and gas payment to a validator. +#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "kebab-case")] +pub struct ValidatorAllocation { + /// The validator address receiving the stake and/or gas payment + pub validator: IotaAddress, + /// The amount of nanos to stake to the validator + pub amount_nanos_to_stake: u64, + /// The amount of nanos to transfer as gas payment to the validator + pub amount_nanos_to_pay_gas: u64, +} + +/// Represents a delegation of stake and gas payment to a validator, +/// coming from a delegator. This struct is used to serialize and deserialize +/// delegations to and from a csv file. +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "kebab-case")] +pub struct Delegation { + /// The address from which to take the nanos for staking/gas + pub delegator: IotaAddress, + /// The allocation to a validator receiving a stake and/or a gas payment + #[serde(flatten)] + pub validator_allocation: ValidatorAllocation, +} + +/// Represents genesis delegations to validators. +/// +/// This struct maps a delegator address to a list of validators and their +/// stake and gas allocations. Each ValidatorAllocation contains the address of +/// a validator that will receive an amount of nanos to stake and an amount as +/// gas payment. +#[derive(Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "kebab-case")] +pub struct Delegations { + pub allocations: HashMap>, +} + +impl Delegations { + pub fn new_for_validators_with_default_allocation( + validators: impl IntoIterator, + delegator: IotaAddress, + ) -> Self { + let validator_allocations = validators + .into_iter() + .map(|address| ValidatorAllocation { + validator: address, + amount_nanos_to_stake: iota_types::governance::MIN_VALIDATOR_JOINING_STAKE_NANOS, + amount_nanos_to_pay_gas: 0, + }) + .collect(); + + let mut allocations = HashMap::new(); + allocations.insert(delegator, validator_allocations); + + Self { allocations } + } + + /// Helper to read a Delegations struct from a csv file. + /// + /// The file is encoded such that the final entry in the CSV file is used to + /// denote the allocation coming from a delegator. It must be in the + /// following format: + /// `delegator,validator,amount-nanos-to-stake,amount-nanos-to-pay-gas + /// ,,2000000000000000,5000000000 + /// ,,3000000000000000,5000000000 + /// ,,4500000000000000,5000000000` + pub fn from_csv(reader: R) -> Result { + let mut reader = csv::Reader::from_reader(reader); + + let mut delegations = Self::default(); + for delegation in reader.deserialize::() { + let delegation = delegation?; + delegations + .allocations + .entry(delegation.delegator) + .or_default() + .push(delegation.validator_allocation); + } + + Ok(delegations) + } + + /// Helper to write a Delegations struct into a csv file. + /// + /// It writes in the following format: + /// `delegator,validator,amount-nanos-to-stake,amount-nanos-to-pay-gas + /// ,,2000000000000000,5000000000 + /// ,,3000000000000000,5000000000 + /// ,,4500000000000000,5000000000` + pub fn to_csv(&self, writer: W) -> Result<()> { + let mut writer = csv::Writer::from_writer(writer); + + writer.write_record([ + "delegator", + "validator", + "amount-nanos-to-stake", + "amount-nanos-to-pay-gas", + ])?; + + for (&delegator, validator_allocations) in &self.allocations { + for validator_allocation in validator_allocations { + writer.write_record(&[ + delegator.to_string(), + validator_allocation.validator.to_string(), + validator_allocation.amount_nanos_to_stake.to_string(), + validator_allocation.amount_nanos_to_pay_gas.to_string(), + ])?; + } + } + + Ok(()) + } +} diff --git a/crates/iota-config/src/lib.rs b/crates/iota-config/src/lib.rs index bdb16c8865f..b098549321a 100644 --- a/crates/iota-config/src/lib.rs +++ b/crates/iota-config/src/lib.rs @@ -35,7 +35,7 @@ pub const IOTA_KEYSTORE_ALIASES_FILENAME: &str = "iota.aliases"; pub const IOTA_BENCHMARK_GENESIS_GAS_KEYSTORE_FILENAME: &str = "benchmark.keystore"; pub const IOTA_GENESIS_FILENAME: &str = "genesis.blob"; pub const IOTA_GENESIS_MIGRATION_TX_DATA_FILENAME: &str = "migration.blob"; -pub const IOTA_DEV_NET_URL: &str = "https://fullnode.devnet.iota.io:443"; +pub const IOTA_DEV_NET_URL: &str = "https://api.devnet.iota.cafe:443"; pub const AUTHORITIES_DB_NAME: &str = "authorities_db"; pub const CONSENSUS_DB_NAME: &str = "consensus_db"; diff --git a/crates/iota-config/src/node.rs b/crates/iota-config/src/node.rs index ddf63329504..441daddea72 100644 --- a/crates/iota-config/src/node.rs +++ b/crates/iota-config/src/node.rs @@ -151,6 +151,9 @@ pub struct NodeConfig { #[serde(default)] pub checkpoint_executor_config: CheckpointExecutorConfig, + #[serde(skip_serializing_if = "Option::is_none")] + pub metrics: Option, + /// In a `iota-node` binary, this is set to /// SupportedProtocolVersions::SYSTEM_DEFAULT in iota-node/src/main.rs. /// It is present in the config so that it can be changed by tests in @@ -308,7 +311,7 @@ pub fn default_zklogin_oauth_providers() -> BTreeMap> { fn default_transaction_kv_store_config() -> TransactionKeyValueStoreReadConfig { TransactionKeyValueStoreReadConfig { - base_url: "https://transactions.iota.io/".to_string(), + base_url: "https://transactions.iota.cafe/".to_string(), } } @@ -757,6 +760,15 @@ impl AuthorityStorePruningConfig { } } +#[derive(Debug, Clone, Deserialize, Serialize)] +#[serde(rename_all = "kebab-case")] +pub struct MetricsConfig { + #[serde(skip_serializing_if = "Option::is_none")] + pub push_interval_seconds: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub push_url: Option, +} + #[derive(Default, Debug, Clone, Deserialize, Serialize)] #[serde(rename_all = "kebab-case")] pub struct DBCheckpointConfig { diff --git a/crates/iota-config/src/p2p.rs b/crates/iota-config/src/p2p.rs index 58a43c224b0..21fa661c274 100644 --- a/crates/iota-config/src/p2p.rs +++ b/crates/iota-config/src/p2p.rs @@ -321,7 +321,7 @@ pub struct DiscoveryConfig { #[serde(skip_serializing_if = "Option::is_none")] pub access_type: Option, - /// Like `seed_peers` in `P2pConfig`, allowlisted peers will awlays be + /// Like `seed_peers` in `P2pConfig`, allowlisted peers will always be /// allowed to establish connection with this node regardless of the /// concurrency limit. Unlike `seed_peers`, a node does not reach out to /// `allowlisted_peers` preferentially. It is also used to determine if diff --git a/crates/iota-core/src/authority.rs b/crates/iota-core/src/authority.rs index d85c217974f..462adc8ca5a 100644 --- a/crates/iota-core/src/authority.rs +++ b/crates/iota-core/src/authority.rs @@ -847,6 +847,9 @@ impl AuthorityState { transaction: VerifiedTransaction, epoch_store: &Arc, ) -> IotaResult { + // Ensure that validator cannot reconfigure while we are signing the tx + let _execution_lock = self.execution_lock_for_signing().await; + let tx_digest = transaction.digest(); let tx_data = transaction.data().transaction_data(); @@ -930,16 +933,6 @@ impl AuthorityState { .start_timer(); self.metrics.tx_orders.inc(); - // The should_accept_user_certs check here is best effort, because - // between a validator signs a tx and a cert is formed, the validator - // could close the window. - if !epoch_store - .get_reconfig_state_read_lock_guard() - .should_accept_user_certs() - { - return Err(IotaError::ValidatorHaltedAtEpochEnd); - } - let signed = self.handle_transaction_impl(transaction, epoch_store).await; match signed { Ok(s) => { @@ -1593,7 +1586,7 @@ impl AuthorityState { let transaction_data = &certificate.data().intent_message().value; let (kind, signer, gas) = transaction_data.execution_parts(); - #[expect(unused_mut)] + #[cfg_attr(not(any(msim, fail_points)), expect(unused_mut))] let (inner_temp_store, _, mut effects, execution_error_opt) = epoch_store.executor().execute_transaction_to_effects( self.get_backing_store().as_ref(), @@ -2862,6 +2855,15 @@ impl AuthorityState { } } + /// Acquires the execution lock for the duration of a transaction signing + /// request. This prevents reconfiguration from starting until we are + /// finished handling the signing request. Otherwise, in-memory lock + /// state could be cleared (by `ObjectLocks::clear_cached_locks`) + /// while we are attempting to acquire locks for the transaction. + pub async fn execution_lock_for_signing(&self) -> ExecutionLockReadGuard { + self.execution_lock.read().await + } + pub async fn execution_lock_for_reconfiguration(&self) -> ExecutionLockWriteGuard { self.execution_lock.write().await } 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 cf080a649d9..01879a00b6d 100644 --- a/crates/iota-core/src/authority/authority_per_epoch_store.rs +++ b/crates/iota-core/src/authority/authority_per_epoch_store.rs @@ -572,8 +572,9 @@ pub struct AuthorityEpochTables { /// Transactions that are being deferred until some future time deferred_transactions: DBMap>, - /// Tables for recording state for RandomnessManager. + // Tables for recording state for RandomnessManager. + // /// Records messages processed from other nodes. Updated when receiving a /// new dkg::Message via consensus. pub(crate) dkg_processed_messages: DBMap, @@ -1358,8 +1359,8 @@ impl AuthorityPerEpochStore { Ok(result) } - /// `pending_certificates` table related methods. Should only be used from - /// TransactionManager. + // `pending_certificates` table related methods. + // Should only be used from TransactionManager. /// Gets all pending certificates. Used during recovery. pub fn all_pending_execution(&self) -> IotaResult> { diff --git a/crates/iota-core/src/authority/authority_store.rs b/crates/iota-core/src/authority/authority_store.rs index 2ae0de3fb71..9e0f9d31a2f 100644 --- a/crates/iota-core/src/authority/authority_store.rs +++ b/crates/iota-core/src/authority/authority_store.rs @@ -163,7 +163,7 @@ impl AuthorityStore { let epoch_start_configuration = if perpetual_tables.database_is_empty()? { info!("Creating new epoch start config from genesis"); - #[expect(unused_mut)] + #[cfg_attr(not(any(msim, fail_points)), expect(unused_mut))] let mut initial_epoch_flags = EpochFlag::default_flags_for_new_epoch(config); fail_point_arg!("initial_epoch_flags", |flags: Vec| { info!("Setting initial epoch flags to {:?}", flags); diff --git a/crates/iota-core/src/authority/shared_object_congestion_tracker.rs b/crates/iota-core/src/authority/shared_object_congestion_tracker.rs index 75b9a4c7053..6117b8eaefd 100644 --- a/crates/iota-core/src/authority/shared_object_congestion_tracker.rs +++ b/crates/iota-core/src/authority/shared_object_congestion_tracker.rs @@ -93,7 +93,8 @@ impl SharedObjectCongestionTracker { } let start_cost = self.compute_tx_start_at_cost(&shared_input_objects); - if start_cost + tx_cost <= max_accumulated_txn_cost_per_object_in_commit { + let (end_cost, cost_overflow) = start_cost.overflowing_add(tx_cost); + if !cost_overflow && end_cost <= max_accumulated_txn_cost_per_object_in_commit { return None; } @@ -148,12 +149,12 @@ impl SharedObjectCongestionTracker { let shared_input_objects: Vec<_> = cert.shared_input_objects().collect(); let start_cost = self.compute_tx_start_at_cost(&shared_input_objects); - let end_cost = start_cost + tx_cost; + let end_cost = start_cost.saturating_add(tx_cost); for obj in shared_input_objects { if obj.mutable { let old_end_cost = self.object_execution_cost.insert(obj.id, end_cost); - assert!(old_end_cost.is_none() || old_end_cost.unwrap() < end_cost); + assert!(old_end_cost.is_none() || old_end_cost.unwrap() <= end_cost); } } } @@ -556,4 +557,158 @@ mod object_cost_tests { expected_object_cost ); } + + #[test] + fn test_cost_overflow() { + let object_id_0 = ObjectID::random(); + let object_id_1 = ObjectID::random(); + let object_id_2 = ObjectID::random(); + // edge case: max value is saturated + let max_accumulated_txn_cost_per_object_in_commit = u64::MAX; + + // case 1: large initial cost, small tx cost + let mut shared_object_congestion_tracker = + SharedObjectCongestionTracker::new_with_initial_value_for_test( + &[(object_id_0, u64::MAX - 1), (object_id_1, u64::MAX - 1)], + PerObjectCongestionControlMode::TotalGasBudget, + ); + + let tx = build_transaction(&[(object_id_0, true)], 1); + assert!( + shared_object_congestion_tracker + .should_defer_due_to_object_congestion( + &tx, + max_accumulated_txn_cost_per_object_in_commit, + &HashMap::new(), + 0, + ) + .is_none(), + "objects are not yet congested" + ); + shared_object_congestion_tracker.bump_object_execution_cost(&tx); + assert_eq!( + shared_object_congestion_tracker, + SharedObjectCongestionTracker::new_with_initial_value_for_test( + &[(object_id_0, u64::MAX), (object_id_1, u64::MAX - 1),], + PerObjectCongestionControlMode::TotalGasBudget + ) + ); + + let tx = build_transaction(&[(object_id_0, true), (object_id_1, true)], 1); + if let Some((_, congested_objects)) = shared_object_congestion_tracker + .should_defer_due_to_object_congestion( + &tx, + max_accumulated_txn_cost_per_object_in_commit, + &HashMap::new(), + 0, + ) + { + assert_eq!(congested_objects.len(), 1); + assert_eq!(congested_objects[0], object_id_0); + } else { + panic!("object 0 is congesting, should defer"); + } + shared_object_congestion_tracker.bump_object_execution_cost(&tx); + assert_eq!( + shared_object_congestion_tracker, + SharedObjectCongestionTracker::new_with_initial_value_for_test( + &[(object_id_0, u64::MAX), (object_id_1, u64::MAX),], + PerObjectCongestionControlMode::TotalGasBudget + ) + ); + + if let Some((_, congested_objects)) = shared_object_congestion_tracker + .should_defer_due_to_object_congestion( + &tx, + max_accumulated_txn_cost_per_object_in_commit, + &HashMap::new(), + 0, + ) + { + assert_eq!(congested_objects.len(), 2); + assert_eq!(congested_objects[0], object_id_0); + assert_eq!(congested_objects[1], object_id_1); + } else { + panic!("objects 0 and 1 are congesting, should defer"); + } + shared_object_congestion_tracker.bump_object_execution_cost(&tx); + assert_eq!( + shared_object_congestion_tracker, + SharedObjectCongestionTracker::new_with_initial_value_for_test( + &[(object_id_0, u64::MAX), (object_id_1, u64::MAX),], + PerObjectCongestionControlMode::TotalGasBudget + ) + ); + + // case 2: small initial cost, large tx cost + let mut shared_object_congestion_tracker = + SharedObjectCongestionTracker::new_with_initial_value_for_test( + &[(object_id_0, 0), (object_id_1, 1), (object_id_2, 2)], + PerObjectCongestionControlMode::TotalGasBudget, + ); + + let tx = build_transaction( + &[ + (object_id_0, true), + (object_id_1, true), + (object_id_2, true), + ], + u64::MAX - 1, + ); + if let Some((_, congested_objects)) = shared_object_congestion_tracker + .should_defer_due_to_object_congestion( + &tx, + max_accumulated_txn_cost_per_object_in_commit, + &HashMap::new(), + 0, + ) + { + assert_eq!(congested_objects.len(), 1); + assert_eq!(congested_objects[0], object_id_2); + } else { + panic!("case 2: object 2 is congested, should defer"); + } + shared_object_congestion_tracker.bump_object_execution_cost(&tx); + assert_eq!( + shared_object_congestion_tracker, + SharedObjectCongestionTracker::new_with_initial_value_for_test( + &[ + (object_id_0, u64::MAX), + (object_id_1, u64::MAX), + (object_id_2, u64::MAX), + ], + PerObjectCongestionControlMode::TotalGasBudget + ) + ); + + // case 3: max initial cost, max tx cost + let mut shared_object_congestion_tracker = + SharedObjectCongestionTracker::new_with_initial_value_for_test( + &[(object_id_0, u64::MAX)], + PerObjectCongestionControlMode::TotalGasBudget, + ); + + let tx = build_transaction(&[(object_id_0, true)], u64::MAX); + if let Some((_, congested_objects)) = shared_object_congestion_tracker + .should_defer_due_to_object_congestion( + &tx, + max_accumulated_txn_cost_per_object_in_commit, + &HashMap::new(), + 0, + ) + { + assert_eq!(congested_objects.len(), 1); + assert_eq!(congested_objects[0], object_id_0); + } else { + panic!("case 3: object 0 is congested, should defer"); + } + shared_object_congestion_tracker.bump_object_execution_cost(&tx); + assert_eq!( + shared_object_congestion_tracker, + SharedObjectCongestionTracker::new_with_initial_value_for_test( + &[(object_id_0, u64::MAX),], + PerObjectCongestionControlMode::TotalGasBudget + ) + ); + } } diff --git a/crates/iota-core/src/authority_aggregator.rs b/crates/iota-core/src/authority_aggregator.rs index f42945e4990..42934a53e1b 100644 --- a/crates/iota-core/src/authority_aggregator.rs +++ b/crates/iota-core/src/authority_aggregator.rs @@ -516,7 +516,7 @@ impl ProcessTransactionResult { /// the validators and determining the final state of the transaction. #[derive(Clone)] pub struct AuthorityAggregator { - /// Our Iota committee. + /// Our IOTA committee. pub committee: Arc, /// For more human readable metrics reporting. /// It's OK for this map to be empty or missing validators, it then defaults @@ -1216,11 +1216,7 @@ where } /// Records the rpc error if it is. - fn record_rpc_error_maybe( - metrics: Arc, - display_name: &String, - error: &IotaError, - ) { + fn record_rpc_error_maybe(metrics: Arc, display_name: &str, error: &IotaError) { if let IotaError::Rpc(_message, code) = error { metrics .total_rpc_err @@ -1905,7 +1901,7 @@ where } /// `AuthorityAggregatorBuilder` is used to build an `AuthorityAggregator` with -/// customizable configurations for the Iota network. +/// customizable configurations for the IOTA network. #[derive(Default)] pub struct AuthorityAggregatorBuilder<'a> { network_config: Option<&'a NetworkConfig>, diff --git a/crates/iota-core/src/authority_server.rs b/crates/iota-core/src/authority_server.rs index 75ef3f41997..98f11887069 100644 --- a/crates/iota-core/src/authority_server.rs +++ b/crates/iota-core/src/authority_server.rs @@ -819,8 +819,8 @@ impl ValidatorService { }; let request = request.into_inner(); - let certificates = NonEmpty::from_vec(request.certificates) - .ok_or_else(|| IotaError::NoCertificateProvided)?; + let certificates = + NonEmpty::from_vec(request.certificates).ok_or(IotaError::NoCertificateProvided)?; for certificate in &certificates { // We need to check this first because we haven't verified the cert signature. certificate.validity_check(epoch_store.protocol_config(), epoch_store.epoch())?; diff --git a/crates/iota-core/src/checkpoints/checkpoint_executor/mod.rs b/crates/iota-core/src/checkpoints/checkpoint_executor/mod.rs index d1266c66400..b97e5644c1f 100644 --- a/crates/iota-core/src/checkpoints/checkpoint_executor/mod.rs +++ b/crates/iota-core/src/checkpoints/checkpoint_executor/mod.rs @@ -201,7 +201,7 @@ impl CheckpointExecutor { // check if we want to run this epoch based on RunWithRange condition value // we want to be inclusive of the defined RunWithRangeEpoch::Epoch // i.e Epoch(N) means we will execute epoch N and stop when reaching N+1 - if run_with_range.map_or(false, |rwr| rwr.is_epoch_gt(epoch_store.epoch())) { + if run_with_range.is_some_and(|rwr| rwr.is_epoch_gt(epoch_store.epoch())) { info!( "RunWithRange condition satisfied at {:?}, run_epoch={:?}", run_with_range, @@ -315,7 +315,7 @@ impl CheckpointExecutor { now_transaction_num = current_transaction_num; } // we want to be inclusive of checkpoints in RunWithRange::Checkpoint type - if run_with_range.map_or(false, |rwr| rwr.matches_checkpoint(checkpoint.sequence_number)) { + if run_with_range.is_some_and(|rwr| rwr.matches_checkpoint(checkpoint.sequence_number)) { info!( "RunWithRange condition satisfied after checkpoint sequence number {:?}", checkpoint.sequence_number diff --git a/crates/iota-core/src/consensus_adapter.rs b/crates/iota-core/src/consensus_adapter.rs index eb25d7b5137..5e68b3db330 100644 --- a/crates/iota-core/src/consensus_adapter.rs +++ b/crates/iota-core/src/consensus_adapter.rs @@ -186,7 +186,7 @@ pub trait SubmitToConsensus: Sync + Send + 'static { ) -> IotaResult; } -/// Submit Iota certificates to the consensus. +/// Submit IOTA certificates to the consensus. pub struct ConsensusAdapter { /// The network client connecting to the consensus node of this authority. consensus_client: Arc, diff --git a/crates/iota-core/src/consensus_manager/mod.rs b/crates/iota-core/src/consensus_manager/mod.rs index 2e2c7a7d521..d77f2c6eafa 100644 --- a/crates/iota-core/src/consensus_manager/mod.rs +++ b/crates/iota-core/src/consensus_manager/mod.rs @@ -81,7 +81,7 @@ impl ProtocolManager { } } -/// Used by Iota validator to start consensus protocol for each epoch. +/// Used by IOTA validator to start consensus protocol for each epoch. pub struct ConsensusManager { consensus_config: ConsensusConfig, mysticeti_manager: ProtocolManager, diff --git a/crates/iota-core/src/consensus_manager/mysticeti_manager.rs b/crates/iota-core/src/consensus_manager/mysticeti_manager.rs index 795051a325b..b2f82e4f6d9 100644 --- a/crates/iota-core/src/consensus_manager/mysticeti_manager.rs +++ b/crates/iota-core/src/consensus_manager/mysticeti_manager.rs @@ -183,8 +183,8 @@ impl ConsensusManagerTrait for MysticetiManager { let registry_id = self.registry_service.add(registry.clone()); - self.authority - .swap(Some(Arc::new((authority, registry_id)))); + let registered_authority = Arc::new((authority, registry_id)); + self.authority.swap(Some(registered_authority.clone())); // Initialize the client to send transactions to this Mysticeti instance. self.client.set(client); @@ -193,6 +193,9 @@ impl ConsensusManagerTrait for MysticetiManager { let handler = MysticetiConsensusHandler::new(consensus_handler, commit_receiver, monitor); let mut consensus_handler = self.consensus_handler.lock().await; *consensus_handler = Some(handler); + + // Wait until all locally available commits have been processed + registered_authority.0.replay_complete().await; } async fn shutdown(&self) { diff --git a/crates/iota-core/src/epoch/randomness.rs b/crates/iota-core/src/epoch/randomness.rs index be323fa4747..919aed058f3 100644 --- a/crates/iota-core/src/epoch/randomness.rs +++ b/crates/iota-core/src/epoch/randomness.rs @@ -426,7 +426,7 @@ impl RandomnessManager { info!("random beacon: created {msg:?} with dkg version {dkg_version}"); let transaction = ConsensusTransaction::new_randomness_dkg_message(epoch_store.name, &msg); - #[expect(unused_mut)] + #[cfg_attr(not(any(msim, fail_points)), expect(unused_mut))] let mut fail_point_skip_sending = false; fail_point_if!("rb-dkg", || { // maybe skip sending in simtests @@ -498,7 +498,7 @@ impl RandomnessManager { &conf, ); - #[expect(unused_mut)] + #[cfg_attr(not(any(msim, fail_points)), expect(unused_mut))] let mut fail_point_skip_sending = false; fail_point_if!("rb-dkg", || { // maybe skip sending in simtests diff --git a/crates/iota-core/src/execution_cache/object_locks.rs b/crates/iota-core/src/execution_cache/object_locks.rs index 8f360f66e7a..2e119133c90 100644 --- a/crates/iota-core/src/execution_cache/object_locks.rs +++ b/crates/iota-core/src/execution_cache/object_locks.rs @@ -10,11 +10,13 @@ use iota_types::{ storage::ObjectStore, transaction::VerifiedSignedTransaction, }; -use tracing::{debug, info, instrument, trace}; +use tracing::{debug, error, info, instrument, trace}; use super::writeback_cache::WritebackCache; use crate::authority::authority_per_epoch_store::{AuthorityPerEpochStore, LockDetails}; +type RefCount = usize; + pub(super) struct ObjectLocks { // When acquire transaction locks, lock entries are briefly inserted into this map. The map // exists to provide atomic test-and-set operations on the locks. After all locks have been @@ -26,7 +28,7 @@ pub(super) struct ObjectLocks { // for those objects. Therefore we do a db read for each object we are locking. // // TODO: find a strategy to allow us to avoid db reads for each object. - locked_transactions: DashMap, + locked_transactions: DashMap, } impl ObjectLocks { @@ -41,29 +43,10 @@ impl ObjectLocks { obj_ref: &ObjectRef, epoch_store: &AuthorityPerEpochStore, ) -> IotaResult> { - match self.locked_transactions.entry(*obj_ref) { - DashMapEntry::Vacant(vacant) => { - let tables = epoch_store.tables()?; - let lock = tables.get_locked_transaction(obj_ref)?; - if let Some(lock_details) = lock { - vacant.insert(lock_details); - } - Ok(lock) - } - DashMapEntry::Occupied(occupied) => { - if cfg!(debug_assertions) { - if let Some(lock_details) = epoch_store - .tables() - .unwrap() - .get_locked_transaction(obj_ref) - .unwrap() - { - assert_eq!(*occupied.get(), lock_details); - } - } - Ok(Some(*occupied.get())) - } - } + // We don't consult the in-memory state here. We are only interested in state + // that has been committed to the db. This is because in memory state is + // reverted if the transaction is not successfully locked. + epoch_store.tables()?.get_locked_transaction(obj_ref) } /// Attempts to atomically test-and-set a transaction lock on an object. @@ -101,15 +84,18 @@ impl ObjectLocks { let tables = epoch_store.tables()?; if let Some(lock_details) = tables.get_locked_transaction(obj_ref)? { trace!("read lock from db: {:?}", lock_details); - vacant.insert(lock_details); + vacant.insert((1, lock_details)); lock_details } else { trace!("set lock: {:?}", new_lock); - vacant.insert(new_lock); + vacant.insert((1, new_lock)); new_lock } } - DashMapEntry::Occupied(occupied) => *occupied.get(), + DashMapEntry::Occupied(mut occupied) => { + occupied.get_mut().0 += 1; + occupied.get().1 + } }; if prev_lock != new_lock { @@ -161,14 +147,24 @@ impl ObjectLocks { fn clear_cached_locks(&self, locks: &[(ObjectRef, LockDetails)]) { for (obj_ref, lock) in locks { let entry = self.locked_transactions.entry(*obj_ref); - let occupied = match entry { - DashMapEntry::Vacant(_) => panic!("lock must exist"), + let mut occupied = match entry { + DashMapEntry::Vacant(_) => { + if cfg!(debug_assertions) { + panic!("lock must exist"); + } else { + error!(?obj_ref, "lock should exist"); + } + continue; + } DashMapEntry::Occupied(occupied) => occupied, }; - if occupied.get() == lock { - trace!("clearing lock: {:?}", lock); - occupied.remove(); + if occupied.get().1 == *lock { + occupied.get_mut().0 -= 1; + if occupied.get().0 == 0 { + trace!("clearing lock: {:?}", lock); + occupied.remove(); + } } else { // this is impossible because the only case in which we overwrite a // lock is when the lock is from a previous epoch. but we are holding diff --git a/crates/iota-core/src/execution_cache/unit_tests/writeback_cache_tests.rs b/crates/iota-core/src/execution_cache/unit_tests/writeback_cache_tests.rs index 585c53d2061..24d14676e83 100644 --- a/crates/iota-core/src/execution_cache/unit_tests/writeback_cache_tests.rs +++ b/crates/iota-core/src/execution_cache/unit_tests/writeback_cache_tests.rs @@ -1150,6 +1150,79 @@ async fn test_concurrent_lockers() { } } +#[tokio::test(flavor = "multi_thread", worker_threads = 8)] +async fn test_concurrent_lockers_same_tx() { + telemetry_subscribers::init_for_testing(); + + let mut s = Scenario::new(None, Arc::new(AtomicU32::new(0))).await; + let cache = s.cache.clone(); + let mut txns = Vec::new(); + + for i in 0..1000 { + let a = i * 4; + let b = i * 4 + 1; + s.with_created(&[a, b]); + s.do_tx().await; + + let a_ref = s.obj_ref(a); + let b_ref = s.obj_ref(b); + + let tx1 = s.take_outputs(); + + let tx1 = s.make_signed_transaction(&tx1.transaction); + + txns.push((tx1, a_ref, b_ref)); + } + + let barrier = Arc::new(tokio::sync::Barrier::new(2)); + + let t1 = { + let txns = txns.clone(); + let cache = cache.clone(); + let barrier = barrier.clone(); + let epoch_store = s.epoch_store.clone(); + tokio::task::spawn(async move { + let mut results = Vec::new(); + for (tx1, a_ref, b_ref) in txns { + results.push( + cache + .acquire_transaction_locks(&epoch_store, &[a_ref, b_ref], tx1) + .await, + ); + barrier.wait().await; + } + results + }) + }; + + let t2 = { + let txns = txns.clone(); + let cache = cache.clone(); + let barrier = barrier.clone(); + let epoch_store = s.epoch_store.clone(); + tokio::task::spawn(async move { + let mut results = Vec::new(); + for (tx1, a_ref, b_ref) in txns { + results.push( + cache + .acquire_transaction_locks(&epoch_store, &[a_ref, b_ref], tx1) + .await, + ); + barrier.wait().await; + } + results + }) + }; + + let results1 = t1.await.unwrap(); + let results2 = t2.await.unwrap(); + + for (r1, r2) in results1.into_iter().zip(results2) { + assert!(r1.is_ok()); + assert!(r2.is_ok()); + } +} + #[tokio::test] async fn latest_object_cache_race_test() { let authority = TestAuthorityBuilder::new().build().await; diff --git a/crates/iota-core/src/execution_cache/writeback_cache.rs b/crates/iota-core/src/execution_cache/writeback_cache.rs index 4307f7485da..eb33845674e 100644 --- a/crates/iota-core/src/execution_cache/writeback_cache.rs +++ b/crates/iota-core/src/execution_cache/writeback_cache.rs @@ -480,15 +480,41 @@ impl WritebackCache { debug!(?object_id, ?version, ?object, "inserting object entry"); fail_point_async!("write_object_entry"); self.metrics.record_cache_write("object"); - self.dirty - .objects - .entry(*object_id) - .or_default() - .insert(version, object.clone()); + + // We must hold the lock for the object entry while inserting to the + // object_by_id_cache. Otherwise, a surprising bug can occur: + // + // 1. A thread executing TX1 can write object (O,1) to the dirty set and then + // pause. + // 2. TX2, which reads (O,1) can begin executing, because TransactionManager + // immediately schedules transactions if their inputs are available. It does + // not matter that TX1 hasn't finished executing yet. + // 3. TX2 can write (O,2) to both the dirty set and the object_by_id_cache. + // 4. The thread executing TX1 can resume and write (O,1) to the + // object_by_id_cache. + // + // Now, any subsequent attempt to get the latest version of O will return (O,1) + // instead of (O,2). + // + // This seems very unlikely, but it may be possible under the following + // circumstances: + // - While a thread is unlikely to pause for so long, moka cache uses optimistic + // lock-free algorithms that have retry loops. Possibly, under high + // contention, this code might spin for a surprisingly long time. + // - Additionally, many concurrent re-executions of the same tx could happen due + // to the tx finalizer, plus checkpoint executor, consensus, and RPCs from + // fullnodes. + let mut entry = self.dirty.objects.entry(*object_id).or_default(); + self.cached.object_by_id_cache.insert( *object_id, - Arc::new(Mutex::new(LatestObjectCacheEntry::Object(version, object))), + Arc::new(Mutex::new(LatestObjectCacheEntry::Object( + version, + object.clone(), + ))), ); + + entry.insert(version, object); } async fn write_marker_value( diff --git a/crates/iota-core/src/execution_driver.rs b/crates/iota-core/src/execution_driver.rs index ea3bf455fba..147b9279228 100644 --- a/crates/iota-core/src/execution_driver.rs +++ b/crates/iota-core/src/execution_driver.rs @@ -109,7 +109,8 @@ pub async fn execution_process( // Certificate execution can take significant time, so run it in a separate // task. - spawn_monitored_task!(async move { + let epoch_store_clone = epoch_store.clone(); + spawn_monitored_task!(epoch_store.within_alive_epoch(async move { let _scope = monitored_scope("ExecutionDriver::task"); let _guard = permit; if let Ok(true) = authority.is_tx_already_executed(&digest) { @@ -120,7 +121,7 @@ pub async fn execution_process( fail_point_async!("transaction_execution_delay"); attempts += 1; let res = authority - .try_execute_immediately(&certificate, expected_effects_digest, &epoch_store) + .try_execute_immediately(&certificate, expected_effects_digest, &epoch_store_clone) .await; if let Err(e) = res { if attempts == EXECUTION_MAX_ATTEMPTS { @@ -138,6 +139,6 @@ pub async fn execution_process( .metrics .execution_driver_executed_transactions .inc(); - }.instrument(error_span!("execution_driver", tx_digest = ?digest))); + }.instrument(error_span!("execution_driver", tx_digest = ?digest)))); } } diff --git a/crates/iota-core/src/generate_format.rs b/crates/iota-core/src/generate_format.rs index 1f0ff6e1ee5..306d3165bf1 100644 --- a/crates/iota-core/src/generate_format.rs +++ b/crates/iota-core/src/generate_format.rs @@ -196,12 +196,12 @@ enum Action { } #[derive(Debug, Parser)] -#[clap( - name = "Iota format generator", - about = "Trace serde (de)serialization to generate format descriptions for Iota types" +#[command( + name = "IOTA format generator", + about = "Trace serde (de)serialization to generate format descriptions for IOTA types" )] struct Options { - #[clap(value_enum, default_value = "Print", ignore_case = true)] + #[arg(value_enum, default_value = "Print", ignore_case = true)] action: Action, } diff --git a/crates/iota-core/src/overload_monitor.rs b/crates/iota-core/src/overload_monitor.rs index c4e921d15cf..47c686a28e6 100644 --- a/crates/iota-core/src/overload_monitor.rs +++ b/crates/iota-core/src/overload_monitor.rs @@ -255,7 +255,7 @@ pub fn overload_monitor_accept_tx( // all validators makes the same decision. let temporal_seed = SystemTime::now() .duration_since(UNIX_EPOCH) - .expect("Iota did not exist prior to 1970") + .expect("IOTA did not exist prior to 1970") .as_secs() / SEED_UPDATE_DURATION_SECS; diff --git a/crates/iota-core/src/quorum_driver/tests.rs b/crates/iota-core/src/quorum_driver/tests.rs index 7f3f94659c4..6237691cbe4 100644 --- a/crates/iota-core/src/quorum_driver/tests.rs +++ b/crates/iota-core/src/quorum_driver/tests.rs @@ -138,8 +138,8 @@ async fn test_quorum_driver_submit_transaction_no_ticket() { handle.await.unwrap(); } -async fn verify_ticket_response<'a>( - ticket: Registration<'a, TransactionDigest, QuorumDriverResult>, +async fn verify_ticket_response( + ticket: Registration<'_, TransactionDigest, QuorumDriverResult>, tx_digest: &TransactionDigest, ) { let QuorumDriverResponse { effects_cert, .. } = ticket.await.unwrap(); diff --git a/crates/iota-core/src/safe_client.rs b/crates/iota-core/src/safe_client.rs index 1929097797d..85744b91bc1 100644 --- a/crates/iota-core/src/safe_client.rs +++ b/crates/iota-core/src/safe_client.rs @@ -305,7 +305,7 @@ impl SafeClient where C: AuthorityAPI + Send + Sync + Clone + 'static, { - /// Initiate a new transfer to a Iota or Primary account. + /// Initiate a new transfer to an IOTA or Primary account. pub async fn handle_transaction( &self, transaction: Transaction, @@ -372,9 +372,9 @@ where for object in input_objects { let object_ref = object.compute_object_reference(); - if !expected + if expected .get(&object_ref.0) - .is_some_and(|expect| &object_ref == expect) + .is_none_or(|expect| &object_ref != expect) { return Err(IotaError::ByzantineAuthoritySuspicion { authority: self.address, @@ -395,9 +395,9 @@ where for object in output_objects { let object_ref = object.compute_object_reference(); - if !expected + if expected .get(&object_ref.0) - .is_some_and(|expect| &object_ref == expect) + .is_none_or(|expect| &object_ref != expect) { return Err(IotaError::ByzantineAuthoritySuspicion { authority: self.address, diff --git a/crates/iota-core/src/scoring_decision.rs b/crates/iota-core/src/scoring_decision.rs index 631c8238e3a..e3ae21cede5 100644 --- a/crates/iota-core/src/scoring_decision.rs +++ b/crates/iota-core/src/scoring_decision.rs @@ -174,7 +174,7 @@ mod tests { ); } - /// Generate a pair of Iota and consensus committees for the given size. + /// Generate a pair of IOTA and consensus committees for the given size. fn generate_committees(committee_size: usize) -> (Committee, ConsensusCommittee) { let (consensus_committee, _) = local_committee_and_keys(0, vec![1; committee_size]); diff --git a/crates/iota-core/src/test_authority_clients.rs b/crates/iota-core/src/test_authority_clients.rs index bc17d9d2754..91e7d533cc2 100644 --- a/crates/iota-core/src/test_authority_clients.rs +++ b/crates/iota-core/src/test_authority_clients.rs @@ -250,7 +250,7 @@ impl MockAuthorityApi { #[async_trait] impl AuthorityAPI for MockAuthorityApi { - /// Initiate a new transaction to a Iota or Primary account. + /// Initiate a new transaction to an IOTA or Primary account. async fn handle_transaction( &self, _transaction: Transaction, diff --git a/crates/iota-core/src/transaction_orchestrator.rs b/crates/iota-core/src/transaction_orchestrator.rs index 9aee380abea..cf6ef27c734 100644 --- a/crates/iota-core/src/transaction_orchestrator.rs +++ b/crates/iota-core/src/transaction_orchestrator.rs @@ -673,7 +673,7 @@ impl TransactionOrchestratorMetrics { ) .unwrap(), wait_for_finality_finished: register_int_counter_with_registry!( - "tx_orchestrator_wait_for_finality_fnished", + "tx_orchestrator_wait_for_finality_finished", "Total number of txns Transaction Orchestrator gets responses from Quorum Driver before timeout, either success or failure", registry, ) diff --git a/crates/iota-core/src/unit_tests/authority_aggregator_tests.rs b/crates/iota-core/src/unit_tests/authority_aggregator_tests.rs index ac734a40e8f..c34f11d80dd 100644 --- a/crates/iota-core/src/unit_tests/authority_aggregator_tests.rs +++ b/crates/iota-core/src/unit_tests/authority_aggregator_tests.rs @@ -1380,6 +1380,50 @@ async fn test_handle_transaction_response() { ) .await; + println!("Case 8.3 - Retryable Transaction (EpochEnded Error)"); + + set_tx_info_response_with_signed_tx(&mut clients, &authority_keys, &tx, 0); + + // 2 out of 4 validators return epoch ended error + for (name, _) in authority_keys.iter().skip(2) { + clients + .get_mut(name) + .unwrap() + .set_tx_info_response_error(IotaError::EpochEnded(0)); + } + let agg = get_genesis_agg(authorities.clone(), clients.clone()); + assert_resp_err( + &agg, + tx.clone().into(), + |e| { + matches!( + e, + AggregatorProcessTransactionError::RetryableTransaction { .. } + ) + }, + |e| matches!(e, IotaError::EpochEnded(0)), + ) + .await; + + println!("Case 8.4 - Retryable Transaction (EpochEnded Error) eventually succeeds"); + + set_tx_info_response_with_signed_tx(&mut clients, &authority_keys, &tx, 0); + + // 1 out of 4 validators return epoch ended error + for (name, _) in authority_keys.iter().take(1) { + clients + .get_mut(name) + .unwrap() + .set_tx_info_response_error(IotaError::EpochEnded(0)); + } + + let agg = get_genesis_agg(authorities.clone(), clients.clone()); + let cert = agg + .process_transaction(tx.clone().into(), Some(client_ip)) + .await + .unwrap(); + matches!(cert, ProcessTransactionResult::Certified { .. }); + println!("Case 9 - Non-Retryable Transaction (>=2f+1 ObjectNotFound Error)"); // >= 2f+1 object not found errors set_retryable_tx_info_response_error(&mut clients, &authority_keys); diff --git a/crates/iota-core/src/unit_tests/congestion_control_tests.rs b/crates/iota-core/src/unit_tests/congestion_control_tests.rs index 6dc1763f5b9..0141bd51582 100644 --- a/crates/iota-core/src/unit_tests/congestion_control_tests.rs +++ b/crates/iota-core/src/unit_tests/congestion_control_tests.rs @@ -206,7 +206,7 @@ impl TestSetup { } } -// Creates a transaction that touchs the shared objects `shared_object_1` and +// Creates a transaction that touches the shared objects `shared_object_1` and // `shared_object_2`, and `owned_object`, and executes the transaction in // `authority_state`. Returns the transaction and the effects of the execution. async fn update_objects( diff --git a/crates/iota-cost/tests/empirical_transaction_cost.rs b/crates/iota-cost/tests/empirical_transaction_cost.rs index da6183eadc6..650908f40a2 100644 --- a/crates/iota-cost/tests/empirical_transaction_cost.rs +++ b/crates/iota-cost/tests/empirical_transaction_cost.rs @@ -115,7 +115,7 @@ async fn create_txes( .build(); ret.insert(CommonTransactionCosts::Publish, publish_tx); - // Transfer Whole Iota Coin and Transfer Portion of Iota Coin + // Transfer Whole IOTA Coin and Transfer Portion of IOTA Coin // let whole_iota_coin_tx = TestTransactionBuilder::new(sender, gas_objects.pop().unwrap(), gas_price) diff --git a/crates/iota-cost/troubleshooting.md b/crates/iota-cost/troubleshooting.md index 9d37cba8362..5e739ee78a9 100644 --- a/crates/iota-cost/troubleshooting.md +++ b/crates/iota-cost/troubleshooting.md @@ -1,8 +1,8 @@ # Troubleshooting -## Iota Framework change +## IOTA Framework change -If Iota framework code got updated, the expectations need to be changed. Follow these steps: +If IOTA framework code got updated, the expectations need to be changed. Follow these steps: ```bash # required; can be omitted if cargo-insta is installed diff --git a/crates/iota-data-ingestion-core/Cargo.toml b/crates/iota-data-ingestion-core/Cargo.toml index 7c81d572656..bd0d00b3099 100644 --- a/crates/iota-data-ingestion-core/Cargo.toml +++ b/crates/iota-data-ingestion-core/Cargo.toml @@ -21,6 +21,7 @@ serde_json.workspace = true tap.workspace = true tempfile.workspace = true tokio = { workspace = true, features = ["full"] } +tokio-util.workspace = true tracing.workspace = true url.workspace = true diff --git a/crates/iota-data-ingestion-core/README.md b/crates/iota-data-ingestion-core/README.md new file mode 100644 index 00000000000..814c17d7534 --- /dev/null +++ b/crates/iota-data-ingestion-core/README.md @@ -0,0 +1,379 @@ +# Custom indexer + +The `iota-data-ingestion-core` crate provides an easy solution to create custom indexers. To create an indexer, you subscribe to a checkpoint stream with full checkpoint content. This stream can be one of the publicly available streams from IOTA, one that you set up in your local environment, or a combination of the two. + +Establishing a custom indexer helps improve latency, allows pruning of the data of your IOTA Full node, and provides an efficient assemblage of checkpoint data. + +## Overview + +To start implementing a custom Indexer, the [Worker](https://github.com/iotaledger/iota/blob/develop/crates/iota-data-ingestion-core/src/lib.rs#L27) trait must be implemented: + +```rust +#[async_trait] +pub trait Worker: Send + Sync { + async fn process_checkpoint(&self, checkpoint: CheckpointData) -> Result<()>; + + async fn save_progress( + &self, + sequence_number: CheckpointSequenceNumber, + ) -> Option { + Some(sequence_number) + } + + fn preprocess_hook(&self, _: CheckpointData) -> Result<()> { + Ok(()) + } +} +``` + +The `process_checkpoint` method is the central component of this trait. It handles the processing of data extracted from the `CheckpointData` struct and its subsequent storage. The `CheckpointData` struct encapsulates the complete content of a checkpoint, containing a summary, the checkpoint data itself, and detailed information about each transaction, including associated events and input/output objects. The framework offers three modes for sourcing checkpoint data: **Local**, **Remote**, and **Hybrid** (Local + Remote), allowing for flexible data ingestion strategies. + +#### Local + +The local checkpoint fetcher is ideal when the indexer and a Full Node run on the same machine. By configuring the Full Node to save generated checkpoints to a local directory, `iota-data-ingestion-core` can monitor this directory for changes using an inotify-based mechanism. This minimizes ingestion latency, as checkpoints are processed immediately after they are generated by the Full Node. + +#### Remote + +The remote checkpoint fetcher is useful when the indexer and Full Node reside on separate machines. The Full Node can be configured to expose a REST API for checkpoint retrieval. + +#### Hybrid + +A hybrid configuration combines local and remote stores, providing a fallback mechanism for continuous data ingestion. The framework prioritizes locally available checkpoint data. This mode is beneficial when transitioning to using a local Full Node for data ingestion while needing to backfill historical data or provide failover capabilities. + +## Detailed API Functionality + +To fully understand the inner workings and configuration options of `iota-data-ingestion-core`, a closer look at its API is necessary. While the `Worker` trait dictates the processing and storage of `CheckpointData`, the `IndexerExecutor` is responsible for orchestrating the workers and implementing the core ingestion logic. Before diving into the details of the `IndexerExecutor`, we will first analyze the components it relies on. + +### Checkpoint Reader + +The `CheckpointReader` actor is responsible for reading and managing `CheckpointData` from multiple sources, including local files and remote storage. In addition to fetching new checkpoints, it tracks which checkpoints have been processed, performs garbage collection by deleting processed checkpoint files from local storage, and enforces a memory limit during batch processing to prevent out-of-memory (OOM) conditions. The `CheckpointReader` is instantiated using the [initialize](https://github.com/iotaledger/iota/blob/develop/crates/iota-data-ingestion-core/src/reader.rs#L313) method. + +```rust +pub fn initialize( + // The directory on which checkpoints will be read + path: PathBuf, + // From which checkpoint sequence number to start fetching new checkpoints + starting_checkpoint_number: CheckpointSequenceNumber, + // Provide a remote URL to download checkpoints + remote_store_url: Option, + // Any config key-value pair for the Remote fetcher + remote_store_options: Vec<(String, String)>, + // Customize and optimize the Checkpoint fetch behavior + options: ReaderOptions, +) -> ( + Self, + // Channel the Workers will listen and process & store checkpoints + mpsc::Receiver, + // Channel on which workers will notify GC of the checkpoint + mpsc::Sender, + // Graceful shutdown + oneshot::Sender<()>, +) +``` + +The `ReaderOptions` struct provides options for configuring how the checkpoint reader fetches new checkpoints. + +```rust +pub struct ReaderOptions { + // How often to check for new checkpoints + // Lower values mean faster detection but more CPU usage + // Default: 100ms + pub tick_interval_ms: u64, + // Network request timeout + // Applies to remote store operations + // Default: 5 seconds + pub timeout_secs: u64, + // Maximum concurrent remote requests + // Higher values increase throughput but use more resources + // Default: 10 + pub batch_size: usize, + // Memory limit for processing batch checkpoints + // 0 means no limit + // Helps prevent OOM issues + pub data_limit: usize, +} +``` + +The [run](https://github.com/iotaledger/iota/blob/develop/crates/iota-data-ingestion-core/src/reader.rs#L344) method is responsible for starting the actor. It creates an [inotify](https://man7.org/linux/man-pages/man7/inotify.7.html) listener to monitor the local directory for new files. The method then enters a loop with a `tokio::select!` statement to handle three execution branches: + +```rust +loop { + tokio::select! { + // Graceful shutdown + _ = &mut self.exit_receiver => break, + // Receive from Workers the processed checkpoint sequence numbers, this means that the + // files are no longer needed and a GC can be safely performed + Some(gc_checkpoint_number) = self.processed_receiver.recv() => { + self.gc_processed_files(gc_checkpoint_number).expect("Failed to clean the directory"); + } + // `self.sync()` is invoked either after waiting `self.options.tick_interval_ms` + // without a new file notification, or immediately upon receiving such a notification. + Ok(Some(_)) | Err(_) = timeout(Duration::from_millis(self.options.tick_interval_ms), inotify_recv.recv()) => { + self.sync().await.expect("Failed to read checkpoint files"); + } + } +} +``` + +The [sync](https://github.com/iotaledger/iota/blob/develop/crates/iota-data-ingestion-core/src/reader.rs#L243) method manages the retrieval of checkpoints, coordinating between local and (optionally) remote sources. It prioritizes local checkpoints, using the [read_local_files](https://github.com/iotaledger/iota/blob/develop/crates/iota-data-ingestion-core/src/reader.rs#L75) method to fetch them from the local directory. Remote fetching, performed by the [remote_fetch](https://github.com/iotaledger/iota/blob/develop/crates/iota-data-ingestion-core/src/reader.rs#L216) method, is only activated if the local checkpoints are missing or lag behind the expected sequence. This design ensures that local storage is the primary source of truth. + +- [read_local_files](https://github.com/iotaledger/iota/blob/develop/crates/iota-data-ingestion-core/src/reader.rs#L75) method iterates through all entries in the configured directory, attempting to extract a sequence number from each filename. It filters out entries with sequence numbers lower than the current checkpoint number (`current_checkpoint_number`). The remaining entries are then sorted in ascending order by sequence number. The function then attempts to deserialize each remaining file as a `CheckpointData` struct but only adds the deserialized checkpoint to the result if adding it does not exceed the configured capacity (`data_limit`). +- [remote_fetch](https://github.com/iotaledger/iota/blob/develop/crates/iota-data-ingestion-core/src/reader.rs#L216) method fetches checkpoints from a remote store. It supports the Full Node REST API and various object-store interfaces, including [Amazon S3](https://docs.rs/object_store/latest/object_store/aws/index.html), [Google Cloud Storage](https://docs.rs/object_store/latest/object_store/gcp/index.html), and [WebDAV](https://docs.rs/object_store/latest/object_store/http/index.html). Based on the configuration, it can also create a hybrid client combining an object store and a REST API client. It fetches checkpoints in batches, starting from the `current_checkpoint_number`, and retrieves data until the `batch_size` is reached. While iterating through the fetched checkpoints, it checks for capacity limitations. If the capacity is exceeded, it stops fetching and returns the collected checkpoints. + +### Progress Store + +The `ProgressStore` plays a crucial role in tracking the progress of checkpoint synchronization for each task. This ensures that the Worker can resume synchronization from the last successfully processed checkpoint after an Indexer restart. The framework offers two built-in implementations: + +- `ShimProgressStore`: A simple, in-memory progress store primarily used for unit testing. It does not persist progress across restarts. +- `FileProgressStore`: A persistent progress store that uses a file to track each task's synchronization state. + +Custom progress stores can be created by implementing the `ProgressStore` trait. + +```rust +#[async_trait] +pub trait ProgressStore: Send { + async fn load(&mut self, task_name: String) -> Result; + async fn save( + &mut self, + task_name: String, + checkpoint_number: CheckpointSequenceNumber, + ) -> Result<()>; +} +``` + +Instead of directly using the custom `ProgressStore` implementation, the `IndexerExecutor` interacts with it through a wrapper: + +```rust +pub type ExecutorProgress = HashMap; + +pub struct ProgressStoreWrapper

{ + // Our custom implemented ProgressStore + progress_store: P, + // An internal Map holding the TaskName and the CheckpointSequenceNumber + pending_state: ExecutorProgress, +} +``` + +This wrapper implements the `ProgressStore` trait. Internally, it retrieves progress data from the underlying `ProgressStore` implementation and populates its internal cache. This cached data is then used to calculate the minimum watermark efficiently across all tracked tasks. + +> [!NOTE] +> A watermark represents the checkpoint sequence number up to which checkpoints have been successfully processed across all workers. It serves multiple important purposes: +> +> 1. **Progress Tracking** +> +> - Keeps track of which checkpoints have been fully processed across all workers +> - Ensures no checkpoints are skipped during synchronization +> - It provides a reliable way to resume processing after the system restarts +> +> 2. **Garbage Collection** +> +> - Used to determine which checkpoint files can be safely removed from local storage +> - Only checkpoints with sequence numbers below the watermark are eligible for deletion +> +> The system maintains two types of watermarks: +> +> 1. **Individual Worker Watermarks** +> +> - Each worker tracks its progress through individual watermarks +> - Workers report their progress after successfully processing each checkpoint +> +> 2. **Global Minimum Watermark** +> +> - Represents the minimum watermark across all workers +> - Used to ensure consistency and data safety +> - Critical for garbage collection decisions + +### WorkerPool + +The `WorkerPool` actor has the responsibility to coordinate and manage `Workers` + +```rust +pub struct WorkerPool { + // An unique name of the Worker task + pub task_name: String, + // How many instances of the current Worker to create, more workers are created + // more checkpoints they can process concurrently + concurrency: usize, + // The actual Worker instance itself + worker: Arc, +} +``` + +The [run](https://github.com/iotaledger/iota/blob/develop/crates/iota-data-ingestion-core/src/worker_pool.rs#L34) method implements the core worker behavior and management logic. It maintains a set of `worker_id`s (ranging from `0` to `concurrency - 1`) to ensure each worker processes a distinct checkpoint without race conditions. A `VecDeque` cache of `CheckpointData` is used to buffer incoming checkpoints from the `CheckpointReader` when no workers are immediately available. + +The worker pool's size is determined by the `concurrency` value. The pool is implemented as a vector of tasks, one for each `Worker` instance. `mpsc` channels are used for communication, allowing the pool to receive `CheckpointData`. After initializing the worker pool, the actor enters a loop with a `tokio::select!` statement to handle two distinct execution branches: + +```rust + loop { + tokio::select! { + // Receives a synced checkpoint notification from the Worker + Some((worker_id, status_update, progress_watermark)) = progress_receiver.recv() => { + ... + } + // Receive a `CheckpointData` from CheckpointReader + Some(checkpoint) = checkpoint_receiver.recv() => { + ... + } + } +} +``` + +- The first branch first marks the `worker_id` as idle, updates the watermark, and enforces ordered checkpoint execution. It then checks the cache for pending checkpoints and assigns any found to the idle `worker_id`. +- The second branch handles incoming `CheckpointData` from the `CheckpointReader`. It discards checkpoints with sequence numbers less than the `current_checkpoint_number`, assuming they have already been processed. It then invokes the optional [preprocess_hook](https://github.com/iotaledger/iota/blob/develop/crates/iota-data-ingestion-core/src/lib.rs#L41) method (defined in the `Worker` trait) to allow for validation, preparation, or caching of checkpoint data. If the hook executes successfully and an idle worker is available, the checkpoint is sent for processing otherwise, it is added to the cache for later processing. + +### Indexer Executor + +The `IndexerExecutor` actor is the coordinator of the entire framework logic. + +```rust +pub struct IndexerExecutor

{ + // Holds the registered WorkerPools actors + pools: Vec + Send>>>, + // Store the Sender half of the channel to notofy Worker Pool of new CheckpointData + pool_senders: Vec>, + // A wrapper around the implemented ProgressStore by having an internal cache + progress_store: ProgressStoreWrapper

, + // Worker Pools will send on this channel and notify the Executor that + // the Checkpoint was synced and a GC operation can be performed + pool_progress_sender: mpsc::Sender<(String, CheckpointSequenceNumber)>, + // Listens on synced checkpoints from Worker Pools and performs GC operation + pool_progress_receiver: mpsc::Receiver<(String, CheckpointSequenceNumber)>, + metrics: DataIngestionMetrics, +} +``` + +```rust +pub fn new(progress_store: P, number_of_jobs: usize, metrics: DataIngestionMetrics) -> 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. + +```rust +pub async fn register(&mut self, pool: WorkerPool) -> Result<()> {..} +``` + +After instantiation, the `IndexerExecutor` requires registration of one or more `WorkerPool` instances via the [register](https://github.com/iotaledger/iota/blob/develop/crates/iota-data-ingestion-core/src/executor.rs#L49) method to function. During registration, the executor retrieves the last recorded watermark from its `ProgressStoreWrapper`, using it as the initial checkpoint sequence number for synchronization. The `register` method also creates a buffered `mpsc` channel with a capacity of `MAX_CHECKPOINTS_IN_PROGRESS` and stores the `WorkerPool` in its internal `pools` vector. While the[pool.run()](https://github.com/iotaledger/iota/blob/develop/crates/iota-data-ingestion-core/src/executor.rs#L52-L56) method is called, it does not begin execution until awaited. The sender half of the created channel is stored in `pool_senders` vector for later distribution of `CheckpointData`. + +```rust +pub async fn run( + mut self, + // The directory on which checkpoints will be read + path: PathBuf, + // Provide a remote URL to download checkpoints + remote_store_url: Option, + // Any config key-value pair for the Remote fetcher + 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 {..} +``` + +The [run](https://github.com/iotaledger/iota/blob/develop/crates/iota-data-ingestion-core/src/executor.rs#L62) method executes the actor's main logic; it's the main orchestrator of the checkpoint processing pipeline. It coordinates between: + +- Checkpoint reading (local/remote) +- Worker pool management +- Progress tracking +- Garbage collection +- Metric reporting + +The following diagram shows on a high level the overall flow: + +```mermaid +sequenceDiagram + participant CR as CheckpointReader + participant IE as IndexerExecutor + participant WP as WorkerPool + participant PS as ProgressStore + + IE->>CR: Initialize + IE->>WP: Spawn Workers + + loop Until Exit + CR->>IE: New Checkpoint (checkpoint_recv) + IE->>WP: Distribute (pool_senders) + + Note over WP: Process Checkpoint + + WP->>IE: Progress Update (pool_progress_sender) + IE->>PS: Save Progress + PS->>IE: Return min_watermark + + alt Watermark Advanced + IE->>CR: GC Signal (gc_sender) + end + end +``` + +To initiate checkpoint fetching, the `CheckpointReader` requires an initial checkpoint sequence number. This number is obtained by calling the `ProgressStoreWrapper`'s [min_watermark](https://github.com/iotaledger/iota/blob/develop/crates/iota-data-ingestion-core/src/progress_store/mod.rs#L59) method, which determines the minimum processed checkpoint sequence number across all worker pools. This ensures that no checkpoints are skipped during synchronization and serves as the garbage collection starting point. Subsequently, the `CheckpointReader` is started in a separate task by invoking its [run](https://github.com/iotaledger/iota/blob/develop/crates/iota-data-ingestion-core/src/reader.rs#L344) method. + +> [!NOTE] +> While each `WorkerPool` retrieves its own watermark during registration, the executor also calculates a global minimum watermark at startup which is needed. This is crucial because different `WorkerPool` instances might be targeting different storage backends. The global minimum watermark ensures that each pool has the opportunity to synchronize the necessary checkpoints for its specific storage, even if other pools have already registered those checkpoints to different targets. Subsequently, each `WorkerPool` uses its `current_checkpoint_number` (set during registration) to discard any redundant checkpoints, preventing duplicate processing. + +The next step is to spawn the worker pools in separate tasks: + +```rust +for pool in std::mem::take(&mut self.pools) { + spawn_monitored_task!(pool); +} +``` + +Finally, the actor enters a loop with a `tokio::select!` statement to handle three 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; + } + 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() => { + for sender in &self.pool_senders { + sender.send(checkpoint.clone()).await?; + } + } +} +``` + +- 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. + +## Use cases + +The use cases for the `iota-data-ingestion-core` can be endless. It not only could be used to create Custom Indexers but also for analyzing the data and integrate it with external systems + +#### 1. **Building Custom Indexers for Specific Data:** + +- **Indexing Only the Necessary Data:** Depending on the specific use case, a custom indexer can be developed to store only the relevant data. For example, businesses can register transactions based on the sender and recipient, allowing them to retain essential transactional data for the parties they need without the concern that a full node may delete this information. +- **Indexer as a service**: Provide users with the tools to efficiently index and query specific data, unlocking the potential of the IOTA Tangle for various applications. + +#### 2. **Data Analysis and Visualization:** + +- **Historical Analysis:** Analyzing historical data to identify trends, patterns, and anomalies. +- **Real-time Analytics:** Processing data in real-time to generate insights and alerts. +- **Data Visualization:** Creating visualizations to represent data insights in a user-friendly way. + +#### 3. **Integration with External Systems:** + +- **Data Pipelines:** Integrating with other data processing systems (e.g., Apache Kafka, Apache Spark) for large-scale data processing. +- **Machine Learning:** Feeding indexed data into machine learning models for predictive analytics. +- **Alerting Systems:** Triggering alerts based on specific events or conditions identified in the data. + +## Usage in existing crates + +As an example of a custom indexer the `iota-data-ingestion-core` is used in the `iota-indexer` and `iota-analytics-indexer` both persist data in different storages with completely different use cases: + +- **iota-indexer**: The primary function of the indexer is to provide historical data from the ledger, which is crucial for both Explorer and developers who want to utilize ledger data in their applications. By pre-processing and storing this data, the indexer significantly reduces the load on the full node, preventing performance degradation from frequent queries. The data is stored in `PostgreSQL`. + +- **iota-analytics-indexer**: This specialized indexer is designed to extract and export relevant blockchain data from the IOTA network. It collects and stores data related to network statistics (such as transaction volume and throughput), user activity (including the number of active addresses and transaction patterns), and smart contract interactions (e.g., Move call executions). The extracted data is efficiently stored in Object Storage, such as **AWS S3**. Subsequently, this raw data is transferred to specialized data warehouses like **BigQuery** or **Snowflake**. These columnar databases are optimized for handling large datasets and performing complex analytical queries, enabling in-depth analysis of IOTA network activity. diff --git a/crates/iota-data-ingestion-core/src/executor.rs b/crates/iota-data-ingestion-core/src/executor.rs index d9e4906fb47..fd0490494a3 100644 --- a/crates/iota-data-ingestion-core/src/executor.rs +++ b/crates/iota-data-ingestion-core/src/executor.rs @@ -11,7 +11,8 @@ use iota_types::{ full_checkpoint_content::CheckpointData, messages_checkpoint::CheckpointSequenceNumber, }; use prometheus::Registry; -use tokio::sync::{mpsc, oneshot}; +use tokio::sync::mpsc; +use tokio_util::sync::CancellationToken; use crate::{ DataIngestionMetrics, ReaderOptions, Worker, @@ -65,7 +66,7 @@ impl IndexerExecutor

{ remote_store_url: Option, remote_store_options: Vec<(String, String)>, reader_options: ReaderOptions, - mut exit_receiver: oneshot::Receiver<()>, + token: CancellationToken, ) -> Result { let mut reader_checkpoint_number = self.progress_store.min_watermark()?; let (checkpoint_reader, mut checkpoint_recv, gc_sender, _exit_sender) = @@ -83,7 +84,7 @@ impl IndexerExecutor

{ } loop { tokio::select! { - _ = &mut exit_receiver => break, + _ = 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()?; @@ -112,9 +113,9 @@ pub async fn setup_single_workflow( reader_options: Option, ) -> Result<( impl Future>, - oneshot::Sender<()>, + CancellationToken, )> { - let (exit_sender, exit_receiver) = oneshot::channel(); + 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); @@ -126,8 +127,8 @@ pub async fn setup_single_workflow( Some(remote_store_url), vec![], reader_options.unwrap_or_default(), - exit_receiver, + token.clone(), ), - exit_sender, + token, )) } diff --git a/crates/iota-data-ingestion-core/src/tests.rs b/crates/iota-data-ingestion-core/src/tests.rs index a04fa8c8ccc..e271f69be93 100644 --- a/crates/iota-data-ingestion-core/src/tests.rs +++ b/crates/iota-data-ingestion-core/src/tests.rs @@ -21,7 +21,7 @@ use iota_types::{ use prometheus::Registry; use rand::{SeedableRng, prelude::StdRng}; use tempfile::NamedTempFile; -use tokio::sync::oneshot; +use tokio_util::sync::CancellationToken; use crate::{ DataIngestionMetrics, FileProgressStore, IndexerExecutor, ReaderOptions, Worker, WorkerPool, @@ -48,21 +48,31 @@ async fn run( batch_size: 1, ..Default::default() }; - let (sender, recv) = oneshot::channel(); + match duration { None => { indexer - .run(path.unwrap_or_else(temp_dir), None, vec![], options, recv) + .run( + path.unwrap_or_else(temp_dir), + None, + vec![], + options, + CancellationToken::new(), + ) .await } Some(duration) => { - let handle = tokio::task::spawn(async move { - indexer - .run(path.unwrap_or_else(temp_dir), None, vec![], options, recv) - .await - }); + 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; - drop(sender); + token.cancel(); handle.await? } } diff --git a/crates/iota-data-ingestion/Cargo.toml b/crates/iota-data-ingestion/Cargo.toml index 2f998e650cc..e15a6b00ea1 100644 --- a/crates/iota-data-ingestion/Cargo.toml +++ b/crates/iota-data-ingestion/Cargo.toml @@ -26,6 +26,7 @@ serde.workspace = true serde_json.workspace = true serde_yaml.workspace = true tokio = { workspace = true, features = ["full"] } +tokio-util.workspace = true tracing.workspace = true url.workspace = true diff --git a/crates/iota-data-ingestion/src/main.rs b/crates/iota-data-ingestion/src/main.rs index 1d87bd36c0b..14f947509f4 100644 --- a/crates/iota-data-ingestion/src/main.rs +++ b/crates/iota-data-ingestion/src/main.rs @@ -12,7 +12,8 @@ use iota_data_ingestion::{ use iota_data_ingestion_core::{DataIngestionMetrics, IndexerExecutor, ReaderOptions, WorkerPool}; use prometheus::Registry; use serde::{Deserialize, Serialize}; -use tokio::{signal, sync::oneshot}; +use tokio::signal; +use tokio_util::sync::CancellationToken; #[derive(Serialize, Deserialize, Clone, Debug)] #[serde(rename_all = "lowercase")] @@ -68,7 +69,7 @@ fn default_remote_read_batch_size() -> usize { 100 } -fn setup_env(exit_sender: oneshot::Sender<()>) { +fn setup_env(token: CancellationToken) { let default_hook = std::panic::take_hook(); std::panic::set_hook(Box::new(move |panic| { @@ -76,20 +77,19 @@ fn setup_env(exit_sender: oneshot::Sender<()>) { std::process::exit(12); })); - tokio::spawn(async { + tokio::spawn(async move { signal::ctrl_c() .await .expect("Failed to install Ctrl+C handler"); - exit_sender - .send(()) - .expect("Failed to gracefully process shutdown"); + token.cancel(); }); } #[tokio::main] async fn main() -> Result<()> { - let (exit_sender, exit_receiver) = oneshot::channel(); - setup_env(exit_sender); + let token = CancellationToken::new(); + let token_child = token.child_token(); + setup_env(token); let args: Vec = env::args().collect(); assert_eq!(args.len(), 2, "configuration yaml file is required"); @@ -152,7 +152,7 @@ async fn main() -> Result<()> { config.remote_store_url, config.remote_store_options, reader_options, - exit_receiver, + token_child, ) .await?; Ok(()) diff --git a/crates/iota-e2e-tests/tests/framework_upgrades/mock_iota_systems/base/README.txt b/crates/iota-e2e-tests/tests/framework_upgrades/mock_iota_systems/base/README.txt index c40cfc5d190..db148aa9e7d 100644 --- a/crates/iota-e2e-tests/tests/framework_upgrades/mock_iota_systems/base/README.txt +++ b/crates/iota-e2e-tests/tests/framework_upgrades/mock_iota_systems/base/README.txt @@ -1,5 +1,5 @@ This directory contains a mock version of the 0x3 package (iota-system). -The idea is to introduce a minimum version of the iota-system that we can use to start Iota. +The idea is to introduce a minimum version of the iota-system that we can use to start IOTA. We can then use this mock version as the base package to test various things such as iota system state upgrades. This allows us to decouple from the complicated code in the original iota-system under iota-framework. We only need to update code here and in other mock versions when the core protocol changes. This includes: diff --git a/crates/iota-e2e-tests/tests/full_node_migration_tests.rs b/crates/iota-e2e-tests/tests/full_node_migration_tests.rs index e6c79e17779..45f52d2e844 100644 --- a/crates/iota-e2e-tests/tests/full_node_migration_tests.rs +++ b/crates/iota-e2e-tests/tests/full_node_migration_tests.rs @@ -1,13 +1,26 @@ // Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -use std::{path::PathBuf, str::FromStr}; +use std::{ + fs::File, + io::{BufWriter, Write}, + path::PathBuf, + str::FromStr, +}; use anyhow::anyhow; use bip32::DerivationPath; -use iota_genesis_builder::SnapshotSource; +use iota_genesis_builder::{ + SnapshotSource, + stardust::{ + migration::{Migration, MigrationTargetNetwork}, + parse::HornetSnapshotParser, + process_outputs::scale_amount_for_iota, + types::{address_swap_map::AddressSwapMap, address_swap_split_map::AddressSwapSplitMap}, + }, +}; use iota_json_rpc_types::{ - IotaObjectDataFilter, IotaObjectDataOptions, IotaObjectResponseQuery, + IotaData, IotaObjectDataFilter, IotaObjectDataOptions, IotaObjectResponseQuery, IotaTransactionBlockResponse, IotaTransactionBlockResponseOptions, }; use iota_keys::keystore::{AccountKeystore, FileBasedKeystore}; @@ -15,13 +28,15 @@ use iota_macros::sim_test; use iota_sdk::IotaClient; use iota_types::{ IOTA_FRAMEWORK_ADDRESS, STARDUST_ADDRESS, TypeTag, - base_types::{IotaAddress, ObjectID}, + balance::Balance, + base_types::{IotaAddress, MoveObjectType, ObjectID}, crypto::SignatureScheme::ED25519, dynamic_field::DynamicFieldName, gas_coin::GAS, programmable_transaction_builder::ProgrammableTransactionBuilder, quorum_driver_types::ExecuteTransactionRequestType, - stardust::output::NftOutput, + stardust::{coin_type::CoinType, output::NftOutput}, + timelock::timelock::TimeLock, transaction::{Argument, ObjectArg, Transaction, TransactionData}, }; use move_core_types::ident_str; @@ -29,7 +44,12 @@ use shared_crypto::intent::Intent; use tempfile::tempdir; use test_cluster::TestClusterBuilder; -const MIGRATION_DATA_PATH: &str = "tests/migration/stardust_object_snapshot.bin"; +const HORNET_SNAPSHOT_PATH: &str = "tests/migration/test_hornet_full_snapshot.bin"; +const ADDRESS_SWAP_MAP_PATH: &str = "tests/migration/address_swap.csv"; +const ADDRESS_SWAP_SPLIT_MAP_PATH: &str = "tests/migration/swap_split.csv"; +const TEST_TARGET_NETWORK: &str = "alphanet-test"; +const MIGRATION_DATA_FILE_NAME: &str = "stardust_object_snapshot.bin"; +const DELEGATOR: &str = "0x4f72f788cdf4bb478cf9809e878e6163d5b351c82c11f1ea28750430752e7892"; /// Got from iota-genesis-builder/src/stardust/test_outputs/alias_ownership.rs const MAIN_ADDRESS_MNEMONIC: &str = "few hood high omit camp keep burger give happy iron evolve draft few dawn pulp jazz box dash load snake gown bag draft car"; @@ -37,28 +57,117 @@ const MAIN_ADDRESS_MNEMONIC: &str = "few hood high omit camp keep burger give ha const SPONSOR_ADDRESS_MNEMONIC: &str = "okay pottery arch air egg very cave cash poem gown sorry mind poem crack dawn wet car pink extra crane hen bar boring salt"; #[sim_test] -async fn test_full_node_load_migration_data() -> Result<(), anyhow::Error> { +async fn test_full_node_load_migration_data_with_address_swap() -> Result<(), anyhow::Error> { telemetry_subscribers::init_for_testing(); - let snapshot_source = SnapshotSource::Local(PathBuf::from_str(MIGRATION_DATA_PATH).unwrap()); + + // Setup the temporary dir and create the writer for the stardust object + // snapshot + let dir = tempdir()?; + let stardudst_object_snapshot_file_path = dir.path().join(MIGRATION_DATA_FILE_NAME); + let object_snapshot_writer = + BufWriter::new(File::create(&stardudst_object_snapshot_file_path)?); + + // Get the address swap map + let address_swap_map = AddressSwapMap::from_csv(ADDRESS_SWAP_MAP_PATH)?; + + // Generate the stardust object snapshot + genesis_builder_snapshot_generation( + object_snapshot_writer, + address_swap_map, + AddressSwapSplitMap::default(), + )?; + // Then load it + let snapshot_source = SnapshotSource::Local(stardudst_object_snapshot_file_path); + + // A new test cluster can be spawn with the stardust object snapshot let test_cluster = TestClusterBuilder::new() .with_migration_data(vec![snapshot_source]) + .with_delegator(IotaAddress::from_str(DELEGATOR).unwrap()) .build() .await; + // Use a client to issue a test transaction let client = test_cluster.wallet.get_client().await.unwrap(); - let tx_response = address_unlock_condition(client).await?; - let IotaTransactionBlockResponse { confirmed_local_execution, errors, .. } = tx_response; + + // The transaction must be successful assert!(confirmed_local_execution.unwrap()); assert!(errors.is_empty()); Ok(()) } +#[sim_test] +async fn test_full_node_load_migration_data_with_address_swap_split() -> Result<(), anyhow::Error> { + telemetry_subscribers::init_for_testing(); + + // Setup the temporary dir and create the writer for the stardust object + // snapshot + let dir = tempdir()?; + let stardudst_object_snapshot_file_path = dir.path().join(MIGRATION_DATA_FILE_NAME); + let object_snapshot_writer = + BufWriter::new(File::create(&stardudst_object_snapshot_file_path)?); + + // Get the address swap split map + let address_swap_split_map = AddressSwapSplitMap::from_csv(ADDRESS_SWAP_SPLIT_MAP_PATH)?; + + // Generate the stardust object snapshot + genesis_builder_snapshot_generation( + object_snapshot_writer, + AddressSwapMap::default(), + address_swap_split_map.clone(), + )?; + // Then load it + let snapshot_source = SnapshotSource::Local(stardudst_object_snapshot_file_path); + + // A new test cluster can be spawn with the stardust object snapshot + let test_cluster = TestClusterBuilder::new() + .with_migration_data(vec![snapshot_source]) + .with_delegator(IotaAddress::from_str(DELEGATOR).unwrap()) + .build() + .await; + + // Use a client to issue a test transaction + let client = test_cluster.wallet.get_client().await.unwrap(); + + check_address_swap_split_map_after_migration(client, address_swap_split_map).await?; + + Ok(()) +} + +fn genesis_builder_snapshot_generation( + object_snapshot_writer: impl Write, + address_swap_map: AddressSwapMap, + address_swap_split_map: AddressSwapSplitMap, +) -> Result<(), anyhow::Error> { + let mut snapshot_parser = + HornetSnapshotParser::new::(File::open(HORNET_SNAPSHOT_PATH)?)?; + let total_supply = scale_amount_for_iota(snapshot_parser.total_supply()?)?; + let target_network = MigrationTargetNetwork::from_str(TEST_TARGET_NETWORK)?; + let coin_type = CoinType::Iota; + + // Migrate using the parser output stream + Migration::new( + snapshot_parser.target_milestone_timestamp(), + total_supply, + target_network, + coin_type, + address_swap_map, + )? + .run_for_iota( + snapshot_parser.target_milestone_timestamp(), + address_swap_split_map, + snapshot_parser.outputs(), + object_snapshot_writer, + )?; + + Ok(()) +} + async fn address_unlock_condition( iota_client: IotaClient, ) -> Result { @@ -347,3 +456,55 @@ pub async fn fund_address( Ok(()) } + +async fn check_address_swap_split_map_after_migration( + iota_client: IotaClient, + address_swap_split_map: AddressSwapSplitMap, +) -> Result<(), anyhow::Error> { + for destinations in address_swap_split_map.map().values() { + for (destination, tokens, tokens_timelocked) in destinations { + if *tokens > 0 { + let balance = iota_client + .coin_read_api() + .get_balance(*destination, None) + .await?; + assert_eq!(balance.total_balance, (*tokens as u128)); + } + if *tokens_timelocked > 0 { + let mut total = 0; + let owned_timelocks = iota_client + .read_api() + .get_owned_objects( + *destination, + Some(IotaObjectResponseQuery::new( + Some(IotaObjectDataFilter::StructType( + MoveObjectType::timelocked_iota_balance().into(), + )), + Some(IotaObjectDataOptions::new().with_bcs()), + )), + None, + None, + ) + .await? + .data; + for response in owned_timelocks { + total += bcs::from_bytes::>( + &response + .data + .expect("missing response data") + .bcs + .expect("missing BCS data") + .try_as_move() + .expect("failed to convert to Move object") + .bcs_bytes, + ) + .expect("should be a timelock balance") + .locked() + .value(); + } + assert_eq!(total, *tokens_timelocked); + } + } + } + Ok(()) +} diff --git a/crates/iota-e2e-tests/tests/migration/address_swap.csv b/crates/iota-e2e-tests/tests/migration/address_swap.csv new file mode 100644 index 00000000000..7ece8894744 --- /dev/null +++ b/crates/iota-e2e-tests/tests/migration/address_swap.csv @@ -0,0 +1,2 @@ +Origin,Destination +iota1qp8h9augeh6tk3uvlxqfapuwv93atv63eqkpru029p6sgvr49eufyz7katr,0x4f72f788cdf4bb478cf9809e878e6163d5b351c82c11f1ea28750430752e7892 \ No newline at end of file diff --git a/crates/iota-e2e-tests/tests/migration/stardust_object_snapshot.bin b/crates/iota-e2e-tests/tests/migration/stardust_object_snapshot.bin deleted file mode 100644 index c7fa51debb7..00000000000 Binary files a/crates/iota-e2e-tests/tests/migration/stardust_object_snapshot.bin and /dev/null differ diff --git a/crates/iota-e2e-tests/tests/migration/swap_split.csv b/crates/iota-e2e-tests/tests/migration/swap_split.csv new file mode 100644 index 00000000000..9cf9413ab9a --- /dev/null +++ b/crates/iota-e2e-tests/tests/migration/swap_split.csv @@ -0,0 +1,3 @@ +Origin,Destination,Tokens,TokensTimelocked +iota1qp8h9augeh6tk3uvlxqfapuwv93atv63eqkpru029p6sgvr49eufyz7katr,0x1336d143de5eb55bcb069f55da5fc9f0c84e368022fd2bbe0125b1093b446313,107667149000,107667149000 +iota1qp8h9augeh6tk3uvlxqfapuwv93atv63eqkpru029p6sgvr49eufyz7katr,0x83b5ed87bac715ecb09017a72d531ccc3c43bcb58edeb1ce383f1c46cfd79bec,388647312000,0 \ No newline at end of file diff --git a/crates/iota-e2e-tests/tests/migration/test_hornet_full_snapshot.bin b/crates/iota-e2e-tests/tests/migration/test_hornet_full_snapshot.bin new file mode 100644 index 00000000000..bac42b91117 Binary files /dev/null and b/crates/iota-e2e-tests/tests/migration/test_hornet_full_snapshot.bin differ diff --git a/crates/iota-e2e-tests/tests/passkey_e2e_tests.rs b/crates/iota-e2e-tests/tests/passkey_e2e_tests.rs index 82c9c4a9d91..5a2053a136a 100644 --- a/crates/iota-e2e-tests/tests/passkey_e2e_tests.rs +++ b/crates/iota-e2e-tests/tests/passkey_e2e_tests.rs @@ -97,7 +97,7 @@ async fn create_credential_and_sign_test_tx( let store: Option = None; let my_authenticator = Authenticator::new(my_aaguid, store, user_validation_method); let mut my_client = Client::new(my_authenticator); - let origin = Url::parse("https://www.iota.io").unwrap(); + let origin = Url::parse("https://www.iota.org").unwrap(); // Create credential. let challenge_bytes_from_rp: Bytes = random_vec(32).into(); diff --git a/crates/iota-e2e-tests/tests/protocol_version_tests.rs b/crates/iota-e2e-tests/tests/protocol_version_tests.rs index 4d34b9a39bc..773504aeaee 100644 --- a/crates/iota-e2e-tests/tests/protocol_version_tests.rs +++ b/crates/iota-e2e-tests/tests/protocol_version_tests.rs @@ -996,7 +996,7 @@ mod sim_only_tests { framework_injection::set_override_cb(IOTA_SYSTEM_PACKAGE_ID, f) } - /// Get compiled modules for Iota System, built from fixture `fixture` in + /// Get compiled modules for IOTA System, built from fixture `fixture` in /// the `framework_upgrades` directory. fn iota_system_modules(fixture: &str) -> Vec { fixture_package(fixture) diff --git a/crates/iota-e2e-tests/tests/shared_objects_tests.rs b/crates/iota-e2e-tests/tests/shared_objects_tests.rs index cbabd65cf64..663e81dabd0 100644 --- a/crates/iota-e2e-tests/tests/shared_objects_tests.rs +++ b/crates/iota-e2e-tests/tests/shared_objects_tests.rs @@ -28,7 +28,7 @@ use rand::distributions::Distribution; use test_cluster::TestClusterBuilder; use tokio::time::sleep; -/// Send a simple shared object transaction to Iota and ensures the client gets +/// Send a simple shared object transaction to IOTA and ensures the client gets /// back a response. #[sim_test] async fn shared_object_transaction() { @@ -319,8 +319,8 @@ async fn shared_object_deletion_multi_certs() { .unwrap(); } -/// End-to-end shared transaction test for a Iota validator. It does not test -/// the client or wallet, but tests the end-to-end flow from Iota to consensus. +/// End-to-end shared transaction test for an IOTA validator. It does not test +/// the client or wallet, but tests the end-to-end flow from IOTA to consensus. #[sim_test] async fn call_shared_object_contract() { let test_cluster = TestClusterBuilder::new().build().await; @@ -635,7 +635,7 @@ async fn shared_object_sync() { assert!(effects.status().is_ok()); } -/// Send a simple shared object transaction to Iota and ensures the client gets +/// Send a simple shared object transaction to IOTA and ensures the client gets /// back a response. #[sim_test] async fn replay_shared_object_transaction() { diff --git a/crates/iota-e2e-tests/tests/snapshot_tests.rs b/crates/iota-e2e-tests/tests/snapshot_tests.rs index 65cde1c5ae8..ecf9cb91eda 100644 --- a/crates/iota-e2e-tests/tests/snapshot_tests.rs +++ b/crates/iota-e2e-tests/tests/snapshot_tests.rs @@ -63,10 +63,10 @@ async fn basic_read_cmd_snapshot_tests() -> Result<(), anyhow::Error> { "iota client objects 0x0000000000000000000000000000000000000000000000000000000000000000", /* empty addr */ "iota client object 0x5", // valid object "iota client object 0x5 --bcs", // valid object BCS - "iota client object 0x9135cb3b5aca99a1555b742bd11ddc45fba33343be182bdc161be69da2c41be1", /* valid object */ - "iota client object 0x9135cb3b5aca99a1555b742bd11ddc45fba33343be182bdc161be69da2c41be1 --bcs", /* valid object BCS */ + "iota client object 0x4d03f39deb5e27a76a568adb591da553688e6df6fb053bc9ac069f2bd9495ae3", /* valid object */ + "iota client object 0x4d03f39deb5e27a76a568adb591da553688e6df6fb053bc9ac069f2bd9495ae3 --bcs", /* valid object BCS */ "iota client object 0x0000000000000000000000000000000000000000000000000000000000000000", /* non-existent object */ - "iota client tx-block E5Zp4QQ84PQEceSw4JRi4VTScSAQweKSgdwp9XH4aVPd", // valid tx digest + "iota client tx-block 88FqW2hyUgShTyLcGzbh6scZB45XZYmXpXSxydkBVTPu", // valid tx digest "iota client tx-block 11111111111111111111111111111111", /* non-existent tx * digest */ ]; diff --git a/crates/iota-e2e-tests/tests/snapshots/snapshot_tests__body_fn.snap b/crates/iota-e2e-tests/tests/snapshots/snapshot_tests__body_fn.snap index 8a61ca65af0..397de4bf8f4 100644 --- a/crates/iota-e2e-tests/tests/snapshots/snapshot_tests__body_fn.snap +++ b/crates/iota-e2e-tests/tests/snapshots/snapshot_tests__body_fn.snap @@ -7,14 +7,14 @@ expression: "run_one(cmds, context).await?" [ { "data": { - "objectId": "0x495af1962cebf47d1eb0cdabb02508114dc8a05c8bb4e6c18b8e81af78c8c4b5", + "objectId": "0x02ebee2236a4cf262c571124e9a0931ae4c9e236085457e9483698d041a93586", "version": "1", - "digest": "A7cf1SRMJYAqceQb78geXHujpHQuiqEggZnWu24enHu1", + "digest": "H9URfhPraVYY3S1LDcGkzwMxCJop5bRJUtSYKrNQGFHe", "type": "0x2::coin::Coin<0x2::iota::IOTA>", "owner": { "AddressOwner": "0x2868fed4dbeb23d2ace3ee3ad6e39061423c5692a2b289b39c643c0baf2d8d85" }, - "previousTransaction": "E5Zp4QQ84PQEceSw4JRi4VTScSAQweKSgdwp9XH4aVPd", + "previousTransaction": "88FqW2hyUgShTyLcGzbh6scZB45XZYmXpXSxydkBVTPu", "storageRebate": "0", "content": { "dataType": "moveObject", @@ -22,7 +22,7 @@ expression: "run_one(cmds, context).await?" "fields": { "balance": "30000000000000000", "id": { - "id": "0x495af1962cebf47d1eb0cdabb02508114dc8a05c8bb4e6c18b8e81af78c8c4b5" + "id": "0x02ebee2236a4cf262c571124e9a0931ae4c9e236085457e9483698d041a93586" } } } @@ -30,14 +30,14 @@ expression: "run_one(cmds, context).await?" }, { "data": { - "objectId": "0x6689ff8b1b4ce68bde6f39ebd1031e0339a4036a66b7d0a85c366ac0e6817748", + "objectId": "0x23dfee0adf69baea358751a2a081bcfa4768ea2b1c7d6a882575076e0791cd2f", "version": "1", - "digest": "GYs13Dvcx4XAj76Q4fYfXEgFTyUvVfZYorzvFv8KBRrc", + "digest": "7b2jvLUFXF5J8Ue2tPoPUvtbtTkhcPps6Xaa77NywDS1", "type": "0x2::coin::Coin<0x2::iota::IOTA>", "owner": { "AddressOwner": "0x2868fed4dbeb23d2ace3ee3ad6e39061423c5692a2b289b39c643c0baf2d8d85" }, - "previousTransaction": "E5Zp4QQ84PQEceSw4JRi4VTScSAQweKSgdwp9XH4aVPd", + "previousTransaction": "88FqW2hyUgShTyLcGzbh6scZB45XZYmXpXSxydkBVTPu", "storageRebate": "0", "content": { "dataType": "moveObject", @@ -45,7 +45,7 @@ expression: "run_one(cmds, context).await?" "fields": { "balance": "30000000000000000", "id": { - "id": "0x6689ff8b1b4ce68bde6f39ebd1031e0339a4036a66b7d0a85c366ac0e6817748" + "id": "0x23dfee0adf69baea358751a2a081bcfa4768ea2b1c7d6a882575076e0791cd2f" } } } @@ -53,14 +53,14 @@ expression: "run_one(cmds, context).await?" }, { "data": { - "objectId": "0x9135cb3b5aca99a1555b742bd11ddc45fba33343be182bdc161be69da2c41be1", + "objectId": "0x4d03f39deb5e27a76a568adb591da553688e6df6fb053bc9ac069f2bd9495ae3", "version": "1", - "digest": "5B8YV4P7Q93phJVPgm8MVZzsoXdSxFnKLAjAkMnLYcQb", + "digest": "6cjAEhKn8mmgQC6TPSrFASBNUBcSkTscuYpVdBEBbbfz", "type": "0x2::coin::Coin<0x2::iota::IOTA>", "owner": { "AddressOwner": "0x2868fed4dbeb23d2ace3ee3ad6e39061423c5692a2b289b39c643c0baf2d8d85" }, - "previousTransaction": "E5Zp4QQ84PQEceSw4JRi4VTScSAQweKSgdwp9XH4aVPd", + "previousTransaction": "88FqW2hyUgShTyLcGzbh6scZB45XZYmXpXSxydkBVTPu", "storageRebate": "0", "content": { "dataType": "moveObject", @@ -68,7 +68,7 @@ expression: "run_one(cmds, context).await?" "fields": { "balance": "30000000000000000", "id": { - "id": "0x9135cb3b5aca99a1555b742bd11ddc45fba33343be182bdc161be69da2c41be1" + "id": "0x4d03f39deb5e27a76a568adb591da553688e6df6fb053bc9ac069f2bd9495ae3" } } } @@ -76,14 +76,14 @@ expression: "run_one(cmds, context).await?" }, { "data": { - "objectId": "0x94b18ab08b2ddd60e7db0756a605bd31589136eb861b76f49ff3b5ae688f65bc", + "objectId": "0x59fbac7e900adfc10b42456542f93bb42ddbcb5bbf56b8427e32ef09d990b184", "version": "1", - "digest": "DXGesd5mWPPaLtwza28GDfumr9NqswcfpbcHp2LaL287", + "digest": "GCGVjasFfqD2HKisfq4RWi9FaDRVxwMSf2M7oyT6p9uG", "type": "0x2::coin::Coin<0x2::iota::IOTA>", "owner": { "AddressOwner": "0x2868fed4dbeb23d2ace3ee3ad6e39061423c5692a2b289b39c643c0baf2d8d85" }, - "previousTransaction": "E5Zp4QQ84PQEceSw4JRi4VTScSAQweKSgdwp9XH4aVPd", + "previousTransaction": "88FqW2hyUgShTyLcGzbh6scZB45XZYmXpXSxydkBVTPu", "storageRebate": "0", "content": { "dataType": "moveObject", @@ -91,7 +91,7 @@ expression: "run_one(cmds, context).await?" "fields": { "balance": "30000000000000000", "id": { - "id": "0x94b18ab08b2ddd60e7db0756a605bd31589136eb861b76f49ff3b5ae688f65bc" + "id": "0x59fbac7e900adfc10b42456542f93bb42ddbcb5bbf56b8427e32ef09d990b184" } } } @@ -99,14 +99,14 @@ expression: "run_one(cmds, context).await?" }, { "data": { - "objectId": "0x9ee19bb4564baa0449b5160e4dccd02d5d8a54ca794aaba2130db4feb809c1f5", + "objectId": "0xc6e00266120ad997beadd6b8d3ebc6d9f68460ede3e249d5885e108f39898ed6", "version": "1", - "digest": "zoUU8mDtdVPRCqfRKWmd5VpMNfgBHd4jVjq4gu8i9vn", + "digest": "5UUM6FvaxCuzJnnWoSQph4mPRZo7SHxM6ydAemxRcuY9", "type": "0x2::coin::Coin<0x2::iota::IOTA>", "owner": { "AddressOwner": "0x2868fed4dbeb23d2ace3ee3ad6e39061423c5692a2b289b39c643c0baf2d8d85" }, - "previousTransaction": "E5Zp4QQ84PQEceSw4JRi4VTScSAQweKSgdwp9XH4aVPd", + "previousTransaction": "88FqW2hyUgShTyLcGzbh6scZB45XZYmXpXSxydkBVTPu", "storageRebate": "0", "content": { "dataType": "moveObject", @@ -114,7 +114,7 @@ expression: "run_one(cmds, context).await?" "fields": { "balance": "30000000000000000", "id": { - "id": "0x9ee19bb4564baa0449b5160e4dccd02d5d8a54ca794aaba2130db4feb809c1f5" + "id": "0xc6e00266120ad997beadd6b8d3ebc6d9f68460ede3e249d5885e108f39898ed6" } } } @@ -129,14 +129,14 @@ expression: "run_one(cmds, context).await?" "data": { "objectId": "0x0000000000000000000000000000000000000000000000000000000000000005", "version": "1", - "digest": "8CWv4f5Nov5aRXTQa2EJk7zsNhfKVbX1fEG8VP6Wsa6d", + "digest": "UT7gYyRZBUj7sgGKbuyMvxTS32HZZvr98vXruhZ9buM", "type": "0x3::iota_system::IotaSystemState", "owner": { "Shared": { "initial_shared_version": 1 } }, - "previousTransaction": "E5Zp4QQ84PQEceSw4JRi4VTScSAQweKSgdwp9XH4aVPd", + "previousTransaction": "88FqW2hyUgShTyLcGzbh6scZB45XZYmXpXSxydkBVTPu", "storageRebate": "0", "content": { "dataType": "moveObject", @@ -157,14 +157,14 @@ expression: "run_one(cmds, context).await?" "data": { "objectId": "0x0000000000000000000000000000000000000000000000000000000000000005", "version": "1", - "digest": "8CWv4f5Nov5aRXTQa2EJk7zsNhfKVbX1fEG8VP6Wsa6d", + "digest": "UT7gYyRZBUj7sgGKbuyMvxTS32HZZvr98vXruhZ9buM", "type": "0x3::iota_system::IotaSystemState", "owner": { "Shared": { "initial_shared_version": 1 } }, - "previousTransaction": "E5Zp4QQ84PQEceSw4JRi4VTScSAQweKSgdwp9XH4aVPd", + "previousTransaction": "88FqW2hyUgShTyLcGzbh6scZB45XZYmXpXSxydkBVTPu", "storageRebate": "0", "bcs": { "dataType": "moveObject", @@ -175,18 +175,18 @@ expression: "run_one(cmds, context).await?" } } ], - "iota client object 0x9135cb3b5aca99a1555b742bd11ddc45fba33343be182bdc161be69da2c41be1", + "iota client object 0x4d03f39deb5e27a76a568adb591da553688e6df6fb053bc9ac069f2bd9495ae3", [ { "data": { - "objectId": "0x9135cb3b5aca99a1555b742bd11ddc45fba33343be182bdc161be69da2c41be1", + "objectId": "0x4d03f39deb5e27a76a568adb591da553688e6df6fb053bc9ac069f2bd9495ae3", "version": "1", - "digest": "5B8YV4P7Q93phJVPgm8MVZzsoXdSxFnKLAjAkMnLYcQb", + "digest": "6cjAEhKn8mmgQC6TPSrFASBNUBcSkTscuYpVdBEBbbfz", "type": "0x2::coin::Coin<0x2::iota::IOTA>", "owner": { "AddressOwner": "0x2868fed4dbeb23d2ace3ee3ad6e39061423c5692a2b289b39c643c0baf2d8d85" }, - "previousTransaction": "E5Zp4QQ84PQEceSw4JRi4VTScSAQweKSgdwp9XH4aVPd", + "previousTransaction": "88FqW2hyUgShTyLcGzbh6scZB45XZYmXpXSxydkBVTPu", "storageRebate": "0", "content": { "dataType": "moveObject", @@ -194,31 +194,31 @@ expression: "run_one(cmds, context).await?" "fields": { "balance": "30000000000000000", "id": { - "id": "0x9135cb3b5aca99a1555b742bd11ddc45fba33343be182bdc161be69da2c41be1" + "id": "0x4d03f39deb5e27a76a568adb591da553688e6df6fb053bc9ac069f2bd9495ae3" } } } } } ], - "iota client object 0x9135cb3b5aca99a1555b742bd11ddc45fba33343be182bdc161be69da2c41be1 --bcs", + "iota client object 0x4d03f39deb5e27a76a568adb591da553688e6df6fb053bc9ac069f2bd9495ae3 --bcs", [ { "data": { - "objectId": "0x9135cb3b5aca99a1555b742bd11ddc45fba33343be182bdc161be69da2c41be1", + "objectId": "0x4d03f39deb5e27a76a568adb591da553688e6df6fb053bc9ac069f2bd9495ae3", "version": "1", - "digest": "5B8YV4P7Q93phJVPgm8MVZzsoXdSxFnKLAjAkMnLYcQb", + "digest": "6cjAEhKn8mmgQC6TPSrFASBNUBcSkTscuYpVdBEBbbfz", "type": "0x2::coin::Coin<0x2::iota::IOTA>", "owner": { "AddressOwner": "0x2868fed4dbeb23d2ace3ee3ad6e39061423c5692a2b289b39c643c0baf2d8d85" }, - "previousTransaction": "E5Zp4QQ84PQEceSw4JRi4VTScSAQweKSgdwp9XH4aVPd", + "previousTransaction": "88FqW2hyUgShTyLcGzbh6scZB45XZYmXpXSxydkBVTPu", "storageRebate": "0", "bcs": { "dataType": "moveObject", "type": "0x2::coin::Coin<0x2::iota::IOTA>", "version": 1, - "bcsBytes": "kTXLO1rKmaFVW3Qr0R3cRfujM0O+GCvcFhvmnaLEG+EAAENP15RqAA==" + "bcsBytes": "TQPzneteJ6dqVorbWR2lU2iObfb7BTvJrAafK9lJWuMAAENP15RqAA==" } } } @@ -232,9 +232,9 @@ expression: "run_one(cmds, context).await?" } } ], - "iota client tx-block E5Zp4QQ84PQEceSw4JRi4VTScSAQweKSgdwp9XH4aVPd", + "iota client tx-block 88FqW2hyUgShTyLcGzbh6scZB45XZYmXpXSxydkBVTPu", { - "digest": "E5Zp4QQ84PQEceSw4JRi4VTScSAQweKSgdwp9XH4aVPd", + "digest": "88FqW2hyUgShTyLcGzbh6scZB45XZYmXpXSxydkBVTPu", "transaction": { "data": { "messageVersion": "v1", @@ -250,64 +250,64 @@ expression: "run_one(cmds, context).await?" "0x000000000000000000000000000000000000000000000000000000000000000b", "0x0000000000000000000000000000000000000000000000000000000000000403", "0x000000000000000000000000000000000000000000000000000000000000107a", - "0x00d74df673e00106b1a45136cf8cfae1ca792c3de53232e06d09fbf5d4f60b66", - "0x0214b29e560e3fa6b37836ed7167db0da40a1823cf8b01f0690e1b3bfb4ebdc5", - "0x04942308c8384041a5af2c13c807418d069d3a6e53519dadd1236f0344385a14", - "0x137cb52b1bbef8e93857fd3dc67f7f70f2aabc1d7d6eb4afb28e7dea87b9ccf1", - "0x2a74fa6e7b6f90225cb36fcdc3e416d1d3d9e209ab14aafff3afd2c3587c9aec", - "0x2ad996aa647ab628cf294b4d98b24c9debb351e72b4a72ee3425b7d9a41d08a8", - "0x30f537424026a4259959d4c28f4b474558ba881bb517267f9dac6e7bc7518a5d", - "0x3ad5e2039f28a1d146d5f7e2094b7e55f1cc35f34a53aa207250d51e76febbb4", - "0x3e14d7d3f210d79f29a18955f4e98676ebb40e51119ddd6d26a8add99daceb95", - "0x3e5742903bb62d61adea88aa26bad2fad57984e3eefc58a2f1810b82228e5117", - "0x42cfd74b065c48da45fe6048796ce9cdd3a380c182e7d89573fabc229e3ce4ab", - "0x4728ee263c6a7de9fcd0d4d58db500e0ceed99977f44ca323e9a521970efd085", - "0x495af1962cebf47d1eb0cdabb02508114dc8a05c8bb4e6c18b8e81af78c8c4b5", - "0x608863c1d4738cb9829f9bd7c5b3ab15123b6e6eab762dedcfacc23ec23d37c9", - "0x660e677bad9d848d1f131d14faef42025eedf0f0e14ede894760e0ebb51a80da", - "0x6689ff8b1b4ce68bde6f39ebd1031e0339a4036a66b7d0a85c366ac0e6817748", - "0x69cd03a3cc6b2e4a1eae6bef4892f642d8f87ed3d83b758cc5242034bd36f565", + "0x00f22f34d2616c7f8ba4495bb560e3cf43ebf18cd2ccac12e495f57d1bc6f25c", + "0x020f19ebc937d1d40077d2abcde980c8b048ca8dc3ccbac358c7c94b82b20fed", + "0x0260aaaecfef6cce63c55d8f470a06dcaf445151a2785888011a8e2194cb4648", + "0x02ebee2236a4cf262c571124e9a0931ae4c9e236085457e9483698d041a93586", + "0x18f627179e18aed322f828570d83454d3b312e171982c3527b0f41764a367a1d", + "0x23dfee0adf69baea358751a2a081bcfa4768ea2b1c7d6a882575076e0791cd2f", + "0x24a640dee174b0ed74322070be09e3bb9d96c646858f47de7c1b663496cd6672", + "0x2508c2e30a9718a98cef20f0cb58fa74d79bf743a5c73441a70640f96bbf68f0", + "0x29723a1c473b6f6d2c10a9ccddcd8062a3dbb24b31091470c9341ca36d004c7c", + "0x299f315d1f944855d2fb3f3868d18a32cf2e7f243d3a057b2724ce4395106cca", + "0x2b7c5961cbac364bb9711f2791019b594c9110be9c4ed246cab9fedf9bd159e7", + "0x333a99382fa83b4d0e6ed4f25018e848af2f0a48ca06e94948f1aec691011080", + "0x45f36b9e92ea7ce24fcf76b9a147f91d6329d19d2b79ba0252bd1be4fa0b3114", + "0x47be074115c6bd8b19dabd11020c8b59bb7c8a1f64c78ec2a1a3ff366e524b18", + "0x4d03f39deb5e27a76a568adb591da553688e6df6fb053bc9ac069f2bd9495ae3", + "0x50cb4102d8bc479b9697d6e9e7327e23cb1f00400261f919c8745e49c7732e54", + "0x566ad3b404129b7740255d9eb77d8f649816cbf8f4fa4f0e0b3088eb40f4be7d", + "0x59fbac7e900adfc10b42456542f93bb42ddbcb5bbf56b8427e32ef09d990b184", + "0x63de3e53d6a19a6d42db458e025917b19340a94c638039dc6f771618dee1c6f9", + "0x65b17c1361e97dd96998ec36253fe21441400d111d790d7b312dfe9364687338", + "0x6665f50841dbe82152d70d15b852a1d2471a83c162830438afb06c3e1717d2c1", + "0x6a70af3f08b53d7bd91be9ace2da765e9f7ab0f9046eecd0a92c41897eb742d4", "0x6af2a2b7ca60bf76174adfd3e9c4957f8e937759603182f9b46c7f6c5f19c6d2", - "0x6b2a75a39565fe93f6f2694e79274205ec65dac6aecff0a38b3c3947e2c9e561", - "0x82054bc6567488b4924203907f0bc62f3f789e1f5edc901798c5a58042dfa1a8", - "0x8a23c86abe72190400e37fd3affc876000ad1302712cbdaf76077f7d541b6400", - "0x9045719b475148ea5e0547b2a0dd8f8aaa19a658deac6bfca7a184d1dfa13d87", - "0x9135cb3b5aca99a1555b742bd11ddc45fba33343be182bdc161be69da2c41be1", - "0x9254a40663ad7e72d73dd1f04b1eca4e0486cc9f54cdd9a7c3d4e479a8131aa0", - "0x939337494e5c4fe00e78f120459bf108367938719f717e32c845ab83e762f22c", - "0x94b18ab08b2ddd60e7db0756a605bd31589136eb861b76f49ff3b5ae688f65bc", - "0x98c27dcdc3cb082f2ae47756648c92ee054721273663cf0ad25d7f2d4fd20128", - "0x9bafea6cfb0a89e0eee6e66ec0d598848067196ed07857012e00e609e8f3ca17", - "0x9df5ecf6c7c2ed3f31b6ff471aaea04af7d331647c34ab319c8eef45dd043620", - "0x9ee19bb4564baa0449b5160e4dccd02d5d8a54ca794aaba2130db4feb809c1f5", - "0xa01451ee51efc5ef58d07e5d373b68187ee3a042553670da8a4dc613adf3ed61", - "0xa181feb7b518f4e06794c678eace3633c6b1d7222736e9d059e75ca3023b95a0", - "0xa629b978cb416fdeac008d532329429114c70e49909d97bede0f794b376eafe8", - "0xaca6bf6562b4cbbd909e6f9310c23c9517deca84e82d22dfa781c3dd980bbc95", - "0xb12dd88f42ce5db0ba12181deae915d795de5a1e4dfe87deb44a51c8dd8ced7a", - "0xc3647488b7f826d5e2602102964e93859bab9374389c1cca8799f91c2b8b1589", - "0xcc36edb95e82c14b7175ae99e58c3a27b43fb1ba7d7f1454fbda1ce66e0e5a8f", - "0xcf326c0a4f56e81beb81e1ee93cda5bd5bc5e88fa4b730a1909679b2ffb3f0d3", - "0xd3260d5e56e16920f270b3f92a40782447e360ea000aba2af08f0d1f8ad6b5f0", - "0xd43afda73e2bb89e67d8049618176ba09456438f9fcea5f8a3e91f8a1b17ecd8", - "0xd8fa8491b91a220af49eb0b54e1d5de725ca40cad8ecca989f27a2f713402490", - "0xdde2baa8f84257d47c8051b5abd214afb850211d7ee74a99c21698e8bd66f81d", - "0xe0ebce954f5f7a4f32e3fa49fa1b76bc1e56008535860b3fe78387db50f95dbd", - "0xe360ccacf592e9a2d80c7314d882d2adb850db51fd18572a6baf11a85b233e5d", - "0xe5395355afde6c5624ce706e91738cb766a8324c86ea933f38c3f8efbba38507", - "0xe8bcfc0181e426b9dfcad3785fb4db1a0d0a2b1fa40c99a36b5fe988d2a2f561", - "0xed9ffc59b7e841e0de23ac1b72c4f04a784e2fef9c46f93eed0afdd14f8d047c", - "0xeed5eebe436d3b4dedb5d25eff6275c5212fb408ab6e2d1756fd9c56b2af892d", - "0xf69faa3aa3015380b78c11aae2ee8eed497bb5ee2555e686b53e375ab90fe8cd", - "0xfe1d0d9ef3118023510cdf338ca59ae1d3e88e1ca98a3e1904d61a8620a1ad98" + "0x6f651492979fb7f04a2eb053ec8559074c2fa562d8ee922cf2c55277978d5c89", + "0x71654ced3581c229f5f2743a808263effc4e63090835f77ca9e8ec4bf667ce5f", + "0x74f9e1e67cc981675746f2811572b4ea8ce3e6835f49398313b97ad19322f7c5", + "0x7e87e1c8ff4d9ac72fd6af8e55bc23404dbada8ac7ed2e234524e76904f362cb", + "0x813dd1c1277072ec5f24cc2628513883618b6987fc5435b872cab8f27102329a", + "0x9756463d0f40b3b3ac6de7026fb38690ab2b998dfeb72a51cdd563ae0c373f0a", + "0xa4a778c9213d3035bca59c69f380e80fd7196a72a3e2b51cb22dea1411d91401", + "0xa51b7309e9d47b1ba39cddc19a2e5308b1cbaf73112697fbee332a4a66014a85", + "0xa93e761264922c29a33a97b7330bebdfc7eceb438260efd44ff08a7b407d118e", + "0xa9e70f2bac16567977470169378c3496ac727b9489add6399ba7a568d9d40aa6", + "0xa9fa3dae3e8fa5eaabe1b29d5af2f0a25490d41677b58c4bedbe1920b03ac7ef", + "0xbd8eaa142a631472ac39ba6172ad0dd11af7cdb633acdc2e62adbbecf2469578", + "0xc040e5614e1e604d3bc663b9f612a818ebb918aeab40a6ba25caa7a2a6a237b6", + "0xc31493f7fd0cbfaad8106574193f492d2727bf48db0602f78b155da5a51402ba", + "0xc325849c128782699f66a3fea12d317b5486309cae90a5cce5c9a013d504f000", + "0xc6e00266120ad997beadd6b8d3ebc6d9f68460ede3e249d5885e108f39898ed6", + "0xcd7e3cb7274220eddb40315c39018c145a4bdc29ae274897178a00e9e5df7719", + "0xd813cf320b2cbac0e64c8983484130518715c01961a0bbd2667b055117967dd3", + "0xd9677e045ceed60ae258d0fc79f2e04b3b54cd1e37d2bb4ea5364651d81a354c", + "0xdf7bf4613216b40876db6e0e41da95724ed3521fdc36a031ba70a66f4fed33d4", + "0xe2d939c957ebcc0c9a9c0dcad88df409d63291e2260dd3f1a0e2b967558e5745", + "0xe378d2cec927e9c247bab671285b8f7b23dc02abe786866b2503b3764c9d2ac7", + "0xe72634ff60a76ad75299b6681e5ac68ae16cd5052f55ada644c69f6619ca8f96", + "0xe7445ae60304857a2efd0c4767583987a3de4f78a94e893aca46e957a7743c02", + "0xf1fa0fb0d8312d048e280ed73cf0fd19db5a666470ce8ef13ccafbf37f922b6f", + "0xf87126f9f001bdf5a14efe58a703fd97d2e2aa6c8ee108243cfcc03f70bec36b", + "0xfc3a360f44f32104c49dcf159ba04e021a42b04c969e2ecf3b7c3f8a5d4a4329" ], "events": [ { - "txDigest": "E5Zp4QQ84PQEceSw4JRi4VTScSAQweKSgdwp9XH4aVPd", + "txDigest": "88FqW2hyUgShTyLcGzbh6scZB45XZYmXpXSxydkBVTPu", "eventSeq": "0" }, { - "txDigest": "E5Zp4QQ84PQEceSw4JRi4VTScSAQweKSgdwp9XH4aVPd", + "txDigest": "88FqW2hyUgShTyLcGzbh6scZB45XZYmXpXSxydkBVTPu", "eventSeq": "1" } ] @@ -343,14 +343,14 @@ expression: "run_one(cmds, context).await?" "storageRebate": "0", "nonRefundableStorageFee": "0" }, - "transactionDigest": "E5Zp4QQ84PQEceSw4JRi4VTScSAQweKSgdwp9XH4aVPd", + "transactionDigest": "88FqW2hyUgShTyLcGzbh6scZB45XZYmXpXSxydkBVTPu", "created": [ { "owner": "Immutable", "reference": { "objectId": "0x0000000000000000000000000000000000000000000000000000000000000001", "version": 1, - "digest": "7XoN6TGQbADiyEaVmrD6gmXJDJkX21MxGMc4pYCo9mKN" + "digest": "85UCZYd34oqKh3x3baQuV7giuUzyNLQvY1qL5UNFQa6t" } }, { @@ -358,7 +358,7 @@ expression: "run_one(cmds, context).await?" "reference": { "objectId": "0x0000000000000000000000000000000000000000000000000000000000000002", "version": 1, - "digest": "5DVdPqNcu7yg8VSoQy9GwmoUprvHyK87jxnbRoac1r1S" + "digest": "9BM59kZjX2BAq8vFvKDuuZM5eKhtoGRxxXuS1kzFyVR9" } }, { @@ -366,7 +366,7 @@ expression: "run_one(cmds, context).await?" "reference": { "objectId": "0x0000000000000000000000000000000000000000000000000000000000000003", "version": 1, - "digest": "B7r86UhqxCjrBYVNGnSf7QBNX7EWWm7kLHZ5ht1MLAre" + "digest": "75Le8fZznGd5Bvzxuve3UPQKX2fej1avUJYnA3J1rBjk" } }, { @@ -378,7 +378,7 @@ expression: "run_one(cmds, context).await?" "reference": { "objectId": "0x0000000000000000000000000000000000000000000000000000000000000005", "version": 1, - "digest": "8CWv4f5Nov5aRXTQa2EJk7zsNhfKVbX1fEG8VP6Wsa6d" + "digest": "UT7gYyRZBUj7sgGKbuyMvxTS32HZZvr98vXruhZ9buM" } }, { @@ -390,7 +390,7 @@ expression: "run_one(cmds, context).await?" "reference": { "objectId": "0x0000000000000000000000000000000000000000000000000000000000000006", "version": 1, - "digest": "DjXTupBThwgJcFY9YDL2Xan9bwTTA3BYrW72Dgh1AMJA" + "digest": "9BNNarX2ktYyq83ySt9hkq5Nr95e3NWdLDaUtFxPv2Lj" } }, { @@ -402,7 +402,7 @@ expression: "run_one(cmds, context).await?" "reference": { "objectId": "0x0000000000000000000000000000000000000000000000000000000000000008", "version": 1, - "digest": "aCZvLjShGf5G1AEq3jb9c3y3jxi8NhX17kFUxKwt1q1" + "digest": "7UbMmfwwtbb9RxAtRAuqND8MieggKR6rHn5nvqdqx1HZ" } }, { @@ -410,7 +410,7 @@ expression: "run_one(cmds, context).await?" "reference": { "objectId": "0x000000000000000000000000000000000000000000000000000000000000000b", "version": 1, - "digest": "7rF3B3o4ZHxju9pxz2eGmYhigdg5MBx4WLkyYcBaMMs9" + "digest": "5wsBmq7vkfrRoEqcDxgtJCmLn3YfYRJHP8i6U2EnBgLn" } }, { @@ -422,7 +422,7 @@ expression: "run_one(cmds, context).await?" "reference": { "objectId": "0x0000000000000000000000000000000000000000000000000000000000000403", "version": 1, - "digest": "57nJzNa4jJBPDpbVVKcntb8rEZLhwhAsLAH7o6r6YLAb" + "digest": "GYMKk7f1KhowX6cq3QBKPZHuosPTMfEXpXDqNDW47zQp" } }, { @@ -430,165 +430,163 @@ expression: "run_one(cmds, context).await?" "reference": { "objectId": "0x000000000000000000000000000000000000000000000000000000000000107a", "version": 1, - "digest": "5Ad5TaF7cAZwf8U3rTD19oxAEfrhptBrSg9qGfYf36nY" + "digest": "EZXQcnmtgSTVm437D9yzcoQ3ToKAeoqD4eJ2TLE8KJxo" } }, { "owner": { - "AddressOwner": "0x4b2a0b010344ffda7202ecd5f76b742b78516cfcdb208e3314d65a4157654c4b" + "ObjectOwner": "0xc2f868e67e57dae016192c5e39e5da2fc5b091badcf0a2e943f859c736187657" }, "reference": { - "objectId": "0x00d74df673e00106b1a45136cf8cfae1ca792c3de53232e06d09fbf5d4f60b66", + "objectId": "0x00f22f34d2616c7f8ba4495bb560e3cf43ebf18cd2ccac12e495f57d1bc6f25c", "version": 1, - "digest": "57LAitmwQMZgioGaRVybfVmZ2Yc57HrJ2Hkm7iGmX5aD" + "digest": "9r9ScS86fEETEc2esEQDGgrGdkC8JSDA1HjAtBA7KGDF" } }, { "owner": { - "ObjectOwner": "0x1d3c44ed95179381aec577194b10aaaccddc14ceedf533b9b6b4eef5535476e0" + "AddressOwner": "0xb4b32db0fb2bc9170f796efb2439aeaf46fd0dc0b79af4e12d14bb87c3e9aa65" }, "reference": { - "objectId": "0x0214b29e560e3fa6b37836ed7167db0da40a1823cf8b01f0690e1b3bfb4ebdc5", + "objectId": "0x020f19ebc937d1d40077d2abcde980c8b048ca8dc3ccbac358c7c94b82b20fed", "version": 1, - "digest": "3w6HwgnTmaGDCnAciokuEpZHj2NjFWv6i9KiCHqH7Nct" + "digest": "Ann24wsSiJBWNtRJnib87r4B9XU5eJgRuBPAKDr15X1e" } }, { "owner": { - "AddressOwner": "0x20227cfbc6699debf187d2d7bca3d253cd50f87c165516d3dc53a246a9af7182" + "AddressOwner": "0xb4b32db0fb2bc9170f796efb2439aeaf46fd0dc0b79af4e12d14bb87c3e9aa65" }, "reference": { - "objectId": "0x04942308c8384041a5af2c13c807418d069d3a6e53519dadd1236f0344385a14", + "objectId": "0x0260aaaecfef6cce63c55d8f470a06dcaf445151a2785888011a8e2194cb4648", "version": 1, - "digest": "811mkHeY9LoDN16a3CSnr22AZK8R2rJa9DbDwuvDp9kd" + "digest": "DNPTGrZEvnFwQBc9SKeTWQfnQy8SouFbUkXooEpdRL8P" } }, { "owner": { - "ObjectOwner": "0xee64ad330164aaa798846df2f2df3525410779fb120765a1c5fb1f931bed784b" + "AddressOwner": "0x2868fed4dbeb23d2ace3ee3ad6e39061423c5692a2b289b39c643c0baf2d8d85" }, "reference": { - "objectId": "0x137cb52b1bbef8e93857fd3dc67f7f70f2aabc1d7d6eb4afb28e7dea87b9ccf1", + "objectId": "0x02ebee2236a4cf262c571124e9a0931ae4c9e236085457e9483698d041a93586", "version": 1, - "digest": "9fG99ZbX8SPLLkLnRcah82PyLY3BSbgbLD7HKD6XntZ4" + "digest": "H9URfhPraVYY3S1LDcGkzwMxCJop5bRJUtSYKrNQGFHe" } }, { "owner": { - "AddressOwner": "0x4b578d914e64de1ca47bead61bcfa0932646e16de6063089810cfa904eb8b06f" + "ObjectOwner": "0x85c7bca7f3fb7ebfe0d076cdb331ac21abafbcda69065c1abb1056278e0156db" }, "reference": { - "objectId": "0x2a74fa6e7b6f90225cb36fcdc3e416d1d3d9e209ab14aafff3afd2c3587c9aec", + "objectId": "0x18f627179e18aed322f828570d83454d3b312e171982c3527b0f41764a367a1d", "version": 1, - "digest": "E37WvCF8d2asqAJH7MtR9rnyiWeHqjgsQqL4gbjAwgLk" + "digest": "2idkUZoaajnS1S1sJtGSszNBzGv45q47sTv5jruCM78S" } }, { "owner": { - "AddressOwner": "0x44f42943b20151d6a0c3cb0f84006b3441bb3378c668a6df71fa36cb441538c8" + "AddressOwner": "0x2868fed4dbeb23d2ace3ee3ad6e39061423c5692a2b289b39c643c0baf2d8d85" }, "reference": { - "objectId": "0x2ad996aa647ab628cf294b4d98b24c9debb351e72b4a72ee3425b7d9a41d08a8", + "objectId": "0x23dfee0adf69baea358751a2a081bcfa4768ea2b1c7d6a882575076e0791cd2f", "version": 1, - "digest": "F5fPj6gyhcWnNMJTnxis1goTvTNUXYr69zJudZaqMt2t" + "digest": "7b2jvLUFXF5J8Ue2tPoPUvtbtTkhcPps6Xaa77NywDS1" } }, { - "owner": "Immutable", + "owner": { + "AddressOwner": "0x2f1c55f14bcab32b91bccbf9909aa2818d644d4a1f6401c37f97383e4d8275ca" + }, "reference": { - "objectId": "0x30f537424026a4259959d4c28f4b474558ba881bb517267f9dac6e7bc7518a5d", + "objectId": "0x24a640dee174b0ed74322070be09e3bb9d96c646858f47de7c1b663496cd6672", "version": 1, - "digest": "CF2vkHV4X8YVrhgVKRafUDX7HmSbxSkvmwFYFPkEE4PM" + "digest": "2Q2aeKK2fLQBQX83ihYjpkyEoTDyhEz1QicN2sH1XqKL" } }, { "owner": { - "AddressOwner": "0x7a9730f69d7c9eed4058b7e3ad9019adffdf63a94ef73cd2fb0217f3b9eb6eb1" + "AddressOwner": "0x2f1c55f14bcab32b91bccbf9909aa2818d644d4a1f6401c37f97383e4d8275ca" }, "reference": { - "objectId": "0x3ad5e2039f28a1d146d5f7e2094b7e55f1cc35f34a53aa207250d51e76febbb4", + "objectId": "0x2508c2e30a9718a98cef20f0cb58fa74d79bf743a5c73441a70640f96bbf68f0", "version": 1, - "digest": "2B9M7nEmFp1jcPM72pd7qXNNenQZwdp5dGu4xoykGeXZ" + "digest": "3uEZ8L6yNm61aZDW9TU53Gw5ecTBceJHjdFsbbN3PnSc" } }, { "owner": { - "AddressOwner": "0x7a9730f69d7c9eed4058b7e3ad9019adffdf63a94ef73cd2fb0217f3b9eb6eb1" + "AddressOwner": "0xb4b32db0fb2bc9170f796efb2439aeaf46fd0dc0b79af4e12d14bb87c3e9aa65" }, "reference": { - "objectId": "0x3e14d7d3f210d79f29a18955f4e98676ebb40e51119ddd6d26a8add99daceb95", + "objectId": "0x29723a1c473b6f6d2c10a9ccddcd8062a3dbb24b31091470c9341ca36d004c7c", "version": 1, - "digest": "A6ZSdzLj5Bvv27zaQoFm5rUkS91sK8nJKfntqKbHepUb" + "digest": "EKpry9R3MSw89yYRN9dd2KbVwVVzXrNWtwgDPw1qbDpu" } }, { "owner": { - "AddressOwner": "0x4b578d914e64de1ca47bead61bcfa0932646e16de6063089810cfa904eb8b06f" + "AddressOwner": "0x2f1c55f14bcab32b91bccbf9909aa2818d644d4a1f6401c37f97383e4d8275ca" }, "reference": { - "objectId": "0x3e5742903bb62d61adea88aa26bad2fad57984e3eefc58a2f1810b82228e5117", + "objectId": "0x299f315d1f944855d2fb3f3868d18a32cf2e7f243d3a057b2724ce4395106cca", "version": 1, - "digest": "3MVJSV5RKkXLxsTdHqPQERjnmAQAoxkkiRv1Q6G8zHaU" + "digest": "BLfSDqvn8aNUfAxrWVfdMQSjGsiDqM6Zi4ELFgfRjxTL" } }, { "owner": { - "AddressOwner": "0x4b578d914e64de1ca47bead61bcfa0932646e16de6063089810cfa904eb8b06f" + "AddressOwner": "0x2f1c55f14bcab32b91bccbf9909aa2818d644d4a1f6401c37f97383e4d8275ca" }, "reference": { - "objectId": "0x42cfd74b065c48da45fe6048796ce9cdd3a380c182e7d89573fabc229e3ce4ab", + "objectId": "0x2b7c5961cbac364bb9711f2791019b594c9110be9c4ed246cab9fedf9bd159e7", "version": 1, - "digest": "5AzKkrWAReMDgNF2bbiveSDDWvJpQzSX7xHRHNJu9Phy" + "digest": "DR61KQATeDiSkpFWft6ckEC5Cv4YA8ws9W8YoGQDZTGA" } }, { "owner": { - "AddressOwner": "0x2f1c55f14bcab32b91bccbf9909aa2818d644d4a1f6401c37f97383e4d8275ca" + "ObjectOwner": "0xc7cf938bf2621982fdbe983a16f7e1ae01358aab0dee88eed62ccf03b0538b35" }, "reference": { - "objectId": "0x4728ee263c6a7de9fcd0d4d58db500e0ceed99977f44ca323e9a521970efd085", + "objectId": "0x333a99382fa83b4d0e6ed4f25018e848af2f0a48ca06e94948f1aec691011080", "version": 1, - "digest": "781mLWh1jZYNUxtypVJ4XWvHvvga91AZyRfrtXSG53RZ" + "digest": "5EzJs5Q9tzmn73soqnrghEWHZsZRmsC1MoXzsUDLjZje" } }, { "owner": { - "AddressOwner": "0x2868fed4dbeb23d2ace3ee3ad6e39061423c5692a2b289b39c643c0baf2d8d85" + "AddressOwner": "0x20227cfbc6699debf187d2d7bca3d253cd50f87c165516d3dc53a246a9af7182" }, "reference": { - "objectId": "0x495af1962cebf47d1eb0cdabb02508114dc8a05c8bb4e6c18b8e81af78c8c4b5", + "objectId": "0x45f36b9e92ea7ce24fcf76b9a147f91d6329d19d2b79ba0252bd1be4fa0b3114", "version": 1, - "digest": "A7cf1SRMJYAqceQb78geXHujpHQuiqEggZnWu24enHu1" + "digest": "ku4ZwBs3e3wxPf1jfQ4RDFYhW5WhvGvwURSZNCEBkkd" } }, { - "owner": { - "AddressOwner": "0x7dbda9c2efa8255eea64cf28b64294ffed6af432f53b661d24f3807895ee828d" - }, + "owner": "Immutable", "reference": { - "objectId": "0x608863c1d4738cb9829f9bd7c5b3ab15123b6e6eab762dedcfacc23ec23d37c9", + "objectId": "0x47be074115c6bd8b19dabd11020c8b59bb7c8a1f64c78ec2a1a3ff366e524b18", "version": 1, - "digest": "6NnLvzoYdm9qBrrsgCj3x2vtrQeMceUt1QuBSvxvgXq5" + "digest": "ACEM96A7XicvdzrRuD4LRm6KyocHATyRKDfKkx9ZaL21" } }, { "owner": { - "ObjectOwner": "0xaca630a6c6d4a9e7a7b033174b3952dfd7c2edeea9fa3a356e97d1a5bc31dae0" + "AddressOwner": "0x2868fed4dbeb23d2ace3ee3ad6e39061423c5692a2b289b39c643c0baf2d8d85" }, "reference": { - "objectId": "0x660e677bad9d848d1f131d14faef42025eedf0f0e14ede894760e0ebb51a80da", + "objectId": "0x4d03f39deb5e27a76a568adb591da553688e6df6fb053bc9ac069f2bd9495ae3", "version": 1, - "digest": "EJiD9QzGf9afkBrdYyCfsg9f7Cx64oSLDTVMuvxc2jb2" + "digest": "6cjAEhKn8mmgQC6TPSrFASBNUBcSkTscuYpVdBEBbbfz" } }, { - "owner": { - "AddressOwner": "0x2868fed4dbeb23d2ace3ee3ad6e39061423c5692a2b289b39c643c0baf2d8d85" - }, + "owner": "Immutable", "reference": { - "objectId": "0x6689ff8b1b4ce68bde6f39ebd1031e0339a4036a66b7d0a85c366ac0e6817748", + "objectId": "0x50cb4102d8bc479b9697d6e9e7327e23cb1f00400261f919c8745e49c7732e54", "version": 1, - "digest": "GYs13Dvcx4XAj76Q4fYfXEgFTyUvVfZYorzvFv8KBRrc" + "digest": "J9f9eKbfyHs6ks9tGxQPCp41pRfgKy8oRqU4gZb4nMha" } }, { @@ -596,199 +594,199 @@ expression: "run_one(cmds, context).await?" "AddressOwner": "0x44f42943b20151d6a0c3cb0f84006b3441bb3378c668a6df71fa36cb441538c8" }, "reference": { - "objectId": "0x69cd03a3cc6b2e4a1eae6bef4892f642d8f87ed3d83b758cc5242034bd36f565", + "objectId": "0x566ad3b404129b7740255d9eb77d8f649816cbf8f4fa4f0e0b3088eb40f4be7d", "version": 1, - "digest": "FSfz1Dtc26vvg9ASRGoVHGg1WVbVqLcBtvrcYtTt6bLe" + "digest": "Hg7fVwRrTquxfD5nN6X8jNLbmdE9xiFbw6frCPPmdXWu" } }, { "owner": { - "ObjectOwner": "0x0000000000000000000000000000000000000000000000000000000000000005" + "AddressOwner": "0x2868fed4dbeb23d2ace3ee3ad6e39061423c5692a2b289b39c643c0baf2d8d85" }, "reference": { - "objectId": "0x6af2a2b7ca60bf76174adfd3e9c4957f8e937759603182f9b46c7f6c5f19c6d2", + "objectId": "0x59fbac7e900adfc10b42456542f93bb42ddbcb5bbf56b8427e32ef09d990b184", "version": 1, - "digest": "Er8zLC9VrCrgZZcnhjLkA73mZ3J63rxiboYV6EsqmhN2" + "digest": "GCGVjasFfqD2HKisfq4RWi9FaDRVxwMSf2M7oyT6p9uG" } }, { "owner": { - "AddressOwner": "0x0b37c2167535af8a5729c44690f7be89eb248a6eb3cda5fd37ee1029949f0c29" + "AddressOwner": "0x44f42943b20151d6a0c3cb0f84006b3441bb3378c668a6df71fa36cb441538c8" }, "reference": { - "objectId": "0x6b2a75a39565fe93f6f2694e79274205ec65dac6aecff0a38b3c3947e2c9e561", + "objectId": "0x63de3e53d6a19a6d42db458e025917b19340a94c638039dc6f771618dee1c6f9", "version": 1, - "digest": "Hy3XSG83B625ywGh161TYQ2VqBJzKxFccgp1fL3Zjbob" + "digest": "Bv4sCpQQgssCQroeqq5e9VctzQiXbefNVPxi9DKwU7Jq" } }, { "owner": { - "AddressOwner": "0xb4b32db0fb2bc9170f796efb2439aeaf46fd0dc0b79af4e12d14bb87c3e9aa65" + "AddressOwner": "0x7dbda9c2efa8255eea64cf28b64294ffed6af432f53b661d24f3807895ee828d" }, "reference": { - "objectId": "0x82054bc6567488b4924203907f0bc62f3f789e1f5edc901798c5a58042dfa1a8", + "objectId": "0x65b17c1361e97dd96998ec36253fe21441400d111d790d7b312dfe9364687338", "version": 1, - "digest": "DRYTDtLfuoxayHMXVqxuuWvv4DJnjgZQvoZebdCoGszX" + "digest": "CEMFxNJKgsJoZS5p6djiBcoas2yjWYGe93ib4fmq7mU" } }, { "owner": { - "AddressOwner": "0x2f1c55f14bcab32b91bccbf9909aa2818d644d4a1f6401c37f97383e4d8275ca" + "AddressOwner": "0x4b2a0b010344ffda7202ecd5f76b742b78516cfcdb208e3314d65a4157654c4b" }, "reference": { - "objectId": "0x8a23c86abe72190400e37fd3affc876000ad1302712cbdaf76077f7d541b6400", + "objectId": "0x6665f50841dbe82152d70d15b852a1d2471a83c162830438afb06c3e1717d2c1", "version": 1, - "digest": "2fqjooDKXPoqAFBjzh6cGr53zuTfngNLuHzJoPoR7uvk" + "digest": "5FQAwHKd9BSMAqByENw4AjBPxtu1dUFdvnwFnP5ssefc" } }, { "owner": { - "AddressOwner": "0xb4b32db0fb2bc9170f796efb2439aeaf46fd0dc0b79af4e12d14bb87c3e9aa65" + "AddressOwner": "0x44f42943b20151d6a0c3cb0f84006b3441bb3378c668a6df71fa36cb441538c8" }, "reference": { - "objectId": "0x9045719b475148ea5e0547b2a0dd8f8aaa19a658deac6bfca7a184d1dfa13d87", + "objectId": "0x6a70af3f08b53d7bd91be9ace2da765e9f7ab0f9046eecd0a92c41897eb742d4", "version": 1, - "digest": "9puPcXBGsDq9hTfkFMUHpmruAkuqsqQmBt6b2ChxRU2f" + "digest": "F244scn8ByNwXxG7Sd2zCkn4TTrGPHy8c1ixYdK1VHyP" } }, { "owner": { - "AddressOwner": "0x2868fed4dbeb23d2ace3ee3ad6e39061423c5692a2b289b39c643c0baf2d8d85" + "ObjectOwner": "0x0000000000000000000000000000000000000000000000000000000000000005" }, "reference": { - "objectId": "0x9135cb3b5aca99a1555b742bd11ddc45fba33343be182bdc161be69da2c41be1", + "objectId": "0x6af2a2b7ca60bf76174adfd3e9c4957f8e937759603182f9b46c7f6c5f19c6d2", "version": 1, - "digest": "5B8YV4P7Q93phJVPgm8MVZzsoXdSxFnKLAjAkMnLYcQb" + "digest": "6AyGKpbs2yy8j6nt6mXVuE7yvhYQvZ1quTi1nhZm67nQ" } }, { "owner": { - "ObjectOwner": "0xaca630a6c6d4a9e7a7b033174b3952dfd7c2edeea9fa3a356e97d1a5bc31dae0" + "AddressOwner": "0x7a9730f69d7c9eed4058b7e3ad9019adffdf63a94ef73cd2fb0217f3b9eb6eb1" }, "reference": { - "objectId": "0x9254a40663ad7e72d73dd1f04b1eca4e0486cc9f54cdd9a7c3d4e479a8131aa0", + "objectId": "0x6f651492979fb7f04a2eb053ec8559074c2fa562d8ee922cf2c55277978d5c89", "version": 1, - "digest": "Du8gWCJQvqcsNBEpSYTDSB2aaRyVEG8h7niCPhKQtZFf" + "digest": "21JXcJtash7RUymcy5MvDHHHsWewg6H7Ck36RbcPruKp" } }, { "owner": { - "AddressOwner": "0x44f42943b20151d6a0c3cb0f84006b3441bb3378c668a6df71fa36cb441538c8" + "ObjectOwner": "0xd6aea7b7b28562ef76634df18c8c84e7f0d456d0053c9f3264e748aeaaf61ec2" }, "reference": { - "objectId": "0x939337494e5c4fe00e78f120459bf108367938719f717e32c845ab83e762f22c", + "objectId": "0x71654ced3581c229f5f2743a808263effc4e63090835f77ca9e8ec4bf667ce5f", "version": 1, - "digest": "5RBuu4Mz4xV3bQAdU8DQnXLppZtpjGToNcoVujUfpxwG" + "digest": "AJXAfxWsnsNRLrdxeARMMXMs7bAw93r1Qu2VG9YB9jH8" } }, { "owner": { - "AddressOwner": "0x2868fed4dbeb23d2ace3ee3ad6e39061423c5692a2b289b39c643c0baf2d8d85" + "AddressOwner": "0x4b578d914e64de1ca47bead61bcfa0932646e16de6063089810cfa904eb8b06f" }, "reference": { - "objectId": "0x94b18ab08b2ddd60e7db0756a605bd31589136eb861b76f49ff3b5ae688f65bc", + "objectId": "0x74f9e1e67cc981675746f2811572b4ea8ce3e6835f49398313b97ad19322f7c5", "version": 1, - "digest": "DXGesd5mWPPaLtwza28GDfumr9NqswcfpbcHp2LaL287" + "digest": "CmYJTpbWV1sJKXaRXA6FnXcaRpaW2eMufwpi1YV3Haet" } }, { "owner": { - "ObjectOwner": "0xaca630a6c6d4a9e7a7b033174b3952dfd7c2edeea9fa3a356e97d1a5bc31dae0" + "ObjectOwner": "0xd6aea7b7b28562ef76634df18c8c84e7f0d456d0053c9f3264e748aeaaf61ec2" }, "reference": { - "objectId": "0x98c27dcdc3cb082f2ae47756648c92ee054721273663cf0ad25d7f2d4fd20128", + "objectId": "0x7e87e1c8ff4d9ac72fd6af8e55bc23404dbada8ac7ed2e234524e76904f362cb", "version": 1, - "digest": "h6NdgxuL5GUffJJjUicoXB1yDDv3qytM1PJFXQQvxdi" + "digest": "8oJHcJ3vePe99k1VKjrbLxYwmk6LXcSuwvethwzzFreX" } }, { "owner": { - "AddressOwner": "0x2f1c55f14bcab32b91bccbf9909aa2818d644d4a1f6401c37f97383e4d8275ca" + "AddressOwner": "0x0b37c2167535af8a5729c44690f7be89eb248a6eb3cda5fd37ee1029949f0c29" }, "reference": { - "objectId": "0x9bafea6cfb0a89e0eee6e66ec0d598848067196ed07857012e00e609e8f3ca17", + "objectId": "0x813dd1c1277072ec5f24cc2628513883618b6987fc5435b872cab8f27102329a", "version": 1, - "digest": "3yh2VHtBQACirSUeoFC6YGUimULgQEAeXVHQYzC8423e" + "digest": "4b8z6dtD5Ztw2Ln26qmnrLdgnUcUpJLnBV1Jzxf3Dkqs" } }, { "owner": { - "ObjectOwner": "0x7a85e205f86b500a8597a0e3258cfd36cb5e39c04580f5598e501dc31aa55979" + "AddressOwner": "0x44f42943b20151d6a0c3cb0f84006b3441bb3378c668a6df71fa36cb441538c8" }, "reference": { - "objectId": "0x9df5ecf6c7c2ed3f31b6ff471aaea04af7d331647c34ab319c8eef45dd043620", + "objectId": "0x9756463d0f40b3b3ac6de7026fb38690ab2b998dfeb72a51cdd563ae0c373f0a", "version": 1, - "digest": "Fnr1EGFNzyCZgEjLJAYYzHfWrxdLdD1epz2ToST4bTQY" + "digest": "GGiQhnbFhpMsyoL61fW7rcA4AYtBDW3QXciHDfCjYdfa" } }, { "owner": { - "AddressOwner": "0x2868fed4dbeb23d2ace3ee3ad6e39061423c5692a2b289b39c643c0baf2d8d85" + "AddressOwner": "0x20227cfbc6699debf187d2d7bca3d253cd50f87c165516d3dc53a246a9af7182" }, "reference": { - "objectId": "0x9ee19bb4564baa0449b5160e4dccd02d5d8a54ca794aaba2130db4feb809c1f5", + "objectId": "0xa4a778c9213d3035bca59c69f380e80fd7196a72a3e2b51cb22dea1411d91401", "version": 1, - "digest": "zoUU8mDtdVPRCqfRKWmd5VpMNfgBHd4jVjq4gu8i9vn" + "digest": "5rfqFb512rV1VZtQ7GGS86hfKe1tR4BAD8FikiPgfHLc" } }, { "owner": { - "ObjectOwner": "0xaca630a6c6d4a9e7a7b033174b3952dfd7c2edeea9fa3a356e97d1a5bc31dae0" + "AddressOwner": "0x7a9730f69d7c9eed4058b7e3ad9019adffdf63a94ef73cd2fb0217f3b9eb6eb1" }, "reference": { - "objectId": "0xa01451ee51efc5ef58d07e5d373b68187ee3a042553670da8a4dc613adf3ed61", + "objectId": "0xa51b7309e9d47b1ba39cddc19a2e5308b1cbaf73112697fbee332a4a66014a85", "version": 1, - "digest": "BUizCaTGo3YEdsuDzodmKs9njztBmrQbpNA5DXiLcXZt" + "digest": "J9Rn2JkDpMZu43WdiN4RtR4VATkLt5a3223N1g8nUKW1" } }, { "owner": { - "ObjectOwner": "0x337b119cf80fabd2c403926df427294e0d1c5444a317a42b1c9dbdbc07375f1b" + "AddressOwner": "0x0b37c2167535af8a5729c44690f7be89eb248a6eb3cda5fd37ee1029949f0c29" }, "reference": { - "objectId": "0xa181feb7b518f4e06794c678eace3633c6b1d7222736e9d059e75ca3023b95a0", + "objectId": "0xa93e761264922c29a33a97b7330bebdfc7eceb438260efd44ff08a7b407d118e", "version": 1, - "digest": "CYWkB4L1JxphwGcDyzdFZQfNcfbhV33jWxNkRxgcquSH" + "digest": "647NGY7b4MXwdWi5krZj2Uhk6tz9MnZSJNu2ivRdfBrf" } }, { "owner": { - "AddressOwner": "0x7a9730f69d7c9eed4058b7e3ad9019adffdf63a94ef73cd2fb0217f3b9eb6eb1" + "AddressOwner": "0x2f1c55f14bcab32b91bccbf9909aa2818d644d4a1f6401c37f97383e4d8275ca" }, "reference": { - "objectId": "0xa629b978cb416fdeac008d532329429114c70e49909d97bede0f794b376eafe8", + "objectId": "0xa9e70f2bac16567977470169378c3496ac727b9489add6399ba7a568d9d40aa6", "version": 1, - "digest": "6Mtsb7P5EAb696MW6fHanVamZe9zSR8kbnAf7kfZd4n8" + "digest": "2MHZVnXihhSBVxMaw73iiDXR8nTCysGtivdzyAqE3D8f" } }, { "owner": { - "AddressOwner": "0x44f42943b20151d6a0c3cb0f84006b3441bb3378c668a6df71fa36cb441538c8" + "AddressOwner": "0x0b37c2167535af8a5729c44690f7be89eb248a6eb3cda5fd37ee1029949f0c29" }, "reference": { - "objectId": "0xaca6bf6562b4cbbd909e6f9310c23c9517deca84e82d22dfa781c3dd980bbc95", + "objectId": "0xa9fa3dae3e8fa5eaabe1b29d5af2f0a25490d41677b58c4bedbe1920b03ac7ef", "version": 1, - "digest": "Akr7cJiBjxTYvEm5GttimcB7NVBu8qEU3JEMggT2NkVS" + "digest": "GvqzaN32ixA3ES5RosrYLox3YiYp6UwCxhZzTCwH1Nvv" } }, { "owner": { - "AddressOwner": "0x2f1c55f14bcab32b91bccbf9909aa2818d644d4a1f6401c37f97383e4d8275ca" + "AddressOwner": "0x4b578d914e64de1ca47bead61bcfa0932646e16de6063089810cfa904eb8b06f" }, "reference": { - "objectId": "0xb12dd88f42ce5db0ba12181deae915d795de5a1e4dfe87deb44a51c8dd8ced7a", + "objectId": "0xbd8eaa142a631472ac39ba6172ad0dd11af7cdb633acdc2e62adbbecf2469578", "version": 1, - "digest": "AqgNX8aLoZyCfmq3N3F3kaMTRWpQCQnZ8uzxJvfckbFM" + "digest": "HcAw9ucPpCnJDk34um1JaYfrtmRB2xy7uUM2WjWHQFH5" } }, { "owner": { - "AddressOwner": "0x0b37c2167535af8a5729c44690f7be89eb248a6eb3cda5fd37ee1029949f0c29" + "AddressOwner": "0xb4b32db0fb2bc9170f796efb2439aeaf46fd0dc0b79af4e12d14bb87c3e9aa65" }, "reference": { - "objectId": "0xc3647488b7f826d5e2602102964e93859bab9374389c1cca8799f91c2b8b1589", + "objectId": "0xc040e5614e1e604d3bc663b9f612a818ebb918aeab40a6ba25caa7a2a6a237b6", "version": 1, - "digest": "65ZbHUaDjGRnqwUVGHiSVeHV1Koxpcmk2pPKv9Uj9wYR" + "digest": "BfpGVgZcxazX2hhxe18NkCiTotN38HcXGxe94N4Lb65v" } }, { @@ -796,79 +794,79 @@ expression: "run_one(cmds, context).await?" "AddressOwner": "0x4b578d914e64de1ca47bead61bcfa0932646e16de6063089810cfa904eb8b06f" }, "reference": { - "objectId": "0xcc36edb95e82c14b7175ae99e58c3a27b43fb1ba7d7f1454fbda1ce66e0e5a8f", + "objectId": "0xc31493f7fd0cbfaad8106574193f492d2727bf48db0602f78b155da5a51402ba", "version": 1, - "digest": "4X4Mmi3CynwtZsuonDK26HvV4SyQ4d4SykRdn1KLu22a" + "digest": "9mbG13HJkdZ1iqLcNYc1UFe2v6haXh3kemomT77LQS2o" } }, { "owner": { - "AddressOwner": "0x0b37c2167535af8a5729c44690f7be89eb248a6eb3cda5fd37ee1029949f0c29" + "AddressOwner": "0x7dbda9c2efa8255eea64cf28b64294ffed6af432f53b661d24f3807895ee828d" }, "reference": { - "objectId": "0xcf326c0a4f56e81beb81e1ee93cda5bd5bc5e88fa4b730a1909679b2ffb3f0d3", + "objectId": "0xc325849c128782699f66a3fea12d317b5486309cae90a5cce5c9a013d504f000", "version": 1, - "digest": "DcBPndnKeykAEYA7cmTz7PW7u2pg46nUB7JDEG2gEaQj" + "digest": "3ubyCZKjxR6RoBSxz5rp11eiWuKXgPU9iVkmccZSL735" } }, { "owner": { - "AddressOwner": "0x20227cfbc6699debf187d2d7bca3d253cd50f87c165516d3dc53a246a9af7182" + "AddressOwner": "0x2868fed4dbeb23d2ace3ee3ad6e39061423c5692a2b289b39c643c0baf2d8d85" }, "reference": { - "objectId": "0xd3260d5e56e16920f270b3f92a40782447e360ea000aba2af08f0d1f8ad6b5f0", + "objectId": "0xc6e00266120ad997beadd6b8d3ebc6d9f68460ede3e249d5885e108f39898ed6", "version": 1, - "digest": "2W8RQHXqNzdkhKPUCmawicG7iHgvR6BXYMCiktweVruJ" + "digest": "5UUM6FvaxCuzJnnWoSQph4mPRZo7SHxM6ydAemxRcuY9" } }, { "owner": { - "AddressOwner": "0xb4b32db0fb2bc9170f796efb2439aeaf46fd0dc0b79af4e12d14bb87c3e9aa65" + "AddressOwner": "0x20227cfbc6699debf187d2d7bca3d253cd50f87c165516d3dc53a246a9af7182" }, "reference": { - "objectId": "0xd43afda73e2bb89e67d8049618176ba09456438f9fcea5f8a3e91f8a1b17ecd8", + "objectId": "0xcd7e3cb7274220eddb40315c39018c145a4bdc29ae274897178a00e9e5df7719", "version": 1, - "digest": "8PrSccVLMdHmUji4HbGeUvxh8WTHDnzqk75tWz67Tf8d" + "digest": "Hfot87knyUxj4uLhajMUW2Eh83vb6xguhE8q5GqzWwbw" } }, { "owner": { - "AddressOwner": "0x4b578d914e64de1ca47bead61bcfa0932646e16de6063089810cfa904eb8b06f" + "ObjectOwner": "0xb419c5eec03155cddf033685be7ab8bef9fc1e9134d1108f86aab0c0e94148a1" }, "reference": { - "objectId": "0xd8fa8491b91a220af49eb0b54e1d5de725ca40cad8ecca989f27a2f713402490", + "objectId": "0xd813cf320b2cbac0e64c8983484130518715c01961a0bbd2667b055117967dd3", "version": 1, - "digest": "F7NGNkMwvuPkKEuvnYgErENvp1HqQfWkMNySiKssSy6b" + "digest": "4j1Z5GvY1q5qRR2ArCEThV4cFT4BPN7DYgk1hZcwXqE7" } }, { "owner": { - "AddressOwner": "0x20227cfbc6699debf187d2d7bca3d253cd50f87c165516d3dc53a246a9af7182" + "ObjectOwner": "0xd6aea7b7b28562ef76634df18c8c84e7f0d456d0053c9f3264e748aeaaf61ec2" }, "reference": { - "objectId": "0xdde2baa8f84257d47c8051b5abd214afb850211d7ee74a99c21698e8bd66f81d", + "objectId": "0xd9677e045ceed60ae258d0fc79f2e04b3b54cd1e37d2bb4ea5364651d81a354c", "version": 1, - "digest": "3ue34riJ3GWEcmegp2kzVEpnHgWzamPaCZTx7kpjc5ZL" + "digest": "D6o7Zm3PfJ6X92p2m6ZyjAAWVCNg1CQRdSpWRtJAnetM" } }, { "owner": { - "AddressOwner": "0x2f1c55f14bcab32b91bccbf9909aa2818d644d4a1f6401c37f97383e4d8275ca" + "ObjectOwner": "0xdf12e15860adaae1cd6c238227a585c224ca47ed05239e88f3230bd08ed9b698" }, "reference": { - "objectId": "0xe0ebce954f5f7a4f32e3fa49fa1b76bc1e56008535860b3fe78387db50f95dbd", + "objectId": "0xdf7bf4613216b40876db6e0e41da95724ed3521fdc36a031ba70a66f4fed33d4", "version": 1, - "digest": "kNSMhUBQszVBjveLRYdxX9JEUiLzdV3vCzz9ikaYL1n" + "digest": "66Tjav6hornHGzx5A4HWLPDoDwwkTUEocbML6pVRxkJo" } }, { "owner": { - "AddressOwner": "0x44f42943b20151d6a0c3cb0f84006b3441bb3378c668a6df71fa36cb441538c8" + "ObjectOwner": "0xd6aea7b7b28562ef76634df18c8c84e7f0d456d0053c9f3264e748aeaaf61ec2" }, "reference": { - "objectId": "0xe360ccacf592e9a2d80c7314d882d2adb850db51fd18572a6baf11a85b233e5d", + "objectId": "0xe2d939c957ebcc0c9a9c0dcad88df409d63291e2260dd3f1a0e2b967558e5745", "version": 1, - "digest": "A2VPHWvMEQHPWw1m5oX6vVZcAwsmkLyCvotCx4MrNjzG" + "digest": "4U4nX8h1bM5BRNzduEDshyRxirtan6VadienujiQyy6n" } }, { @@ -876,19 +874,19 @@ expression: "run_one(cmds, context).await?" "AddressOwner": "0xb4b32db0fb2bc9170f796efb2439aeaf46fd0dc0b79af4e12d14bb87c3e9aa65" }, "reference": { - "objectId": "0xe5395355afde6c5624ce706e91738cb766a8324c86ea933f38c3f8efbba38507", + "objectId": "0xe378d2cec927e9c247bab671285b8f7b23dc02abe786866b2503b3764c9d2ac7", "version": 1, - "digest": "DLCXf4UxpB6CMKQ7tSvdpMLZzAj5z2Qfuox7qHNefKqR" + "digest": "3rVPyctvmQRdKEmDRzvCSaNgAFrU86XPGnmcpDL4TSy7" } }, { "owner": { - "AddressOwner": "0x7dbda9c2efa8255eea64cf28b64294ffed6af432f53b661d24f3807895ee828d" + "AddressOwner": "0x44f42943b20151d6a0c3cb0f84006b3441bb3378c668a6df71fa36cb441538c8" }, "reference": { - "objectId": "0xe8bcfc0181e426b9dfcad3785fb4db1a0d0a2b1fa40c99a36b5fe988d2a2f561", + "objectId": "0xe72634ff60a76ad75299b6681e5ac68ae16cd5052f55ada644c69f6619ca8f96", "version": 1, - "digest": "2eMPqCumhC9U4G5rJmSr1ZKxftCS264Z8csh9zBbe4aQ" + "digest": "D4VEzzdqbxkjnuLkYKPPgzpiJnMiJMgehjMoTqStigiB" } }, { @@ -896,37 +894,39 @@ expression: "run_one(cmds, context).await?" "AddressOwner": "0x7dbda9c2efa8255eea64cf28b64294ffed6af432f53b661d24f3807895ee828d" }, "reference": { - "objectId": "0xed9ffc59b7e841e0de23ac1b72c4f04a784e2fef9c46f93eed0afdd14f8d047c", + "objectId": "0xe7445ae60304857a2efd0c4767583987a3de4f78a94e893aca46e957a7743c02", "version": 1, - "digest": "69xyHdtHM8S6Voaqv4VHX5p7kxehGDVEAosn236u3EYH" + "digest": "2yTbCF94GoG8oAZ2iL9RGP9gGMur4AKBhG2prqy3iFX5" } }, { - "owner": "Immutable", + "owner": { + "AddressOwner": "0x7a9730f69d7c9eed4058b7e3ad9019adffdf63a94ef73cd2fb0217f3b9eb6eb1" + }, "reference": { - "objectId": "0xeed5eebe436d3b4dedb5d25eff6275c5212fb408ab6e2d1756fd9c56b2af892d", + "objectId": "0xf1fa0fb0d8312d048e280ed73cf0fd19db5a666470ce8ef13ccafbf37f922b6f", "version": 1, - "digest": "HyUxFE4PT5azA17c56oxTLkT81weUpxi5ZkoCxefEbyC" + "digest": "FRv2kzMRCcA85oJAi1MuDrpCUT8DnNHsrZpcsrxEgJG7" } }, { "owner": { - "ObjectOwner": "0x723bc96ed7aa917e131832dd0c60b9b54bb74f5d6c7c5edb89251db0b2881d58" + "AddressOwner": "0x4b578d914e64de1ca47bead61bcfa0932646e16de6063089810cfa904eb8b06f" }, "reference": { - "objectId": "0xf69faa3aa3015380b78c11aae2ee8eed497bb5ee2555e686b53e375ab90fe8cd", + "objectId": "0xf87126f9f001bdf5a14efe58a703fd97d2e2aa6c8ee108243cfcc03f70bec36b", "version": 1, - "digest": "6e9719u3ETKKnmysHMKE5kJoPcV6qGc8gLkoecxbibcm" + "digest": "FQ1iAi2kLuFgs2NEDpYkMGeuB6JJHimhmFWdsvrevRzP" } }, { "owner": { - "AddressOwner": "0xb4b32db0fb2bc9170f796efb2439aeaf46fd0dc0b79af4e12d14bb87c3e9aa65" + "AddressOwner": "0x4b578d914e64de1ca47bead61bcfa0932646e16de6063089810cfa904eb8b06f" }, "reference": { - "objectId": "0xfe1d0d9ef3118023510cdf338ca59ae1d3e88e1ca98a3e1904d61a8620a1ad98", + "objectId": "0xfc3a360f44f32104c49dcf159ba04e021a42b04c969e2ecf3b7c3f8a5d4a4329", "version": 1, - "digest": "7iwW12UgvrywkA79tKwWSZ5AviKqcgKytqz9dWwZLDoh" + "digest": "4jsmns1bceQhaH1iN4mykXv6t4Uz7TELLsHQZDaG9NE4" } } ], @@ -940,12 +940,12 @@ expression: "run_one(cmds, context).await?" "digest": "11111111111111111111111111111111" } }, - "eventsDigest": "652jxdjvsGZDUHS3GoacF4VaCqx614uQNBBNuHSFZsWL" + "eventsDigest": "35Rz6E8uPDfRhMjHh6KWjbms7jhk7Msp6dJNqWgiT9up" }, "events": [ { "id": { - "txDigest": "E5Zp4QQ84PQEceSw4JRi4VTScSAQweKSgdwp9XH4aVPd", + "txDigest": "88FqW2hyUgShTyLcGzbh6scZB45XZYmXpXSxydkBVTPu", "eventSeq": "0" }, "packageId": "0x000000000000000000000000000000000000000000000000000000000000107a", @@ -953,13 +953,13 @@ expression: "run_one(cmds, context).await?" "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "type": "0x2::display::DisplayCreated<0x107a::nft::Nft>", "parsedJson": { - "id": "0xeed5eebe436d3b4dedb5d25eff6275c5212fb408ab6e2d1756fd9c56b2af892d" + "id": "0x47be074115c6bd8b19dabd11020c8b59bb7c8a1f64c78ec2a1a3ff366e524b18" }, - "bcs": "H5KEdze24AHvBWWazyGUYQRmhE3zFDzH85xKo3PGYFYg" + "bcs": "5q41VpETxpsuLJmvgz8orZJtx13dupKtKVZKVgKBNm11" }, { "id": { - "txDigest": "E5Zp4QQ84PQEceSw4JRi4VTScSAQweKSgdwp9XH4aVPd", + "txDigest": "88FqW2hyUgShTyLcGzbh6scZB45XZYmXpXSxydkBVTPu", "eventSeq": "1" }, "packageId": "0x000000000000000000000000000000000000000000000000000000000000107a", @@ -1003,10 +1003,10 @@ expression: "run_one(cmds, context).await?" } ] }, - "id": "0xeed5eebe436d3b4dedb5d25eff6275c5212fb408ab6e2d1756fd9c56b2af892d", + "id": "0x47be074115c6bd8b19dabd11020c8b59bb7c8a1f64c78ec2a1a3ff366e524b18", "version": 1 }, - "bcs": "2tpynDmB6yz6PBwHubkQHtuoUCpW2Ko34tEUKCUYU4hDbWkG2JELHHSrtenbXE8EcA9CHviCfpsdnvYbUpg58KW4EJBsb4tzfqEgPzNRmtWxM29JmEfgYygghy3oRsnjudFohMUgoKCCZbka4UHMvpVqKvEz9CKM9KrSvZFMEz6n2vyCUnuD6WZ7nKuTWmZD9SDKC7sx7VNCcE3iPnfN7gTJELP3UT7zNxWF1HnitZPdVdvgQwFmNsxpX881CXboKPSij3yRiLZauDknV6TDvus5QxB9sP7SioVbYSWMZoTdha1FAqRHWBT9r5buiKVj7WxKZiAm3ijfsVS47GbQ1xV3GSTvngJ4yUTp5TxFcdxRU18LsuvkTdMNwo9rwzyn1aKM3rHxCJ3fQgzBPVZ1Q5ENmHHfHpCxwprrYsktWCKM5RHErbTNog6PyB9D1wchgkNqaGvhFNmRP6bittnM33wBgoJ9MhE9CcADVeU" + "bcs": "ZzSKrm3oceLmwZC33JPMzNzgNauuSbGogjTrEYob4dec6NKXhiekQvdweVnVhiG2BXXSYkqFxoKX6n7rZRMfMn2ocXPfNaaVmAYu41kWspKsRkGqB55vC388z4DQaNssaDJn75a1rmfBNebTcB72UFVEMUQt5LGGXuTGmjJirWaNUnaDNmSocfcGY7Zg3KhccL49CGnGefDCW2H9Lb487RtrcJb8xnkDRozsFrw8uVCDGWXcRtXpfrZbkZQr9DVCUw1W3F2bysMki3euUKQdXsxs7agVmZjeNYryrpHTA9fgHDLBtzsMRqQFtScUU3wZ6bYCiqtmh9hsPtStGaoTmznXe6q9jtEpcWfqJq89VV67vyo6Wtd9Mk7VpsL65ib6ArsEhtG9JuJ6a7eCAN1HTtRTuL7zUiVyJm7kW4EdD5jo9RnPXaSzavxzDco3ZrfTVBe9sAfyrKkJ9oZeEu1exUfttgpWjdzbdXWsjA" } ], "objectChanges": [ @@ -1014,7 +1014,7 @@ expression: "run_one(cmds, context).await?" "type": "published", "packageId": "0x0000000000000000000000000000000000000000000000000000000000000001", "version": "1", - "digest": "7XoN6TGQbADiyEaVmrD6gmXJDJkX21MxGMc4pYCo9mKN", + "digest": "85UCZYd34oqKh3x3baQuV7giuUzyNLQvY1qL5UNFQa6t", "modules": [ "address", "ascii", @@ -1040,7 +1040,7 @@ expression: "run_one(cmds, context).await?" "type": "published", "packageId": "0x0000000000000000000000000000000000000000000000000000000000000002", "version": "1", - "digest": "5DVdPqNcu7yg8VSoQy9GwmoUprvHyK87jxnbRoac1r1S", + "digest": "9BM59kZjX2BAq8vFvKDuuZM5eKhtoGRxxXuS1kzFyVR9", "modules": [ "address", "authenticator_state", @@ -1103,7 +1103,7 @@ expression: "run_one(cmds, context).await?" "type": "published", "packageId": "0x0000000000000000000000000000000000000000000000000000000000000003", "version": "1", - "digest": "B7r86UhqxCjrBYVNGnSf7QBNX7EWWm7kLHZ5ht1MLAre", + "digest": "75Le8fZznGd5Bvzxuve3UPQKX2fej1avUJYnA3J1rBjk", "modules": [ "genesis", "iota_system", @@ -1129,7 +1129,7 @@ expression: "run_one(cmds, context).await?" "objectType": "0x3::iota_system::IotaSystemState", "objectId": "0x0000000000000000000000000000000000000000000000000000000000000005", "version": "1", - "digest": "8CWv4f5Nov5aRXTQa2EJk7zsNhfKVbX1fEG8VP6Wsa6d" + "digest": "UT7gYyRZBUj7sgGKbuyMvxTS32HZZvr98vXruhZ9buM" }, { "type": "created", @@ -1142,7 +1142,7 @@ expression: "run_one(cmds, context).await?" "objectType": "0x2::clock::Clock", "objectId": "0x0000000000000000000000000000000000000000000000000000000000000006", "version": "1", - "digest": "DjXTupBThwgJcFY9YDL2Xan9bwTTA3BYrW72Dgh1AMJA" + "digest": "9BNNarX2ktYyq83ySt9hkq5Nr95e3NWdLDaUtFxPv2Lj" }, { "type": "created", @@ -1155,13 +1155,13 @@ expression: "run_one(cmds, context).await?" "objectType": "0x2::random::Random", "objectId": "0x0000000000000000000000000000000000000000000000000000000000000008", "version": "1", - "digest": "aCZvLjShGf5G1AEq3jb9c3y3jxi8NhX17kFUxKwt1q1" + "digest": "7UbMmfwwtbb9RxAtRAuqND8MieggKR6rHn5nvqdqx1HZ" }, { "type": "published", "packageId": "0x000000000000000000000000000000000000000000000000000000000000000b", "version": "1", - "digest": "7rF3B3o4ZHxju9pxz2eGmYhigdg5MBx4WLkyYcBaMMs9", + "digest": "5wsBmq7vkfrRoEqcDxgtJCmLn3YfYRJHP8i6U2EnBgLn", "modules": [ "bridge", "chain_ids", @@ -1184,13 +1184,13 @@ expression: "run_one(cmds, context).await?" "objectType": "0x2::deny_list::DenyList", "objectId": "0x0000000000000000000000000000000000000000000000000000000000000403", "version": "1", - "digest": "57nJzNa4jJBPDpbVVKcntb8rEZLhwhAsLAH7o6r6YLAb" + "digest": "GYMKk7f1KhowX6cq3QBKPZHuosPTMfEXpXDqNDW47zQp" }, { "type": "published", "packageId": "0x000000000000000000000000000000000000000000000000000000000000107a", "version": "1", - "digest": "5Ad5TaF7cAZwf8U3rTD19oxAEfrhptBrSg9qGfYf36nY", + "digest": "EZXQcnmtgSTVm437D9yzcoQ3ToKAeoqD4eJ2TLE8KJxo", "modules": [ "address_unlock_condition", "alias", @@ -1210,120 +1210,111 @@ expression: "run_one(cmds, context).await?" "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x4b2a0b010344ffda7202ecd5f76b742b78516cfcdb208e3314d65a4157654c4b" + "ObjectOwner": "0xc2f868e67e57dae016192c5e39e5da2fc5b091badcf0a2e943f859c736187657" }, - "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0x00d74df673e00106b1a45136cf8cfae1ca792c3de53232e06d09fbf5d4f60b66", + "objectType": "0x2::dynamic_field::Field", + "objectId": "0x00f22f34d2616c7f8ba4495bb560e3cf43ebf18cd2ccac12e495f57d1bc6f25c", "version": "1", - "digest": "57LAitmwQMZgioGaRVybfVmZ2Yc57HrJ2Hkm7iGmX5aD" + "digest": "9r9ScS86fEETEc2esEQDGgrGdkC8JSDA1HjAtBA7KGDF" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "ObjectOwner": "0x1d3c44ed95179381aec577194b10aaaccddc14ceedf533b9b6b4eef5535476e0" + "AddressOwner": "0xb4b32db0fb2bc9170f796efb2439aeaf46fd0dc0b79af4e12d14bb87c3e9aa65" }, - "objectType": "0x2::dynamic_field::Field", - "objectId": "0x0214b29e560e3fa6b37836ed7167db0da40a1823cf8b01f0690e1b3bfb4ebdc5", + "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", + "objectId": "0x020f19ebc937d1d40077d2abcde980c8b048ca8dc3ccbac358c7c94b82b20fed", "version": "1", - "digest": "3w6HwgnTmaGDCnAciokuEpZHj2NjFWv6i9KiCHqH7Nct" + "digest": "Ann24wsSiJBWNtRJnib87r4B9XU5eJgRuBPAKDr15X1e" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x20227cfbc6699debf187d2d7bca3d253cd50f87c165516d3dc53a246a9af7182" + "AddressOwner": "0xb4b32db0fb2bc9170f796efb2439aeaf46fd0dc0b79af4e12d14bb87c3e9aa65" }, "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0x04942308c8384041a5af2c13c807418d069d3a6e53519dadd1236f0344385a14", + "objectId": "0x0260aaaecfef6cce63c55d8f470a06dcaf445151a2785888011a8e2194cb4648", "version": "1", - "digest": "811mkHeY9LoDN16a3CSnr22AZK8R2rJa9DbDwuvDp9kd" + "digest": "DNPTGrZEvnFwQBc9SKeTWQfnQy8SouFbUkXooEpdRL8P" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "ObjectOwner": "0xee64ad330164aaa798846df2f2df3525410779fb120765a1c5fb1f931bed784b" + "AddressOwner": "0x2868fed4dbeb23d2ace3ee3ad6e39061423c5692a2b289b39c643c0baf2d8d85" }, - "objectType": "0x2::dynamic_field::Field", - "objectId": "0x137cb52b1bbef8e93857fd3dc67f7f70f2aabc1d7d6eb4afb28e7dea87b9ccf1", + "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", + "objectId": "0x02ebee2236a4cf262c571124e9a0931ae4c9e236085457e9483698d041a93586", "version": "1", - "digest": "9fG99ZbX8SPLLkLnRcah82PyLY3BSbgbLD7HKD6XntZ4" + "digest": "H9URfhPraVYY3S1LDcGkzwMxCJop5bRJUtSYKrNQGFHe" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x4b578d914e64de1ca47bead61bcfa0932646e16de6063089810cfa904eb8b06f" + "ObjectOwner": "0x85c7bca7f3fb7ebfe0d076cdb331ac21abafbcda69065c1abb1056278e0156db" }, - "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0x2a74fa6e7b6f90225cb36fcdc3e416d1d3d9e209ab14aafff3afd2c3587c9aec", + "objectType": "0x2::dynamic_field::Field", + "objectId": "0x18f627179e18aed322f828570d83454d3b312e171982c3527b0f41764a367a1d", "version": "1", - "digest": "E37WvCF8d2asqAJH7MtR9rnyiWeHqjgsQqL4gbjAwgLk" + "digest": "2idkUZoaajnS1S1sJtGSszNBzGv45q47sTv5jruCM78S" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x44f42943b20151d6a0c3cb0f84006b3441bb3378c668a6df71fa36cb441538c8" + "AddressOwner": "0x2868fed4dbeb23d2ace3ee3ad6e39061423c5692a2b289b39c643c0baf2d8d85" }, "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0x2ad996aa647ab628cf294b4d98b24c9debb351e72b4a72ee3425b7d9a41d08a8", + "objectId": "0x23dfee0adf69baea358751a2a081bcfa4768ea2b1c7d6a882575076e0791cd2f", "version": "1", - "digest": "F5fPj6gyhcWnNMJTnxis1goTvTNUXYr69zJudZaqMt2t" - }, - { - "type": "created", - "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", - "owner": "Immutable", - "objectType": "0x2::coin::CoinMetadata<0x2::iota::IOTA>", - "objectId": "0x30f537424026a4259959d4c28f4b474558ba881bb517267f9dac6e7bc7518a5d", - "version": "1", - "digest": "CF2vkHV4X8YVrhgVKRafUDX7HmSbxSkvmwFYFPkEE4PM" + "digest": "7b2jvLUFXF5J8Ue2tPoPUvtbtTkhcPps6Xaa77NywDS1" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x7a9730f69d7c9eed4058b7e3ad9019adffdf63a94ef73cd2fb0217f3b9eb6eb1" + "AddressOwner": "0x2f1c55f14bcab32b91bccbf9909aa2818d644d4a1f6401c37f97383e4d8275ca" }, - "objectType": "0x3::staking_pool::StakedIota", - "objectId": "0x3ad5e2039f28a1d146d5f7e2094b7e55f1cc35f34a53aa207250d51e76febbb4", + "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", + "objectId": "0x24a640dee174b0ed74322070be09e3bb9d96c646858f47de7c1b663496cd6672", "version": "1", - "digest": "2B9M7nEmFp1jcPM72pd7qXNNenQZwdp5dGu4xoykGeXZ" + "digest": "2Q2aeKK2fLQBQX83ihYjpkyEoTDyhEz1QicN2sH1XqKL" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x7a9730f69d7c9eed4058b7e3ad9019adffdf63a94ef73cd2fb0217f3b9eb6eb1" + "AddressOwner": "0x2f1c55f14bcab32b91bccbf9909aa2818d644d4a1f6401c37f97383e4d8275ca" }, "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0x3e14d7d3f210d79f29a18955f4e98676ebb40e51119ddd6d26a8add99daceb95", + "objectId": "0x2508c2e30a9718a98cef20f0cb58fa74d79bf743a5c73441a70640f96bbf68f0", "version": "1", - "digest": "A6ZSdzLj5Bvv27zaQoFm5rUkS91sK8nJKfntqKbHepUb" + "digest": "3uEZ8L6yNm61aZDW9TU53Gw5ecTBceJHjdFsbbN3PnSc" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x4b578d914e64de1ca47bead61bcfa0932646e16de6063089810cfa904eb8b06f" + "AddressOwner": "0xb4b32db0fb2bc9170f796efb2439aeaf46fd0dc0b79af4e12d14bb87c3e9aa65" }, "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0x3e5742903bb62d61adea88aa26bad2fad57984e3eefc58a2f1810b82228e5117", + "objectId": "0x29723a1c473b6f6d2c10a9ccddcd8062a3dbb24b31091470c9341ca36d004c7c", "version": "1", - "digest": "3MVJSV5RKkXLxsTdHqPQERjnmAQAoxkkiRv1Q6G8zHaU" + "digest": "EKpry9R3MSw89yYRN9dd2KbVwVVzXrNWtwgDPw1qbDpu" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x4b578d914e64de1ca47bead61bcfa0932646e16de6063089810cfa904eb8b06f" + "AddressOwner": "0x2f1c55f14bcab32b91bccbf9909aa2818d644d4a1f6401c37f97383e4d8275ca" }, "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0x42cfd74b065c48da45fe6048796ce9cdd3a380c182e7d89573fabc229e3ce4ab", + "objectId": "0x299f315d1f944855d2fb3f3868d18a32cf2e7f243d3a057b2724ce4395106cca", "version": "1", - "digest": "5AzKkrWAReMDgNF2bbiveSDDWvJpQzSX7xHRHNJu9Phy" + "digest": "BLfSDqvn8aNUfAxrWVfdMQSjGsiDqM6Zi4ELFgfRjxTL" }, { "type": "created", @@ -1332,42 +1323,40 @@ expression: "run_one(cmds, context).await?" "AddressOwner": "0x2f1c55f14bcab32b91bccbf9909aa2818d644d4a1f6401c37f97383e4d8275ca" }, "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0x4728ee263c6a7de9fcd0d4d58db500e0ceed99977f44ca323e9a521970efd085", + "objectId": "0x2b7c5961cbac364bb9711f2791019b594c9110be9c4ed246cab9fedf9bd159e7", "version": "1", - "digest": "781mLWh1jZYNUxtypVJ4XWvHvvga91AZyRfrtXSG53RZ" + "digest": "DR61KQATeDiSkpFWft6ckEC5Cv4YA8ws9W8YoGQDZTGA" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x2868fed4dbeb23d2ace3ee3ad6e39061423c5692a2b289b39c643c0baf2d8d85" + "ObjectOwner": "0xc7cf938bf2621982fdbe983a16f7e1ae01358aab0dee88eed62ccf03b0538b35" }, - "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0x495af1962cebf47d1eb0cdabb02508114dc8a05c8bb4e6c18b8e81af78c8c4b5", + "objectType": "0x2::dynamic_field::Field", + "objectId": "0x333a99382fa83b4d0e6ed4f25018e848af2f0a48ca06e94948f1aec691011080", "version": "1", - "digest": "A7cf1SRMJYAqceQb78geXHujpHQuiqEggZnWu24enHu1" + "digest": "5EzJs5Q9tzmn73soqnrghEWHZsZRmsC1MoXzsUDLjZje" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x7dbda9c2efa8255eea64cf28b64294ffed6af432f53b661d24f3807895ee828d" + "AddressOwner": "0x20227cfbc6699debf187d2d7bca3d253cd50f87c165516d3dc53a246a9af7182" }, "objectType": "0x3::staking_pool::StakedIota", - "objectId": "0x608863c1d4738cb9829f9bd7c5b3ab15123b6e6eab762dedcfacc23ec23d37c9", + "objectId": "0x45f36b9e92ea7ce24fcf76b9a147f91d6329d19d2b79ba0252bd1be4fa0b3114", "version": "1", - "digest": "6NnLvzoYdm9qBrrsgCj3x2vtrQeMceUt1QuBSvxvgXq5" + "digest": "ku4ZwBs3e3wxPf1jfQ4RDFYhW5WhvGvwURSZNCEBkkd" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", - "owner": { - "ObjectOwner": "0xaca630a6c6d4a9e7a7b033174b3952dfd7c2edeea9fa3a356e97d1a5bc31dae0" - }, - "objectType": "0x2::dynamic_field::Field<0x2::object::ID, address>", - "objectId": "0x660e677bad9d848d1f131d14faef42025eedf0f0e14ede894760e0ebb51a80da", + "owner": "Immutable", + "objectType": "0x2::display::Display<0x107a::nft::Nft>", + "objectId": "0x47be074115c6bd8b19dabd11020c8b59bb7c8a1f64c78ec2a1a3ff366e524b18", "version": "1", - "digest": "EJiD9QzGf9afkBrdYyCfsg9f7Cx64oSLDTVMuvxc2jb2" + "digest": "ACEM96A7XicvdzrRuD4LRm6KyocHATyRKDfKkx9ZaL21" }, { "type": "created", @@ -1376,9 +1365,18 @@ expression: "run_one(cmds, context).await?" "AddressOwner": "0x2868fed4dbeb23d2ace3ee3ad6e39061423c5692a2b289b39c643c0baf2d8d85" }, "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0x6689ff8b1b4ce68bde6f39ebd1031e0339a4036a66b7d0a85c366ac0e6817748", + "objectId": "0x4d03f39deb5e27a76a568adb591da553688e6df6fb053bc9ac069f2bd9495ae3", "version": "1", - "digest": "GYs13Dvcx4XAj76Q4fYfXEgFTyUvVfZYorzvFv8KBRrc" + "digest": "6cjAEhKn8mmgQC6TPSrFASBNUBcSkTscuYpVdBEBbbfz" + }, + { + "type": "created", + "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", + "owner": "Immutable", + "objectType": "0x2::coin::CoinMetadata<0x2::iota::IOTA>", + "objectId": "0x50cb4102d8bc479b9697d6e9e7327e23cb1f00400261f919c8745e49c7732e54", + "version": "1", + "digest": "J9f9eKbfyHs6ks9tGxQPCp41pRfgKy8oRqU4gZb4nMha" }, { "type": "created", @@ -1387,218 +1385,218 @@ expression: "run_one(cmds, context).await?" "AddressOwner": "0x44f42943b20151d6a0c3cb0f84006b3441bb3378c668a6df71fa36cb441538c8" }, "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0x69cd03a3cc6b2e4a1eae6bef4892f642d8f87ed3d83b758cc5242034bd36f565", + "objectId": "0x566ad3b404129b7740255d9eb77d8f649816cbf8f4fa4f0e0b3088eb40f4be7d", "version": "1", - "digest": "FSfz1Dtc26vvg9ASRGoVHGg1WVbVqLcBtvrcYtTt6bLe" + "digest": "Hg7fVwRrTquxfD5nN6X8jNLbmdE9xiFbw6frCPPmdXWu" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "ObjectOwner": "0x0000000000000000000000000000000000000000000000000000000000000005" + "AddressOwner": "0x2868fed4dbeb23d2ace3ee3ad6e39061423c5692a2b289b39c643c0baf2d8d85" }, - "objectType": "0x2::dynamic_field::Field", - "objectId": "0x6af2a2b7ca60bf76174adfd3e9c4957f8e937759603182f9b46c7f6c5f19c6d2", + "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", + "objectId": "0x59fbac7e900adfc10b42456542f93bb42ddbcb5bbf56b8427e32ef09d990b184", "version": "1", - "digest": "Er8zLC9VrCrgZZcnhjLkA73mZ3J63rxiboYV6EsqmhN2" + "digest": "GCGVjasFfqD2HKisfq4RWi9FaDRVxwMSf2M7oyT6p9uG" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x0b37c2167535af8a5729c44690f7be89eb248a6eb3cda5fd37ee1029949f0c29" + "AddressOwner": "0x44f42943b20151d6a0c3cb0f84006b3441bb3378c668a6df71fa36cb441538c8" }, - "objectType": "0x3::staking_pool::StakedIota", - "objectId": "0x6b2a75a39565fe93f6f2694e79274205ec65dac6aecff0a38b3c3947e2c9e561", + "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", + "objectId": "0x63de3e53d6a19a6d42db458e025917b19340a94c638039dc6f771618dee1c6f9", "version": "1", - "digest": "Hy3XSG83B625ywGh161TYQ2VqBJzKxFccgp1fL3Zjbob" + "digest": "Bv4sCpQQgssCQroeqq5e9VctzQiXbefNVPxi9DKwU7Jq" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0xb4b32db0fb2bc9170f796efb2439aeaf46fd0dc0b79af4e12d14bb87c3e9aa65" + "AddressOwner": "0x7dbda9c2efa8255eea64cf28b64294ffed6af432f53b661d24f3807895ee828d" }, - "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0x82054bc6567488b4924203907f0bc62f3f789e1f5edc901798c5a58042dfa1a8", + "objectType": "0x3::staking_pool::StakedIota", + "objectId": "0x65b17c1361e97dd96998ec36253fe21441400d111d790d7b312dfe9364687338", "version": "1", - "digest": "DRYTDtLfuoxayHMXVqxuuWvv4DJnjgZQvoZebdCoGszX" + "digest": "CEMFxNJKgsJoZS5p6djiBcoas2yjWYGe93ib4fmq7mU" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x2f1c55f14bcab32b91bccbf9909aa2818d644d4a1f6401c37f97383e4d8275ca" + "AddressOwner": "0x4b2a0b010344ffda7202ecd5f76b742b78516cfcdb208e3314d65a4157654c4b" }, "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0x8a23c86abe72190400e37fd3affc876000ad1302712cbdaf76077f7d541b6400", + "objectId": "0x6665f50841dbe82152d70d15b852a1d2471a83c162830438afb06c3e1717d2c1", "version": "1", - "digest": "2fqjooDKXPoqAFBjzh6cGr53zuTfngNLuHzJoPoR7uvk" + "digest": "5FQAwHKd9BSMAqByENw4AjBPxtu1dUFdvnwFnP5ssefc" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0xb4b32db0fb2bc9170f796efb2439aeaf46fd0dc0b79af4e12d14bb87c3e9aa65" + "AddressOwner": "0x44f42943b20151d6a0c3cb0f84006b3441bb3378c668a6df71fa36cb441538c8" }, "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0x9045719b475148ea5e0547b2a0dd8f8aaa19a658deac6bfca7a184d1dfa13d87", + "objectId": "0x6a70af3f08b53d7bd91be9ace2da765e9f7ab0f9046eecd0a92c41897eb742d4", "version": "1", - "digest": "9puPcXBGsDq9hTfkFMUHpmruAkuqsqQmBt6b2ChxRU2f" + "digest": "F244scn8ByNwXxG7Sd2zCkn4TTrGPHy8c1ixYdK1VHyP" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x2868fed4dbeb23d2ace3ee3ad6e39061423c5692a2b289b39c643c0baf2d8d85" + "ObjectOwner": "0x0000000000000000000000000000000000000000000000000000000000000005" }, - "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0x9135cb3b5aca99a1555b742bd11ddc45fba33343be182bdc161be69da2c41be1", + "objectType": "0x2::dynamic_field::Field", + "objectId": "0x6af2a2b7ca60bf76174adfd3e9c4957f8e937759603182f9b46c7f6c5f19c6d2", "version": "1", - "digest": "5B8YV4P7Q93phJVPgm8MVZzsoXdSxFnKLAjAkMnLYcQb" + "digest": "6AyGKpbs2yy8j6nt6mXVuE7yvhYQvZ1quTi1nhZm67nQ" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "ObjectOwner": "0xaca630a6c6d4a9e7a7b033174b3952dfd7c2edeea9fa3a356e97d1a5bc31dae0" + "AddressOwner": "0x7a9730f69d7c9eed4058b7e3ad9019adffdf63a94ef73cd2fb0217f3b9eb6eb1" }, - "objectType": "0x2::dynamic_field::Field<0x2::object::ID, address>", - "objectId": "0x9254a40663ad7e72d73dd1f04b1eca4e0486cc9f54cdd9a7c3d4e479a8131aa0", + "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", + "objectId": "0x6f651492979fb7f04a2eb053ec8559074c2fa562d8ee922cf2c55277978d5c89", "version": "1", - "digest": "Du8gWCJQvqcsNBEpSYTDSB2aaRyVEG8h7niCPhKQtZFf" + "digest": "21JXcJtash7RUymcy5MvDHHHsWewg6H7Ck36RbcPruKp" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x44f42943b20151d6a0c3cb0f84006b3441bb3378c668a6df71fa36cb441538c8" + "ObjectOwner": "0xd6aea7b7b28562ef76634df18c8c84e7f0d456d0053c9f3264e748aeaaf61ec2" }, - "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0x939337494e5c4fe00e78f120459bf108367938719f717e32c845ab83e762f22c", + "objectType": "0x2::dynamic_field::Field<0x2::object::ID, address>", + "objectId": "0x71654ced3581c229f5f2743a808263effc4e63090835f77ca9e8ec4bf667ce5f", "version": "1", - "digest": "5RBuu4Mz4xV3bQAdU8DQnXLppZtpjGToNcoVujUfpxwG" + "digest": "AJXAfxWsnsNRLrdxeARMMXMs7bAw93r1Qu2VG9YB9jH8" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x2868fed4dbeb23d2ace3ee3ad6e39061423c5692a2b289b39c643c0baf2d8d85" + "AddressOwner": "0x4b578d914e64de1ca47bead61bcfa0932646e16de6063089810cfa904eb8b06f" }, "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0x94b18ab08b2ddd60e7db0756a605bd31589136eb861b76f49ff3b5ae688f65bc", + "objectId": "0x74f9e1e67cc981675746f2811572b4ea8ce3e6835f49398313b97ad19322f7c5", "version": "1", - "digest": "DXGesd5mWPPaLtwza28GDfumr9NqswcfpbcHp2LaL287" + "digest": "CmYJTpbWV1sJKXaRXA6FnXcaRpaW2eMufwpi1YV3Haet" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "ObjectOwner": "0xaca630a6c6d4a9e7a7b033174b3952dfd7c2edeea9fa3a356e97d1a5bc31dae0" + "ObjectOwner": "0xd6aea7b7b28562ef76634df18c8c84e7f0d456d0053c9f3264e748aeaaf61ec2" }, "objectType": "0x2::dynamic_field::Field<0x2::object::ID, address>", - "objectId": "0x98c27dcdc3cb082f2ae47756648c92ee054721273663cf0ad25d7f2d4fd20128", + "objectId": "0x7e87e1c8ff4d9ac72fd6af8e55bc23404dbada8ac7ed2e234524e76904f362cb", "version": "1", - "digest": "h6NdgxuL5GUffJJjUicoXB1yDDv3qytM1PJFXQQvxdi" + "digest": "8oJHcJ3vePe99k1VKjrbLxYwmk6LXcSuwvethwzzFreX" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x2f1c55f14bcab32b91bccbf9909aa2818d644d4a1f6401c37f97383e4d8275ca" + "AddressOwner": "0x0b37c2167535af8a5729c44690f7be89eb248a6eb3cda5fd37ee1029949f0c29" }, - "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0x9bafea6cfb0a89e0eee6e66ec0d598848067196ed07857012e00e609e8f3ca17", + "objectType": "0x3::validator_cap::UnverifiedValidatorOperationCap", + "objectId": "0x813dd1c1277072ec5f24cc2628513883618b6987fc5435b872cab8f27102329a", "version": "1", - "digest": "3yh2VHtBQACirSUeoFC6YGUimULgQEAeXVHQYzC8423e" + "digest": "4b8z6dtD5Ztw2Ln26qmnrLdgnUcUpJLnBV1Jzxf3Dkqs" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "ObjectOwner": "0x7a85e205f86b500a8597a0e3258cfd36cb5e39c04580f5598e501dc31aa55979" + "AddressOwner": "0x44f42943b20151d6a0c3cb0f84006b3441bb3378c668a6df71fa36cb441538c8" }, - "objectType": "0x2::dynamic_field::Field", - "objectId": "0x9df5ecf6c7c2ed3f31b6ff471aaea04af7d331647c34ab319c8eef45dd043620", + "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", + "objectId": "0x9756463d0f40b3b3ac6de7026fb38690ab2b998dfeb72a51cdd563ae0c373f0a", "version": "1", - "digest": "Fnr1EGFNzyCZgEjLJAYYzHfWrxdLdD1epz2ToST4bTQY" + "digest": "GGiQhnbFhpMsyoL61fW7rcA4AYtBDW3QXciHDfCjYdfa" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x2868fed4dbeb23d2ace3ee3ad6e39061423c5692a2b289b39c643c0baf2d8d85" + "AddressOwner": "0x20227cfbc6699debf187d2d7bca3d253cd50f87c165516d3dc53a246a9af7182" }, - "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0x9ee19bb4564baa0449b5160e4dccd02d5d8a54ca794aaba2130db4feb809c1f5", + "objectType": "0x3::validator_cap::UnverifiedValidatorOperationCap", + "objectId": "0xa4a778c9213d3035bca59c69f380e80fd7196a72a3e2b51cb22dea1411d91401", "version": "1", - "digest": "zoUU8mDtdVPRCqfRKWmd5VpMNfgBHd4jVjq4gu8i9vn" + "digest": "5rfqFb512rV1VZtQ7GGS86hfKe1tR4BAD8FikiPgfHLc" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "ObjectOwner": "0xaca630a6c6d4a9e7a7b033174b3952dfd7c2edeea9fa3a356e97d1a5bc31dae0" + "AddressOwner": "0x7a9730f69d7c9eed4058b7e3ad9019adffdf63a94ef73cd2fb0217f3b9eb6eb1" }, - "objectType": "0x2::dynamic_field::Field<0x2::object::ID, address>", - "objectId": "0xa01451ee51efc5ef58d07e5d373b68187ee3a042553670da8a4dc613adf3ed61", + "objectType": "0x3::staking_pool::StakedIota", + "objectId": "0xa51b7309e9d47b1ba39cddc19a2e5308b1cbaf73112697fbee332a4a66014a85", "version": "1", - "digest": "BUizCaTGo3YEdsuDzodmKs9njztBmrQbpNA5DXiLcXZt" + "digest": "J9Rn2JkDpMZu43WdiN4RtR4VATkLt5a3223N1g8nUKW1" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "ObjectOwner": "0x337b119cf80fabd2c403926df427294e0d1c5444a317a42b1c9dbdbc07375f1b" + "AddressOwner": "0x0b37c2167535af8a5729c44690f7be89eb248a6eb3cda5fd37ee1029949f0c29" }, - "objectType": "0x2::dynamic_field::Field", - "objectId": "0xa181feb7b518f4e06794c678eace3633c6b1d7222736e9d059e75ca3023b95a0", + "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", + "objectId": "0xa93e761264922c29a33a97b7330bebdfc7eceb438260efd44ff08a7b407d118e", "version": "1", - "digest": "CYWkB4L1JxphwGcDyzdFZQfNcfbhV33jWxNkRxgcquSH" + "digest": "647NGY7b4MXwdWi5krZj2Uhk6tz9MnZSJNu2ivRdfBrf" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x7a9730f69d7c9eed4058b7e3ad9019adffdf63a94ef73cd2fb0217f3b9eb6eb1" + "AddressOwner": "0x2f1c55f14bcab32b91bccbf9909aa2818d644d4a1f6401c37f97383e4d8275ca" }, - "objectType": "0x3::validator_cap::UnverifiedValidatorOperationCap", - "objectId": "0xa629b978cb416fdeac008d532329429114c70e49909d97bede0f794b376eafe8", + "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", + "objectId": "0xa9e70f2bac16567977470169378c3496ac727b9489add6399ba7a568d9d40aa6", "version": "1", - "digest": "6Mtsb7P5EAb696MW6fHanVamZe9zSR8kbnAf7kfZd4n8" + "digest": "2MHZVnXihhSBVxMaw73iiDXR8nTCysGtivdzyAqE3D8f" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x44f42943b20151d6a0c3cb0f84006b3441bb3378c668a6df71fa36cb441538c8" + "AddressOwner": "0x0b37c2167535af8a5729c44690f7be89eb248a6eb3cda5fd37ee1029949f0c29" }, - "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0xaca6bf6562b4cbbd909e6f9310c23c9517deca84e82d22dfa781c3dd980bbc95", + "objectType": "0x3::staking_pool::StakedIota", + "objectId": "0xa9fa3dae3e8fa5eaabe1b29d5af2f0a25490d41677b58c4bedbe1920b03ac7ef", "version": "1", - "digest": "Akr7cJiBjxTYvEm5GttimcB7NVBu8qEU3JEMggT2NkVS" + "digest": "GvqzaN32ixA3ES5RosrYLox3YiYp6UwCxhZzTCwH1Nvv" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x2f1c55f14bcab32b91bccbf9909aa2818d644d4a1f6401c37f97383e4d8275ca" + "AddressOwner": "0x4b578d914e64de1ca47bead61bcfa0932646e16de6063089810cfa904eb8b06f" }, "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0xb12dd88f42ce5db0ba12181deae915d795de5a1e4dfe87deb44a51c8dd8ced7a", + "objectId": "0xbd8eaa142a631472ac39ba6172ad0dd11af7cdb633acdc2e62adbbecf2469578", "version": "1", - "digest": "AqgNX8aLoZyCfmq3N3F3kaMTRWpQCQnZ8uzxJvfckbFM" + "digest": "HcAw9ucPpCnJDk34um1JaYfrtmRB2xy7uUM2WjWHQFH5" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x0b37c2167535af8a5729c44690f7be89eb248a6eb3cda5fd37ee1029949f0c29" + "AddressOwner": "0xb4b32db0fb2bc9170f796efb2439aeaf46fd0dc0b79af4e12d14bb87c3e9aa65" }, - "objectType": "0x3::validator_cap::UnverifiedValidatorOperationCap", - "objectId": "0xc3647488b7f826d5e2602102964e93859bab9374389c1cca8799f91c2b8b1589", + "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", + "objectId": "0xc040e5614e1e604d3bc663b9f612a818ebb918aeab40a6ba25caa7a2a6a237b6", "version": "1", - "digest": "65ZbHUaDjGRnqwUVGHiSVeHV1Koxpcmk2pPKv9Uj9wYR" + "digest": "BfpGVgZcxazX2hhxe18NkCiTotN38HcXGxe94N4Lb65v" }, { "type": "created", @@ -1607,86 +1605,86 @@ expression: "run_one(cmds, context).await?" "AddressOwner": "0x4b578d914e64de1ca47bead61bcfa0932646e16de6063089810cfa904eb8b06f" }, "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0xcc36edb95e82c14b7175ae99e58c3a27b43fb1ba7d7f1454fbda1ce66e0e5a8f", + "objectId": "0xc31493f7fd0cbfaad8106574193f492d2727bf48db0602f78b155da5a51402ba", "version": "1", - "digest": "4X4Mmi3CynwtZsuonDK26HvV4SyQ4d4SykRdn1KLu22a" + "digest": "9mbG13HJkdZ1iqLcNYc1UFe2v6haXh3kemomT77LQS2o" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x0b37c2167535af8a5729c44690f7be89eb248a6eb3cda5fd37ee1029949f0c29" + "AddressOwner": "0x7dbda9c2efa8255eea64cf28b64294ffed6af432f53b661d24f3807895ee828d" }, "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0xcf326c0a4f56e81beb81e1ee93cda5bd5bc5e88fa4b730a1909679b2ffb3f0d3", + "objectId": "0xc325849c128782699f66a3fea12d317b5486309cae90a5cce5c9a013d504f000", "version": "1", - "digest": "DcBPndnKeykAEYA7cmTz7PW7u2pg46nUB7JDEG2gEaQj" + "digest": "3ubyCZKjxR6RoBSxz5rp11eiWuKXgPU9iVkmccZSL735" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x20227cfbc6699debf187d2d7bca3d253cd50f87c165516d3dc53a246a9af7182" + "AddressOwner": "0x2868fed4dbeb23d2ace3ee3ad6e39061423c5692a2b289b39c643c0baf2d8d85" }, - "objectType": "0x3::validator_cap::UnverifiedValidatorOperationCap", - "objectId": "0xd3260d5e56e16920f270b3f92a40782447e360ea000aba2af08f0d1f8ad6b5f0", + "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", + "objectId": "0xc6e00266120ad997beadd6b8d3ebc6d9f68460ede3e249d5885e108f39898ed6", "version": "1", - "digest": "2W8RQHXqNzdkhKPUCmawicG7iHgvR6BXYMCiktweVruJ" + "digest": "5UUM6FvaxCuzJnnWoSQph4mPRZo7SHxM6ydAemxRcuY9" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0xb4b32db0fb2bc9170f796efb2439aeaf46fd0dc0b79af4e12d14bb87c3e9aa65" + "AddressOwner": "0x20227cfbc6699debf187d2d7bca3d253cd50f87c165516d3dc53a246a9af7182" }, "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0xd43afda73e2bb89e67d8049618176ba09456438f9fcea5f8a3e91f8a1b17ecd8", + "objectId": "0xcd7e3cb7274220eddb40315c39018c145a4bdc29ae274897178a00e9e5df7719", "version": "1", - "digest": "8PrSccVLMdHmUji4HbGeUvxh8WTHDnzqk75tWz67Tf8d" + "digest": "Hfot87knyUxj4uLhajMUW2Eh83vb6xguhE8q5GqzWwbw" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x4b578d914e64de1ca47bead61bcfa0932646e16de6063089810cfa904eb8b06f" + "ObjectOwner": "0xb419c5eec03155cddf033685be7ab8bef9fc1e9134d1108f86aab0c0e94148a1" }, - "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0xd8fa8491b91a220af49eb0b54e1d5de725ca40cad8ecca989f27a2f713402490", + "objectType": "0x2::dynamic_field::Field", + "objectId": "0xd813cf320b2cbac0e64c8983484130518715c01961a0bbd2667b055117967dd3", "version": "1", - "digest": "F7NGNkMwvuPkKEuvnYgErENvp1HqQfWkMNySiKssSy6b" + "digest": "4j1Z5GvY1q5qRR2ArCEThV4cFT4BPN7DYgk1hZcwXqE7" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x20227cfbc6699debf187d2d7bca3d253cd50f87c165516d3dc53a246a9af7182" + "ObjectOwner": "0xd6aea7b7b28562ef76634df18c8c84e7f0d456d0053c9f3264e748aeaaf61ec2" }, - "objectType": "0x3::staking_pool::StakedIota", - "objectId": "0xdde2baa8f84257d47c8051b5abd214afb850211d7ee74a99c21698e8bd66f81d", + "objectType": "0x2::dynamic_field::Field<0x2::object::ID, address>", + "objectId": "0xd9677e045ceed60ae258d0fc79f2e04b3b54cd1e37d2bb4ea5364651d81a354c", "version": "1", - "digest": "3ue34riJ3GWEcmegp2kzVEpnHgWzamPaCZTx7kpjc5ZL" + "digest": "D6o7Zm3PfJ6X92p2m6ZyjAAWVCNg1CQRdSpWRtJAnetM" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x2f1c55f14bcab32b91bccbf9909aa2818d644d4a1f6401c37f97383e4d8275ca" + "ObjectOwner": "0xdf12e15860adaae1cd6c238227a585c224ca47ed05239e88f3230bd08ed9b698" }, - "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0xe0ebce954f5f7a4f32e3fa49fa1b76bc1e56008535860b3fe78387db50f95dbd", + "objectType": "0x2::dynamic_field::Field", + "objectId": "0xdf7bf4613216b40876db6e0e41da95724ed3521fdc36a031ba70a66f4fed33d4", "version": "1", - "digest": "kNSMhUBQszVBjveLRYdxX9JEUiLzdV3vCzz9ikaYL1n" + "digest": "66Tjav6hornHGzx5A4HWLPDoDwwkTUEocbML6pVRxkJo" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x44f42943b20151d6a0c3cb0f84006b3441bb3378c668a6df71fa36cb441538c8" + "ObjectOwner": "0xd6aea7b7b28562ef76634df18c8c84e7f0d456d0053c9f3264e748aeaaf61ec2" }, - "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0xe360ccacf592e9a2d80c7314d882d2adb850db51fd18572a6baf11a85b233e5d", + "objectType": "0x2::dynamic_field::Field<0x2::object::ID, address>", + "objectId": "0xe2d939c957ebcc0c9a9c0dcad88df409d63291e2260dd3f1a0e2b967558e5745", "version": "1", - "digest": "A2VPHWvMEQHPWw1m5oX6vVZcAwsmkLyCvotCx4MrNjzG" + "digest": "4U4nX8h1bM5BRNzduEDshyRxirtan6VadienujiQyy6n" }, { "type": "created", @@ -1695,20 +1693,20 @@ expression: "run_one(cmds, context).await?" "AddressOwner": "0xb4b32db0fb2bc9170f796efb2439aeaf46fd0dc0b79af4e12d14bb87c3e9aa65" }, "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0xe5395355afde6c5624ce706e91738cb766a8324c86ea933f38c3f8efbba38507", + "objectId": "0xe378d2cec927e9c247bab671285b8f7b23dc02abe786866b2503b3764c9d2ac7", "version": "1", - "digest": "DLCXf4UxpB6CMKQ7tSvdpMLZzAj5z2Qfuox7qHNefKqR" + "digest": "3rVPyctvmQRdKEmDRzvCSaNgAFrU86XPGnmcpDL4TSy7" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0x7dbda9c2efa8255eea64cf28b64294ffed6af432f53b661d24f3807895ee828d" + "AddressOwner": "0x44f42943b20151d6a0c3cb0f84006b3441bb3378c668a6df71fa36cb441538c8" }, "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0xe8bcfc0181e426b9dfcad3785fb4db1a0d0a2b1fa40c99a36b5fe988d2a2f561", + "objectId": "0xe72634ff60a76ad75299b6681e5ac68ae16cd5052f55ada644c69f6619ca8f96", "version": "1", - "digest": "2eMPqCumhC9U4G5rJmSr1ZKxftCS264Z8csh9zBbe4aQ" + "digest": "D4VEzzdqbxkjnuLkYKPPgzpiJnMiJMgehjMoTqStigiB" }, { "type": "created", @@ -1717,40 +1715,42 @@ expression: "run_one(cmds, context).await?" "AddressOwner": "0x7dbda9c2efa8255eea64cf28b64294ffed6af432f53b661d24f3807895ee828d" }, "objectType": "0x3::validator_cap::UnverifiedValidatorOperationCap", - "objectId": "0xed9ffc59b7e841e0de23ac1b72c4f04a784e2fef9c46f93eed0afdd14f8d047c", + "objectId": "0xe7445ae60304857a2efd0c4767583987a3de4f78a94e893aca46e957a7743c02", "version": "1", - "digest": "69xyHdtHM8S6Voaqv4VHX5p7kxehGDVEAosn236u3EYH" + "digest": "2yTbCF94GoG8oAZ2iL9RGP9gGMur4AKBhG2prqy3iFX5" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", - "owner": "Immutable", - "objectType": "0x2::display::Display<0x107a::nft::Nft>", - "objectId": "0xeed5eebe436d3b4dedb5d25eff6275c5212fb408ab6e2d1756fd9c56b2af892d", + "owner": { + "AddressOwner": "0x7a9730f69d7c9eed4058b7e3ad9019adffdf63a94ef73cd2fb0217f3b9eb6eb1" + }, + "objectType": "0x3::validator_cap::UnverifiedValidatorOperationCap", + "objectId": "0xf1fa0fb0d8312d048e280ed73cf0fd19db5a666470ce8ef13ccafbf37f922b6f", "version": "1", - "digest": "HyUxFE4PT5azA17c56oxTLkT81weUpxi5ZkoCxefEbyC" + "digest": "FRv2kzMRCcA85oJAi1MuDrpCUT8DnNHsrZpcsrxEgJG7" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "ObjectOwner": "0x723bc96ed7aa917e131832dd0c60b9b54bb74f5d6c7c5edb89251db0b2881d58" + "AddressOwner": "0x4b578d914e64de1ca47bead61bcfa0932646e16de6063089810cfa904eb8b06f" }, - "objectType": "0x2::dynamic_field::Field", - "objectId": "0xf69faa3aa3015380b78c11aae2ee8eed497bb5ee2555e686b53e375ab90fe8cd", + "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", + "objectId": "0xf87126f9f001bdf5a14efe58a703fd97d2e2aa6c8ee108243cfcc03f70bec36b", "version": "1", - "digest": "6e9719u3ETKKnmysHMKE5kJoPcV6qGc8gLkoecxbibcm" + "digest": "FQ1iAi2kLuFgs2NEDpYkMGeuB6JJHimhmFWdsvrevRzP" }, { "type": "created", "sender": "0x0000000000000000000000000000000000000000000000000000000000000000", "owner": { - "AddressOwner": "0xb4b32db0fb2bc9170f796efb2439aeaf46fd0dc0b79af4e12d14bb87c3e9aa65" + "AddressOwner": "0x4b578d914e64de1ca47bead61bcfa0932646e16de6063089810cfa904eb8b06f" }, "objectType": "0x2::coin::Coin<0x2::iota::IOTA>", - "objectId": "0xfe1d0d9ef3118023510cdf338ca59ae1d3e88e1ca98a3e1904d61a8620a1ad98", + "objectId": "0xfc3a360f44f32104c49dcf159ba04e021a42b04c969e2ecf3b7c3f8a5d4a4329", "version": "1", - "digest": "7iwW12UgvrywkA79tKwWSZ5AviKqcgKytqz9dWwZLDoh" + "digest": "4jsmns1bceQhaH1iN4mykXv6t4Uz7TELLsHQZDaG9NE4" } ], "timestampMs": "1641175496000", diff --git a/crates/iota-faucet/src/faucet/mod.rs b/crates/iota-faucet/src/faucet/mod.rs index 0461473841b..4421ed524a4 100644 --- a/crates/iota-faucet/src/faucet/mod.rs +++ b/crates/iota-faucet/src/faucet/mod.rs @@ -86,49 +86,49 @@ pub const DEFAULT_AMOUNT: u64 = 1_000_000_000; pub const DEFAULT_NUM_OF_COINS: usize = 1; #[derive(Parser, Clone)] -#[clap( - name = "Iota Faucet", - about = "Faucet for requesting test tokens on Iota", +#[command( + name = "IOTA Faucet", + about = "Faucet for requesting test tokens on IOTA", rename_all = "kebab-case" )] pub struct FaucetConfig { - #[clap(long, default_value_t = 5003)] + #[arg(long, default_value_t = 5003)] pub port: u16, - #[clap(long, default_value = "127.0.0.1")] + #[arg(long, default_value = "127.0.0.1")] pub host_ip: Ipv4Addr, - #[clap(long, default_value_t = DEFAULT_AMOUNT)] + #[arg(long, default_value_t = DEFAULT_AMOUNT)] pub amount: u64, - #[clap(long, default_value_t = DEFAULT_NUM_OF_COINS)] + #[arg(long, default_value_t = DEFAULT_NUM_OF_COINS)] pub num_coins: usize, - #[clap(long, default_value_t = 10)] + #[arg(long, default_value_t = 10)] pub request_buffer_size: usize, - #[clap(long, default_value_t = 10)] + #[arg(long, default_value_t = 10)] pub max_request_per_second: u64, - #[clap(long, default_value_t = 60)] + #[arg(long, default_value_t = 60)] pub wallet_client_timeout_secs: u64, - #[clap(long)] + #[arg(long)] pub write_ahead_log: PathBuf, - #[clap(long, default_value_t = 300)] + #[arg(long, default_value_t = 300)] pub wal_retry_interval: u64, - #[clap(long, default_value_t = 10000)] + #[arg(long, default_value_t = 10000)] pub max_request_queue_length: u64, - #[clap(long, default_value_t = 500)] + #[arg(long, default_value_t = 500)] pub batch_request_size: u64, - #[clap(long, default_value_t = 300)] + #[arg(long, default_value_t = 300)] pub ttl_expiration: u64, - #[clap(long, action = clap::ArgAction::Set, default_value_t = false)] + #[arg(long, action = clap::ArgAction::Set, default_value_t = false)] pub batch_enabled: bool, } diff --git a/crates/iota-faucet/src/metrics.rs b/crates/iota-faucet/src/metrics.rs index bc073027669..6ea6085c852 100644 --- a/crates/iota-faucet/src/metrics.rs +++ b/crates/iota-faucet/src/metrics.rs @@ -3,13 +3,14 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 +//! Prometheus metrics which can be displayed in Grafana, queried and alerted +//! on. + use prometheus::{ Histogram, IntCounter, IntGauge, Registry, register_histogram_with_registry, register_int_counter_with_registry, register_int_gauge_with_registry, }; -/// Prometheus metrics which can be displayed in Grafana, queried and alerted on - /// Metrics relevant to the requests coming into the service #[derive(Clone, Debug)] pub struct RequestMetrics { diff --git a/crates/iota-framework-snapshot/bytecode_snapshot/3/0x0000000000000000000000000000000000000000000000000000000000000001 b/crates/iota-framework-snapshot/bytecode_snapshot/3/0x0000000000000000000000000000000000000000000000000000000000000001 new file mode 100644 index 00000000000..6aae6016489 Binary files /dev/null and b/crates/iota-framework-snapshot/bytecode_snapshot/3/0x0000000000000000000000000000000000000000000000000000000000000001 differ diff --git a/crates/iota-framework-snapshot/bytecode_snapshot/3/0x0000000000000000000000000000000000000000000000000000000000000002 b/crates/iota-framework-snapshot/bytecode_snapshot/3/0x0000000000000000000000000000000000000000000000000000000000000002 new file mode 100644 index 00000000000..ea9d0986490 Binary files /dev/null and b/crates/iota-framework-snapshot/bytecode_snapshot/3/0x0000000000000000000000000000000000000000000000000000000000000002 differ diff --git a/crates/iota-framework-snapshot/bytecode_snapshot/3/0x0000000000000000000000000000000000000000000000000000000000000003 b/crates/iota-framework-snapshot/bytecode_snapshot/3/0x0000000000000000000000000000000000000000000000000000000000000003 new file mode 100644 index 00000000000..ddf88e95212 Binary files /dev/null and b/crates/iota-framework-snapshot/bytecode_snapshot/3/0x0000000000000000000000000000000000000000000000000000000000000003 differ diff --git a/crates/iota-framework-snapshot/bytecode_snapshot/3/0x000000000000000000000000000000000000000000000000000000000000000b b/crates/iota-framework-snapshot/bytecode_snapshot/3/0x000000000000000000000000000000000000000000000000000000000000000b new file mode 100644 index 00000000000..a28b3206877 Binary files /dev/null and b/crates/iota-framework-snapshot/bytecode_snapshot/3/0x000000000000000000000000000000000000000000000000000000000000000b differ diff --git a/crates/iota-framework-snapshot/bytecode_snapshot/3/0x000000000000000000000000000000000000000000000000000000000000107a b/crates/iota-framework-snapshot/bytecode_snapshot/3/0x000000000000000000000000000000000000000000000000000000000000107a new file mode 100644 index 00000000000..56d912f6c89 Binary files /dev/null and b/crates/iota-framework-snapshot/bytecode_snapshot/3/0x000000000000000000000000000000000000000000000000000000000000107a differ diff --git a/crates/iota-framework-snapshot/manifest.json b/crates/iota-framework-snapshot/manifest.json index 261265acff2..2f92c9d8340 100644 --- a/crates/iota-framework-snapshot/manifest.json +++ b/crates/iota-framework-snapshot/manifest.json @@ -18,5 +18,15 @@ "0x000000000000000000000000000000000000000000000000000000000000000b", "0x000000000000000000000000000000000000000000000000000000000000107a" ] + }, + "3": { + "git_revision": "378e09e7aa88", + "package_ids": [ + "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x0000000000000000000000000000000000000000000000000000000000000002", + "0x0000000000000000000000000000000000000000000000000000000000000003", + "0x000000000000000000000000000000000000000000000000000000000000000b", + "0x000000000000000000000000000000000000000000000000000000000000107a" + ] } } \ No newline at end of file diff --git a/crates/iota-framework-snapshot/tests/compatibility_tests.rs b/crates/iota-framework-snapshot/tests/compatibility_tests.rs index 9fe13cf62da..01cfcc51bad 100644 --- a/crates/iota-framework-snapshot/tests/compatibility_tests.rs +++ b/crates/iota-framework-snapshot/tests/compatibility_tests.rs @@ -35,7 +35,7 @@ mod compatibility_tests { .is_none() { panic!( - "The current Iota framework {:?} is not compatible with version {:?}", + "The current IOTA framework {:?} is not compatible with version {:?}", cur_package.id(), version ); diff --git a/crates/iota-framework/CONTRIBUTING.md b/crates/iota-framework/CONTRIBUTING.md index 511dff52b67..ab52bea50e6 100644 --- a/crates/iota-framework/CONTRIBUTING.md +++ b/crates/iota-framework/CONTRIBUTING.md @@ -6,11 +6,11 @@ If changes need to be made to the framework's Move code, additional actions need ### Snapshot tests update -Run the following commands in Iota's [root directory](../../) and accept the changes, if any (if you do not have `cargo-insta` command installed, please run the `cargo install cargo-insta` command first): +Run the following commands in IOTA's [root directory](../../) and accept the changes, if any (if you do not have `cargo-insta` command installed, please run the `cargo install cargo-insta` command first): ```bash cargo insta test -p iota-cost --review cargo insta test -p iota-config --review ``` -Please use your best judgment to decide if the changes between old and new versions of the snapshots look "reasonable" (e.g., a minor change in gas costs). When in doubt, please reach out to a member of Iota core team. +Please use your best judgment to decide if the changes between old and new versions of the snapshots look "reasonable" (e.g., a minor change in gas costs). When in doubt, please reach out to a member of IOTA core team. diff --git a/crates/iota-framework/packages/bridge/sources/bridge.move b/crates/iota-framework/packages/bridge/sources/bridge.move index 84c6e794068..dedc2870cc6 100644 --- a/crates/iota-framework/packages/bridge/sources/bridge.move +++ b/crates/iota-framework/packages/bridge/sources/bridge.move @@ -254,7 +254,7 @@ module bridge::bridge { ); } - // Record bridge message approvals in Iota, called by the bridge client + // Record bridge message approvals in IOTA, called by the bridge client // If already approved, return early instead of aborting. public fun approve_token_transfer( bridge: &mut Bridge, @@ -276,7 +276,7 @@ module bridge::bridge { ); let message_key = message.key(); - // retrieve pending message if source chain is Iota, the initial message + // retrieve pending message if source chain is IOTA, the initial message // must exist on chain if (message.source_chain() == inner.chain_id) { let record = &mut inner.token_transfer_records[message_key]; diff --git a/crates/iota-framework/packages/bridge/sources/committee.move b/crates/iota-framework/packages/bridge/sources/committee.move index 1b0e49b14b0..c1383fcfbc5 100644 --- a/crates/iota-framework/packages/bridge/sources/committee.move +++ b/crates/iota-framework/packages/bridge/sources/committee.move @@ -60,7 +60,7 @@ module bridge::committee { } public struct CommitteeMember has copy, drop, store { - /// The Iota Address of the validator + /// The IOTA Address of the validator iota_address: address, /// The public key bytes of the bridge key bridge_pubkey_bytes: vector, @@ -74,7 +74,7 @@ module bridge::committee { } public struct CommitteeMemberRegistration has copy, drop, store { - /// The Iota Address of the validator + /// The IOTA Address of the validator iota_address: address, /// The public key bytes of the bridge key bridge_pubkey_bytes: vector, diff --git a/crates/iota-framework/packages/bridge/sources/limiter.move b/crates/iota-framework/packages/bridge/sources/limiter.move index b4d11d4d5f8..3063226ca34 100644 --- a/crates/iota-framework/packages/bridge/sources/limiter.move +++ b/crates/iota-framework/packages/bridge/sources/limiter.move @@ -177,10 +177,10 @@ module bridge::limiter { // It's tedious to list every pair, but it's safer to do so so we don't // accidentally turn off limiter for a new production route in the future. // Note limiter only takes effects on the receiving chain, so we only need to - // specify routes from Ethereum to Iota. + // specify routes from Ethereum to IOTA. fun initial_transfer_limits(): VecMap { let mut transfer_limits = vec_map::empty(); - // 5M limit on Iota -> Ethereum mainnet + // 5M limit on IOTA -> Ethereum mainnet transfer_limits.insert( chain_ids::get_route(chain_ids::eth_mainnet(), chain_ids::iota_mainnet()), 5_000_000 * USD_VALUE_MULTIPLIER diff --git a/crates/iota-framework/packages/bridge/sources/message.move b/crates/iota-framework/packages/bridge/sources/message.move index f3b2ade6055..c4a04a8b947 100644 --- a/crates/iota-framework/packages/bridge/sources/message.move +++ b/crates/iota-framework/packages/bridge/sources/message.move @@ -385,7 +385,7 @@ module bridge::message { } } - /// Update Iota token message + /// Update IOTA token message /// [message_type:u8] /// [version:u8] /// [nonce:u64] diff --git a/crates/iota-framework/packages/iota-framework/sources/address.move b/crates/iota-framework/packages/iota-framework/sources/address.move index 7dc2aed0873..b9354e96df3 100644 --- a/crates/iota-framework/packages/iota-framework/sources/address.move +++ b/crates/iota-framework/packages/iota-framework/sources/address.move @@ -75,7 +75,7 @@ module iota::address { else abort EAddressParseError } - /// Length of a Iota address in bytes + /// Length of an IOTA address in bytes public fun length(): u64 { LENGTH } diff --git a/crates/iota-framework/packages/iota-framework/sources/bag.move b/crates/iota-framework/packages/iota-framework/sources/bag.move index e672c30b4ab..4adadc8f110 100644 --- a/crates/iota-framework/packages/iota-framework/sources/bag.move +++ b/crates/iota-framework/packages/iota-framework/sources/bag.move @@ -3,7 +3,7 @@ // SPDX-License-Identifier: Apache-2.0 /// A bag is a heterogeneous map-like collection. The collection is similar to `iota::table` in that -/// its keys and values are not stored within the `Bag` value, but instead are stored using Iota's +/// its keys and values are not stored within the `Bag` value, but instead are stored using IOTA's /// object system. The `Bag` struct acts only as a handle into the object system to retrieve those /// keys and values. /// Note that this means that `Bag` values with exactly the same key-value mapping will not be diff --git a/crates/iota-framework/packages/iota-framework/sources/coin_manager.move b/crates/iota-framework/packages/iota-framework/sources/coin_manager.move index 6b8ce449c39..348b1378794 100644 --- a/crates/iota-framework/packages/iota-framework/sources/coin_manager.move +++ b/crates/iota-framework/packages/iota-framework/sources/coin_manager.move @@ -26,14 +26,14 @@ module iota::coin_manager { /// The error returned if a attempt is made to change the maximum supply that is lower than the total supply const EMaximumSupplyLowerThanTotalSupply: u64 = 2; - /// The error returned if additional metadata already exists and you try to overwrite - const EAdditionalMetadataAlreadyExists: u64 = 3; + /// The error returned if a attempt is made to change the maximum supply that is higher than the maximum possible supply + const EMaximumSupplyHigherThanPossible: u64 = 3; /// The error returned if you try to edit nonexisting additional metadata const EAdditionalMetadataDoesNotExist: u64 = 4; - /// The error returned if you try to edit immutable metadata - const ENoMutableMetadata: u64 = 5; + /// The maximum supply supported by `CoinManager` + const MAX_SUPPLY: u64 = 18_446_744_073_709_551_614u64; /// Holds all related objects to a Coin in a convenient shared function public struct CoinManager has key, store { @@ -196,7 +196,6 @@ module iota::coin_manager { manager: &mut CoinManager, value: Value ) { - assert!(!df::exists_(&manager.id, b"additional_metadata"), EAdditionalMetadataAlreadyExists); df::add(&mut manager.id, b"additional_metadata", value); } @@ -230,6 +229,7 @@ module iota::coin_manager { maximum_supply: u64 ) { assert!(option::is_none(&manager.maximum_supply), EMaximumSupplyAlreadySet); + assert!(maximum_supply <= MAX_SUPPLY, EMaximumSupplyHigherThanPossible); assert!(total_supply(manager) <= maximum_supply, EMaximumSupplyLowerThanTotalSupply); option::fill(&mut manager.maximum_supply, maximum_supply); } @@ -311,7 +311,7 @@ module iota::coin_manager { /// Get the maximum supply possible as a number. /// If no maximum set it's the maximum u64 possible public fun maximum_supply(manager: &CoinManager): u64 { - option::get_with_default(&manager.maximum_supply, 18_446_744_073_709_551_615u64) + option::get_with_default(&manager.maximum_supply, MAX_SUPPLY) } /// Convenience function returning the remaining supply that can be minted still @@ -383,7 +383,6 @@ module iota::coin_manager { manager: &mut CoinManager, name: string::String ) { - assert!(manager.metadata_is_immutable(), ENoMutableMetadata); coin::update_name(&manager.treasury_cap, option::borrow_mut(&mut manager.metadata), name) } @@ -393,7 +392,6 @@ module iota::coin_manager { manager: &mut CoinManager, symbol: ascii::String ) { - assert!(manager.metadata_is_immutable(), ENoMutableMetadata); coin::update_symbol(&manager.treasury_cap, option::borrow_mut(&mut manager.metadata), symbol) } @@ -403,7 +401,6 @@ module iota::coin_manager { manager: &mut CoinManager, description: string::String ) { - assert!(manager.metadata_is_immutable(), ENoMutableMetadata); coin::update_description(&manager.treasury_cap, option::borrow_mut(&mut manager.metadata), description) } @@ -413,7 +410,6 @@ module iota::coin_manager { manager: &mut CoinManager, url: ascii::String ) { - assert!(manager.metadata_is_immutable(), ENoMutableMetadata); coin::update_icon_url(&manager.treasury_cap, option::borrow_mut(&mut manager.metadata), url) } diff --git a/crates/iota-framework/packages/iota-framework/sources/display.move b/crates/iota-framework/packages/iota-framework/sources/display.move index bf6cc92765a..c557f469f7b 100644 --- a/crates/iota-framework/packages/iota-framework/sources/display.move +++ b/crates/iota-framework/packages/iota-framework/sources/display.move @@ -58,7 +58,7 @@ module iota::display { /// Type signature of the event corresponds to the type while id serves for /// the discovery. /// - /// Since Iota RPC supports querying events by type, finding a Display for the T + /// Since IOTA RPC supports querying events by type, finding a Display for the T /// would be as simple as looking for the first event with `Display`. public struct DisplayCreated has copy, drop { id: ID diff --git a/crates/iota-framework/packages/iota-framework/sources/dynamic_field.move b/crates/iota-framework/packages/iota-framework/sources/dynamic_field.move index 4daaba11071..5a71552837e 100644 --- a/crates/iota-framework/packages/iota-framework/sources/dynamic_field.move +++ b/crates/iota-framework/packages/iota-framework/sources/dynamic_field.move @@ -3,11 +3,11 @@ // SPDX-License-Identifier: Apache-2.0 #[allow(unused_const)] -/// In addition to the fields declared in its type definition, a Iota object can have dynamic fields +/// In addition to the fields declared in its type definition, an IOTA object can have dynamic fields /// that can be added after the object has been constructed. Unlike ordinary field names /// (which are always statically declared identifiers) a dynamic field name can be any value with /// the `copy`, `drop`, and `store` abilities, e.g. an integer, a boolean, or a string. -/// This gives Iota programmers the flexibility to extend objects on-the-fly, and it also serves as a +/// This gives IOTA programmers the flexibility to extend objects on-the-fly, and it also serves as a /// building block for core collection types module iota::dynamic_field { diff --git a/crates/iota-framework/packages/iota-framework/sources/object.move b/crates/iota-framework/packages/iota-framework/sources/object.move index aff3fbbf9f0..ba66ccb9f3c 100644 --- a/crates/iota-framework/packages/iota-framework/sources/object.move +++ b/crates/iota-framework/packages/iota-framework/sources/object.move @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -/// Iota object identifiers +/// IOTA object identifiers module iota::object { use std::bcs; use iota::address; @@ -25,7 +25,7 @@ module iota::object { /// Allows calling `.to_bytes` on a `UID` to get a `vector`. public use fun uid_to_bytes as UID.to_bytes; - /// The hardcoded ID for the singleton Iota System State Object. + /// The hardcoded ID for the singleton IOTA System State Object. const IOTA_SYSTEM_STATE_OBJECT_ID: address = @0x5; /// The hardcoded ID for the singleton Clock Object. @@ -46,7 +46,7 @@ module iota::object { /// Sender is not @0x0 the system address. const ENotSystemAddress: u64 = 0; - /// An object ID. This is used to reference Iota Objects. + /// An object ID. This is used to reference IOTA Objects. /// This is *not* guaranteed to be globally unique--anyone can create an `ID` from a `UID` or /// from an object, and ID's can be freely copied and dropped. /// Here, the values are not globally unique because there can be multiple values of type `ID` @@ -60,7 +60,7 @@ module iota::object { bytes: address } - /// Globally unique IDs that define an object's ID in storage. Any Iota Object, that is a struct + /// Globally unique IDs that define an object's ID in storage. Any IOTA Object, that is a struct /// with the `key` ability, must have `id: UID` as its first field. /// These are globally unique in the sense that no two values of type `UID` are ever equal, in /// other words for any two values `id1: UID` and `id2: UID`, `id1` != `id2`. @@ -167,7 +167,7 @@ module iota::object { // === any object === - /// Create a new object. Returns the `UID` that must be stored in a Iota object. + /// Create a new object. Returns the `UID` that must be stored in an IOTA object. /// This is the only way to create `UID`s. public fun new(ctx: &mut TxContext): UID { UID { @@ -176,10 +176,10 @@ module iota::object { } /// Delete the object and it's `UID`. This is the only way to eliminate a `UID`. - // This exists to inform Iota of object deletions. When an object + // This exists to inform IOTA of object deletions. When an object // gets unpacked, the programmer will have to do something with its // `UID`. The implementation of this function emits a deleted - // system event so Iota knows to process the object deletion + // system event so IOTA knows to process the object deletion public fun delete(id: UID) { let UID { id: ID { bytes } } = id; delete_impl(bytes) @@ -206,7 +206,7 @@ module iota::object { } /// Get the `UID` for `obj`. - /// Safe because Iota has an extra bytecode verifier pass that forces every struct with + /// Safe because IOTA has an extra bytecode verifier pass that forces every struct with /// the `key` ability to have a distinguished `UID` field. /// Cannot be made public as the access to `UID` for a given object must be privileged, and /// restrictable in the object's module. diff --git a/crates/iota-framework/packages/iota-framework/sources/table.move b/crates/iota-framework/packages/iota-framework/sources/table.move index 944da32a0e4..15a26dbce92 100644 --- a/crates/iota-framework/packages/iota-framework/sources/table.move +++ b/crates/iota-framework/packages/iota-framework/sources/table.move @@ -3,7 +3,7 @@ // SPDX-License-Identifier: Apache-2.0 /// A table is a map-like collection. But unlike a traditional collection, it's keys and values are -/// not stored within the `Table` value, but instead are stored using Iota's object system. The +/// not stored within the `Table` value, but instead are stored using IOTA's object system. The /// `Table` struct acts only as a handle into the object system to retrieve those keys and values. /// Note that this means that `Table` values with exactly the same key-value mapping will not be /// equal, with `==`, at runtime. For example diff --git a/crates/iota-framework/packages/iota-framework/sources/test/test_scenario.move b/crates/iota-framework/packages/iota-framework/sources/test/test_scenario.move index da316004a5d..ea484de915e 100644 --- a/crates/iota-framework/packages/iota-framework/sources/test/test_scenario.move +++ b/crates/iota-framework/packages/iota-framework/sources/test/test_scenario.move @@ -41,7 +41,7 @@ module iota::test_scenario { /// Unable to deallocate the receiving ticket const EUnableToDeallocateReceivingTicket: u64 = 7; - /// Utility for mocking a multi-transaction Iota execution in a single Move procedure. + /// Utility for mocking a multi-transaction IOTA execution in a single Move procedure. /// A `Scenario` maintains a view of the global object pool built up by the execution. /// These objects can be accessed via functions like `take_from_sender`, which gives the /// transaction sender access to objects in (only) their inventory. diff --git a/crates/iota-framework/packages/iota-framework/sources/timelock.move b/crates/iota-framework/packages/iota-framework/sources/timelock.move index 2651e782f0a..be530780f3e 100644 --- a/crates/iota-framework/packages/iota-framework/sources/timelock.move +++ b/crates/iota-framework/packages/iota-framework/sources/timelock.move @@ -7,11 +7,10 @@ module iota::timelock { use std::string::{Self, String}; use iota::balance::Balance; + use iota::clock::Clock; use iota::labeler::LabelerCap; use iota::system_admin_cap::IotaSystemAdminCap; - - /// Expiration timestamp of the lock is in the past. - const EExpireEpochIsPast: u64 = 0; + /// The lock has not expired yet. const ENotExpiredYet: u64 = 1; /// For when trying to join two time-locked balances with different expiration time. @@ -34,9 +33,6 @@ module iota::timelock { /// Function to lock an object till a unix timestamp in milliseconds. public fun lock(locked: T, expiration_timestamp_ms: u64, ctx: &mut TxContext): TimeLock { - // Check that `expiration_timestamp_ms` is valid. - check_expiration_timestamp_ms(expiration_timestamp_ms, ctx); - // Create a timelock. pack(locked, expiration_timestamp_ms, option::none(), ctx) } @@ -48,9 +44,6 @@ module iota::timelock { expiration_timestamp_ms: u64, ctx: &mut TxContext ): TimeLock { - // Check that `expiration_timestamp_ms` is valid. - check_expiration_timestamp_ms(expiration_timestamp_ms, ctx); - // Calculate a label value. let label = type_name(); @@ -81,7 +74,7 @@ module iota::timelock { transfer(lock_with_label(labeler, obj, expiration_timestamp_ms, ctx), to); } - /// Function to unlock the object from a `TimeLock`. + /// Function to unlock the object from a `TimeLock` based on the epoch start time. public fun unlock(self: TimeLock, ctx: &TxContext): T { // Unpack the timelock. let (locked, expiration_timestamp_ms, _) = unpack(self); @@ -92,6 +85,17 @@ module iota::timelock { locked } + /// Function to unlock the object from a `TimeLock` based on the `Clock` object. + public fun unlock_with_clock(self: TimeLock, clock: &Clock): T { + // Unpack the timelock. + let (locked, expiration_timestamp_ms, _) = unpack(self); + + // Check if the lock has expired. + assert!(expiration_timestamp_ms <= clock.timestamp_ms(), ENotExpiredYet); + + locked + } + // === TimeLock balance functions === /// Join two `TimeLock>` together. @@ -174,24 +178,32 @@ module iota::timelock { self.expiration_timestamp_ms } - /// Function to check if a `TimeLock` is locked. + /// Function to check if a `TimeLock` is locked based on the epoch start time. public fun is_locked(self: &TimeLock, ctx: &TxContext): bool { self.remaining_time(ctx) > 0 } - /// Function to get the remaining time of a `TimeLock`. + /// Function to get the remaining time of a `TimeLock` based on the epoch start time. /// Returns 0 if the lock has expired. public fun remaining_time(self: &TimeLock, ctx: &TxContext): u64 { // Get the epoch timestamp. let current_timestamp_ms = ctx.epoch_timestamp_ms(); - // Check if the lock has expired. - if (self.expiration_timestamp_ms < current_timestamp_ms) { - return 0 - }; + self.remaining_time_with_timestamp(current_timestamp_ms) + } - // Calculate the remaining time. - self.expiration_timestamp_ms - current_timestamp_ms + /// Function to check if a `TimeLock` is locked based on the `Clock` object. + public fun is_locked_with_clock(self: &TimeLock, clock: &Clock): bool { + self.remaining_time_with_clock(clock) > 0 + } + + /// Function to get the remaining time of a `TimeLock` based on the `Clock` object. + /// Returns 0 if the lock has expired. + public fun remaining_time_with_clock(self: &TimeLock, clock: &Clock): u64 { + // Get the clock's timestamp. + let current_timestamp_ms = clock.timestamp_ms(); + + self.remaining_time_with_timestamp(current_timestamp_ms) } /// Function to get the locked object of a `TimeLock`. @@ -253,12 +265,14 @@ module iota::timelock { transfer::transfer(lock, receiver); } - /// An utility function to check that the `expiration_timestamp_ms` value is valid. - fun check_expiration_timestamp_ms(expiration_timestamp_ms: u64, ctx: &TxContext) { - // Get the epoch timestamp. - let epoch_timestamp_ms = ctx.epoch_timestamp_ms(); + /// An utility function to get the remaining time of a `TimeLock`. + fun remaining_time_with_timestamp(self: &TimeLock, current_timestamp_ms: u64): u64 { + // Check if the lock has expired. + if (self.expiration_timestamp_ms < current_timestamp_ms) { + return 0 + }; - // Check that `expiration_timestamp_ms` is valid. - assert!(expiration_timestamp_ms > epoch_timestamp_ms, EExpireEpochIsPast); + // Calculate the remaining time. + self.expiration_timestamp_ms - current_timestamp_ms } } diff --git a/crates/iota-framework/packages/iota-framework/sources/transfer.move b/crates/iota-framework/packages/iota-framework/sources/transfer.move index 0a941f651a2..884e38ca845 100644 --- a/crates/iota-framework/packages/iota-framework/sources/transfer.move +++ b/crates/iota-framework/packages/iota-framework/sources/transfer.move @@ -43,7 +43,7 @@ module iota::transfer { /// which (in turn) ensures that `obj` has a globally unique ID. Note that if the recipient /// address represents an object ID, the `obj` sent will be inaccessible after the transfer /// (though they will be retrievable at a future date once new features are added). - /// This function has custom rules performed by the Iota Move bytecode verifier that ensures + /// This function has custom rules performed by the IOTA Move bytecode verifier that ensures /// that `T` is an object defined in the module where `transfer` is invoked. Use /// `public_transfer` to transfer an object with `store` outside of its module. public fun transfer(obj: T, recipient: address) { @@ -61,7 +61,7 @@ module iota::transfer { /// Freeze `obj`. After freezing `obj` becomes immutable and can no longer be transferred or /// mutated. - /// This function has custom rules performed by the Iota Move bytecode verifier that ensures + /// This function has custom rules performed by the IOTA Move bytecode verifier that ensures /// that `T` is an object defined in the module where `freeze_object` is invoked. Use /// `public_freeze_object` to freeze an object with `store` outside of its module. public fun freeze_object(obj: T) { @@ -79,7 +79,7 @@ module iota::transfer { /// This is irreversible, i.e. once an object is shared, it will stay shared forever. /// Aborts with `ESharedNonNewObject` of the object being shared was not created in this /// transaction. This restriction may be relaxed in the future. - /// This function has custom rules performed by the Iota Move bytecode verifier that ensures + /// This function has custom rules performed by the IOTA Move bytecode verifier that ensures /// that `T` is an object defined in the module where `share_object` is invoked. Use /// `public_share_object` to share an object with `store` outside of its module. public fun share_object(obj: T) { @@ -98,7 +98,7 @@ module iota::transfer { /// Given mutable (i.e., locked) access to the `parent` and a `Receiving` argument /// referencing an object of type `T` owned by `parent` use the `to_receive` /// argument to receive and return the referenced owned object of type `T`. - /// This function has custom rules performed by the Iota Move bytecode verifier that ensures + /// This function has custom rules performed by the IOTA Move bytecode verifier that ensures /// that `T` is an object defined in the module where `receive` is invoked. Use /// `public_receive` to receivne an object with `store` outside of its module. public fun receive(parent: &mut UID, to_receive: Receiving): T { diff --git a/crates/iota-framework/packages/iota-framework/sources/types.move b/crates/iota-framework/packages/iota-framework/sources/types.move index 4edc5dd3909..dd37f1865e9 100644 --- a/crates/iota-framework/packages/iota-framework/sources/types.move +++ b/crates/iota-framework/packages/iota-framework/sources/types.move @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -/// Iota types helpers and utilities +/// IOTA types helpers and utilities module iota::types { // === one-time witness === diff --git a/crates/iota-framework/packages/iota-framework/tests/coin_manager_tests.move b/crates/iota-framework/packages/iota-framework/tests/coin_manager_tests.move index 320c347a57c..77d01bdc9e7 100644 --- a/crates/iota-framework/packages/iota-framework/tests/coin_manager_tests.move +++ b/crates/iota-framework/packages/iota-framework/tests/coin_manager_tests.move @@ -4,11 +4,14 @@ #[test_only] module iota::coin_manager_tests { + use std::ascii; + use std::string; + use iota::coin_manager; use iota::coin::{Self, CoinMetadata}; use iota::test_scenario; + use iota::test_utils::assert_eq; use iota::url::{Self, Url}; - use std::ascii::{string}; public struct COIN_MANAGER_TESTS has drop {} @@ -221,6 +224,40 @@ module iota::coin_manager_tests { scenario.end(); } + #[test] + #[expected_failure(abort_code = coin_manager::EMaximumSupplyHigherThanPossible)] + fun test_max_supply_higher_than_maximum() { + let sender = @0xA; + let mut scenario = test_scenario::begin(sender); + let witness = COIN_MANAGER_TESTS{}; + + // Create a `Coin`. + let (cap, meta) = coin::create_currency( + witness, + 0, + b"TEST", + b"TEST", + b"TEST", + option::none(), + scenario.ctx(), + ); + + let (cmcap, metacap, mut wrapper) = coin_manager::new(cap, meta, scenario.ctx()); + + // Check the default maximum supply. + assert_eq(wrapper.maximum_supply(), 18_446_744_073_709_551_614u64); + + // Update the maximum supply to be higher than is maximum possible. + cmcap.enforce_maximum_supply(&mut wrapper, 18_446_744_073_709_551_615u64); + + transfer::public_transfer(cmcap, scenario.ctx().sender()); + metacap.renounce_metadata_ownership(&mut wrapper); + + transfer::public_share_object(wrapper); + + scenario.end(); + } + #[test] #[expected_failure(abort_code = coin_manager::EMaximumSupplyAlreadySet)] fun test_max_supply_once() { @@ -331,7 +368,7 @@ module iota::coin_manager_tests { let (cmcap, metacap, mut wrapper) = coin_manager::new(cap, meta, scenario.ctx()); let bonus = BonusMetadata { - website: url::new_unsafe(string(b"https://example.com")), + website: url::new_unsafe(ascii::string(b"https://example.com")), is_amazing: false }; @@ -340,7 +377,7 @@ module iota::coin_manager_tests { assert!(!wrapper.additional_metadata().is_amazing); let bonus2 = BonusMetadata { - website: url::new_unsafe(string(b"https://iota.org")), + website: url::new_unsafe(ascii::string(b"https://iota.org")), is_amazing: true }; @@ -356,6 +393,49 @@ module iota::coin_manager_tests { scenario.end(); } + + #[test] + #[expected_failure(abort_code = iota::dynamic_field::EFieldAlreadyExists)] + fun test_double_adding_additional_metadata() { + let sender = @0xA; + let mut scenario = test_scenario::begin(sender); + let witness = COIN_MANAGER_TESTS{}; + + // Create a `Coin`. + let (cap, meta) = coin::create_currency( + witness, + 0, + b"TEST", + b"TEST", + b"TEST", + option::none(), + scenario.ctx(), + ); + + let (cmcap, metacap, mut wrapper) = coin_manager::new(cap, meta, scenario.ctx()); + + // Add an additional metadata. + let bonus1 = BonusMetadata { + website: url::new_unsafe(ascii::string(b"https://example1.com")), + is_amazing: false + }; + + metacap.add_additional_metadata(&mut wrapper, bonus1); + + // Add an additional metadata one more time. + let bonus2 = BonusMetadata { + website: url::new_unsafe(ascii::string(b"https://example2.com")), + is_amazing: false + }; + + metacap.add_additional_metadata(&mut wrapper, bonus2); + + cmcap.renounce_treasury_ownership(&mut wrapper); + metacap.renounce_metadata_ownership(&mut wrapper); + transfer::public_share_object(wrapper); + + scenario.end(); + } #[test] fun test_coin_manager_immutable() { @@ -396,4 +476,48 @@ module iota::coin_manager_tests { scenario.end(); } + + #[test] + fun test_coin_manager_update_metadata() { + let sender = @0xA; + let mut scenario = test_scenario::begin(sender); + let witness = COIN_MANAGER_TESTS{}; + + // Create a `Coin`. + let (cap, meta) = coin::create_currency( + witness, + 0, + b"SYMBOL1", + b"NAME1", + b"DESCRIPTION1", + option::some(url::new_unsafe(ascii::string(b"https://url1.com"))), + scenario.ctx(), + ); + + let (cmcap, metacap, mut wrapper) = coin_manager::new(cap, meta, scenario.ctx()); + + // Check the original metadata. + assert_eq(wrapper.name(), string::utf8(b"NAME1")); + assert_eq(wrapper.symbol(), ascii::string(b"SYMBOL1")); + assert_eq(wrapper.description(), string::utf8(b"DESCRIPTION1")); + assert_eq(wrapper.icon_url(), option::some(url::new_unsafe(ascii::string(b"https://url1.com")))); + + // Update the metadata. + coin_manager::update_name(&metacap, &mut wrapper, string::utf8(b"NAME2")); + coin_manager::update_symbol(&metacap, &mut wrapper, ascii::string(b"SYMBOL2")); + coin_manager::update_description(&metacap, &mut wrapper, string::utf8(b"DESCRIPTION2")); + coin_manager::update_icon_url(&metacap, &mut wrapper, ascii::string(b"https://url2.com")); + + // Check the metadata again. + assert_eq(wrapper.name(), string::utf8(b"NAME2")); + assert_eq(wrapper.symbol(), ascii::string(b"SYMBOL2")); + assert_eq(wrapper.description(), string::utf8(b"DESCRIPTION2")); + assert_eq(wrapper.icon_url(), option::some(url::new_unsafe(ascii::string(b"https://url2.com")))); + + transfer::public_transfer(cmcap, scenario.ctx().sender()); + metacap.renounce_metadata_ownership(&mut wrapper); + transfer::public_share_object(wrapper); + + scenario.end(); + } } diff --git a/crates/iota-framework/packages/iota-framework/tests/kiosk/kiosk_test_utils.move b/crates/iota-framework/packages/iota-framework/tests/kiosk/kiosk_test_utils.move index 9db936952b8..2ceeb57f23b 100644 --- a/crates/iota-framework/packages/iota-framework/tests/kiosk/kiosk_test_utils.move +++ b/crates/iota-framework/packages/iota-framework/tests/kiosk/kiosk_test_utils.move @@ -33,7 +33,7 @@ module iota::kiosk_test_utils { (policy, cap) } - /// Prepare: Get Iota + /// Prepare: Get IOTA public fun get_iota(amount: u64, ctx: &mut TxContext): Coin { coin::mint_for_testing(amount, ctx) } diff --git a/crates/iota-framework/packages/iota-framework/tests/timelock/timelock_tests.move b/crates/iota-framework/packages/iota-framework/tests/timelock/timelock_tests.move index 7de604ca427..f417ed90772 100644 --- a/crates/iota-framework/packages/iota-framework/tests/timelock/timelock_tests.move +++ b/crates/iota-framework/packages/iota-framework/tests/timelock/timelock_tests.move @@ -7,9 +7,10 @@ module iota::timelock_tests { use std::string; use iota::balance::{Self, Balance}; + use iota::clock; use iota::iota::IOTA; use iota::test_scenario; - use iota::test_utils::{Self, assert_eq}; + use iota::test_utils::assert_eq; use iota::labeler::LabelerCap; use iota::timelock::{Self, TimeLock}; @@ -128,6 +129,124 @@ module iota::timelock_tests { scenario.end(); } + #[test] + fun test_lock_unlock_flow_with_clock() { + // Set up a test environment. + let sender = @0xA; + let mut scenario = test_scenario::begin(sender); + + // Minting some IOTA. + let iota = balance::create_for_testing(10); + + // Lock the IOTA balance. + let timelock = timelock::lock(iota, 100, scenario.ctx()); + + // Check the locked IOTA. + assert_eq(timelock.locked().value(), 10); + + // Create a clock object. + let mut clock = clock::create_for_testing(scenario.ctx()); + + // Check if the timelock is locked. + assert_eq(timelock.is_locked_with_clock(&clock), true); + assert_eq(timelock.remaining_time_with_clock(&clock), 100); + + // Increment the clock timestamp. + clock.increment_for_testing(10); + + // Check if the timelock is still locked. + assert_eq(timelock.is_locked_with_clock(&clock), true); + assert_eq(timelock.remaining_time_with_clock(&clock), 90); + + // Increment the clock timestamp again. + clock.increment_for_testing(90); + + // Check if the timelock is unlocked. + assert_eq(timelock.is_locked_with_clock(&clock), false); + assert_eq(timelock.remaining_time_with_clock(&clock), 0); + + // Unlock the IOTA balance. + let balance = timelock::unlock_with_clock(timelock, &clock); + + // Check the unlocked IOTA balance. + assert_eq(balance.value(), 10); + + // Cleanup. + balance::destroy_for_testing(balance); + clock ::destroy_for_testing(clock); + + scenario.end(); + } + + #[test] + fun test_lock_unlock_mixed_flow() { + // Set up a test environment. + let sender = @0xA; + let mut scenario = test_scenario::begin(sender); + + // Minting some IOTA. + let iota = balance::create_for_testing(10); + + // Lock the IOTA balance. + let timelock = timelock::lock(iota, 100, scenario.ctx()); + + // Check the locked IOTA. + assert_eq(timelock.locked().value(), 10); + + // Create a clock object. + let mut clock = clock::create_for_testing(scenario.ctx()); + + // Check if the timelock is locked. + assert_eq(timelock.is_locked(scenario.ctx()), true); + assert_eq(timelock.remaining_time(scenario.ctx()), 100); + + assert_eq(timelock.is_locked_with_clock(&clock), true); + assert_eq(timelock.remaining_time_with_clock(&clock), 100); + + // Increment the timestamps. + clock.increment_for_testing(10); + scenario.ctx().increment_epoch_timestamp(10); + + // Check if the timelock is still locked. + assert_eq(timelock.is_locked(scenario.ctx()), true); + assert_eq(timelock.remaining_time(scenario.ctx()), 90); + + assert_eq(timelock.is_locked_with_clock(&clock), true); + assert_eq(timelock.remaining_time_with_clock(&clock), 90); + + // Increment the clock timestamp. + clock.increment_for_testing(90); + + // Check if the timelock is locked according to the epoch time but unlocked by the clock. + assert_eq(timelock.is_locked(scenario.ctx()), true); + assert_eq(timelock.remaining_time(scenario.ctx()), 90); + + assert_eq(timelock.is_locked_with_clock(&clock), false); + assert_eq(timelock.remaining_time_with_clock(&clock), 0); + + // Increment the epoch timestamp. + scenario.ctx().increment_epoch_timestamp(90); + + // Check if the timelock is unlocked. + assert_eq(timelock.is_locked(scenario.ctx()), false); + assert_eq(timelock.remaining_time(scenario.ctx()), 0); + + assert_eq(timelock.is_locked_with_clock(&clock), false); + assert_eq(timelock.remaining_time_with_clock(&clock), 0); + + // Unlock the IOTA balance. + let balance = timelock::unlock(timelock, scenario.ctx()); + + // Check the unlocked IOTA balance. + assert_eq(balance.value(), 10); + + // Cleanup. + balance::destroy_for_testing(balance); + clock ::destroy_for_testing(clock); + + scenario.end(); + } + #[test] fun test_lock_to_unlock_flow() { // Set up a test environment. @@ -263,8 +382,7 @@ module iota::timelock_tests { } #[test] - #[expected_failure(abort_code = timelock::EExpireEpochIsPast)] - fun test_expiration_time_is_passed() { + fun test_unlock_expiration_time_is_passed() { // Set up a test environment. let sender = @0xA; let mut scenario = test_scenario::begin(sender); @@ -275,11 +393,48 @@ module iota::timelock_tests { // Minting some IOTA. let iota = balance::create_for_testing(10); - // Lock the IOTA balance with a wrong expiration time. + // Lock the IOTA balance with an expiration time which is passed. let timelock = timelock::lock(iota, 10, scenario.ctx()); + // Check if the timelock is unlocked. + assert_eq(timelock.is_locked(scenario.ctx()), false); + assert_eq(timelock.remaining_time(scenario.ctx()), 0); + + // Unlock the IOTA balance. + let balance = timelock::unlock(timelock, scenario.ctx()); + // Cleanup. - test_utils::destroy(timelock); + balance::destroy_for_testing(balance); + + scenario.end(); + } + + #[test] + fun test_unlock_with_clock_expiration_time_is_passed() { + // Set up a test environment. + let sender = @0xA; + let mut scenario = test_scenario::begin(sender); + + // Create a clock object. + let mut clock = clock::create_for_testing(scenario.ctx()); + clock.increment_for_testing(100); + + // Minting some IOTA. + let iota = balance::create_for_testing(10); + + // Lock the IOTA balance with an expiration time which is passed. + let timelock = timelock::lock(iota, 10, scenario.ctx()); + + // Check if the timelock is unlocked. + assert_eq(timelock.is_locked_with_clock(&clock), false); + assert_eq(timelock.remaining_time_with_clock(&clock), 0); + + // Unlock the IOTA balance. + let balance = timelock::unlock_with_clock(timelock, &clock); + + // Cleanup. + balance::destroy_for_testing(balance); + clock::destroy_for_testing(clock); scenario.end(); } @@ -308,4 +463,31 @@ module iota::timelock_tests { scenario.end(); } + + #[test] + #[expected_failure(abort_code = timelock::ENotExpiredYet)] + fun test_unlock_not_expired_object_with_clock() { + // Set up a test environment. + let sender = @0xA; + let mut scenario = test_scenario::begin(sender); + + // Minting some IOTA. + let iota = balance::create_for_testing(10); + + // Lock the IOTA balance. + let timelock = timelock::lock(iota, 100, scenario.ctx()); + + // Create a clock object. + let mut clock = clock::create_for_testing(scenario.ctx()); + clock.increment_for_testing(10); + + // Unlock the IOTA balance which is not expired. + let balance = timelock::unlock_with_clock(timelock, &clock); + + // Cleanup. + balance::destroy_for_testing(balance); + clock::destroy_for_testing(clock); + + scenario.end(); + } } diff --git a/crates/iota-framework/packages/iota-framework/tests/verifier_tests.move b/crates/iota-framework/packages/iota-framework/tests/verifier_tests.move index 9200fad14b1..10eb0fc2b91 100644 --- a/crates/iota-framework/packages/iota-framework/tests/verifier_tests.move +++ b/crates/iota-framework/packages/iota-framework/tests/verifier_tests.move @@ -3,7 +3,7 @@ // SPDX-License-Identifier: Apache-2.0 #[test_only] -/// Tests if normally illegal (in terms of Iota bytecode verification) code is allowed in tests. +/// Tests if normally illegal (in terms of IOTA bytecode verification) code is allowed in tests. module iota::verifier_tests { public struct VERIFIER_TESTS has drop {} diff --git a/crates/iota-framework/packages/iota-system/sources/iota_system.move b/crates/iota-framework/packages/iota-system/sources/iota_system.move index 573ffddb165..81876d03abd 100644 --- a/crates/iota-framework/packages/iota-system/sources/iota_system.move +++ b/crates/iota-framework/packages/iota-system/sources/iota_system.move @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -/// Iota System State Type Upgrade Guide +/// IOTA System State Type Upgrade Guide /// `IotaSystemState` is a thin wrapper around `IotaSystemStateV1` that provides a versioned interface. /// The `IotaSystemState` object has a fixed ID 0x5, and the `IotaSystemStateV1` object is stored as a dynamic field. /// There are a few different ways to upgrade the `IotaSystemStateV1` type: diff --git a/crates/iota-framework/packages/iota-system/sources/iota_system_state_inner.move b/crates/iota-framework/packages/iota-system/sources/iota_system_state_inner.move index 2097871e915..b4840789b09 100644 --- a/crates/iota-framework/packages/iota-system/sources/iota_system_state_inner.move +++ b/crates/iota-framework/packages/iota-system/sources/iota_system_state_inner.move @@ -58,7 +58,7 @@ module iota_system::iota_system_state_inner { extra_fields: Bag, } - /// The top-level object containing all information of the Iota system. + /// The top-level object containing all information of the IOTA system. public struct IotaSystemStateV1 has store { /// The current epoch ID, starting from 0. epoch: u64, diff --git a/crates/iota-framework/packages/iota-system/sources/validator.move b/crates/iota-framework/packages/iota-system/sources/validator.move index 3e19f8fddf8..cbba81c6c0a 100644 --- a/crates/iota-framework/packages/iota-system/sources/validator.move +++ b/crates/iota-framework/packages/iota-system/sources/validator.move @@ -72,7 +72,7 @@ module iota_system::validator { const MAX_VALIDATOR_GAS_PRICE: u64 = 100_000; public struct ValidatorMetadataV1 has store { - /// The Iota Address of the validator. This is the sender that created the ValidatorV1 object, + /// The IOTA Address of the validator. This is the sender that created the ValidatorV1 object, /// and also the address to send validator/coins to during withdraws. iota_address: address, /// The public key bytes corresponding to the private key that the validator diff --git a/crates/iota-framework/packages/move-stdlib/sources/address.move b/crates/iota-framework/packages/move-stdlib/sources/address.move index 924a1d939dd..79e0c960c42 100644 --- a/crates/iota-framework/packages/move-stdlib/sources/address.move +++ b/crates/iota-framework/packages/move-stdlib/sources/address.move @@ -6,7 +6,7 @@ /// platform-specific parameter. module std::address { /// Should be converted to a native function. - /// Current implementation only works for Iota. + /// Current implementation only works for IOTA. public fun length(): u64 { 32 } diff --git a/crates/iota-framework/packages/stardust/sources/basic/basic_output.move b/crates/iota-framework/packages/stardust/sources/basic/basic_output.move index 10e3dad75d7..e322baadf41 100644 --- a/crates/iota-framework/packages/stardust/sources/basic/basic_output.move +++ b/crates/iota-framework/packages/stardust/sources/basic/basic_output.move @@ -4,7 +4,7 @@ module stardust::basic_output { // === Imports === - // Iota imports. + // IOTA imports. use iota::bag::Bag; use iota::balance::Balance; use iota::transfer::Receiving; diff --git a/crates/iota-framework/packages/stardust/sources/nft/nft.move b/crates/iota-framework/packages/stardust/sources/nft/nft.move index 5ffbd7677d1..a257dd7dcd8 100644 --- a/crates/iota-framework/packages/stardust/sources/nft/nft.move +++ b/crates/iota-framework/packages/stardust/sources/nft/nft.move @@ -39,7 +39,7 @@ module stardust::nft { // Build a `Display` object. let keys = vector[ - // The Iota standard fields. + // The IOTA standard fields. string::utf8(b"name"), string::utf8(b"image_url"), string::utf8(b"description"), @@ -55,7 +55,7 @@ module stardust::nft { ]; let values = vector[ - // The Iota standard fields. + // The IOTA standard fields. string::utf8(b"{immutable_metadata.name}"), string::utf8(b"{immutable_metadata.uri}"), string::utf8(b"{immutable_metadata.description}"), diff --git a/crates/iota-framework/packages_compiled/iota-framework b/crates/iota-framework/packages_compiled/iota-framework index b1dfb3584d4..502259e0382 100644 Binary files a/crates/iota-framework/packages_compiled/iota-framework and b/crates/iota-framework/packages_compiled/iota-framework differ diff --git a/crates/iota-framework/published_api.txt b/crates/iota-framework/published_api.txt index 72299612773..b26c1ea49ef 100644 --- a/crates/iota-framework/published_api.txt +++ b/crates/iota-framework/published_api.txt @@ -3088,6 +3088,9 @@ lock_with_label_and_transfer unlock public fun 0x2::timelock +unlock_with_clock + public fun + 0x2::timelock join public fun 0x2::timelock @@ -3121,6 +3124,12 @@ is_locked remaining_time public fun 0x2::timelock +is_locked_with_clock + public fun + 0x2::timelock +remaining_time_with_clock + public fun + 0x2::timelock locked public fun 0x2::timelock @@ -3139,7 +3148,7 @@ unpack transfer fun 0x2::timelock -check_expiration_timestamp_ms +remaining_time_with_timestamp fun 0x2::timelock Token diff --git a/crates/iota-framework/tests/build-system-packages.rs b/crates/iota-framework/tests/build-system-packages.rs index 8e343a0e33f..aefc06ab5d7 100644 --- a/crates/iota-framework/tests/build-system-packages.rs +++ b/crates/iota-framework/tests/build-system-packages.rs @@ -198,12 +198,17 @@ fn build_packages_with_move_config( &mut files_to_write, ); create_category_file(framework_dir); - create_category_file(stdlib_dir); relocate_docs( framework_dir, &framework_pkg.package.compiled_docs.unwrap(), &mut files_to_write, ); + create_category_file(stdlib_dir); + relocate_docs( + stdlib_dir, + &stdlib_pkg.package.compiled_docs.unwrap(), + &mut files_to_write, + ); create_category_file(bridge_dir); relocate_docs( bridge_dir, diff --git a/crates/iota-genesis-builder/examples/build_stardust_genesis.rs b/crates/iota-genesis-builder/examples/build_stardust_genesis.rs index 2eb01e6e3df..79717c36516 100644 --- a/crates/iota-genesis-builder/examples/build_stardust_genesis.rs +++ b/crates/iota-genesis-builder/examples/build_stardust_genesis.rs @@ -14,11 +14,11 @@ use iota_swarm_config::genesis_config::ValidatorGenesisConfigBuilder; use rand::rngs::OsRng; #[derive(Parser, Debug)] -#[clap( +#[command( about = "Example Tool for generating a genesis file from a Stardust Migration Objects snapshot" )] struct Cli { - #[clap(long, default_value_t = OBJECT_SNAPSHOT_FILE_PATH.to_string(), help = "Path to the Stardust Migration Objects snapshot file")] + #[arg(long, default_value_t = OBJECT_SNAPSHOT_FILE_PATH.to_string(), help = "Path to the Stardust Migration Objects snapshot file")] snapshot_path: String, } diff --git a/crates/iota-genesis-builder/examples/build_stardust_genesis_from_s3.rs b/crates/iota-genesis-builder/examples/build_stardust_genesis_from_s3.rs index 8c12bb1798b..231979ccb9f 100644 --- a/crates/iota-genesis-builder/examples/build_stardust_genesis_from_s3.rs +++ b/crates/iota-genesis-builder/examples/build_stardust_genesis_from_s3.rs @@ -11,10 +11,10 @@ use tracing::{Level, info}; use tracing_subscriber::FmtSubscriber; #[derive(Parser, Debug)] -#[clap(about = "Example that builds genesis in a temp folder with migration snapshots")] +#[command(about = "Example that builds genesis in a temp folder with migration snapshots")] struct Args { /// Remotely stored migration snapshots. - #[clap( + #[arg( long, name = "iota|", help = "Remote migration snapshots.", diff --git a/crates/iota-genesis-builder/examples/snapshot_add_test_outputs.rs b/crates/iota-genesis-builder/examples/snapshot_add_test_outputs.rs index 3600e31afea..0913782ed32 100644 --- a/crates/iota-genesis-builder/examples/snapshot_add_test_outputs.rs +++ b/crates/iota-genesis-builder/examples/snapshot_add_test_outputs.rs @@ -13,17 +13,17 @@ use iota_genesis_builder::stardust::{ use iota_types::{gas_coin::STARDUST_TOTAL_SUPPLY_IOTA, stardust::coin_type::CoinType}; #[derive(Parser, Debug)] -#[clap(about = "Tool for adding test data to Iota Hornet full-snapshot")] +#[command(about = "Tool for adding test data to IOTA Hornet full-snapshot")] struct Cli { - #[clap(subcommand)] + #[command(subcommand)] snapshot: Snapshot, } #[derive(Subcommand, Debug)] enum Snapshot { - #[clap(about = "Parse an Iota Hornet full-snapshot file")] + #[command(about = "Parse an IOTA Hornet full-snapshot file")] Iota { - #[clap(long, help = "Path to the Iota Hornet full-snapshot file")] + #[arg(long, help = "Path to the IOTA Hornet full-snapshot file")] snapshot_path: String, }, } diff --git a/crates/iota-genesis-builder/examples/snapshot_only_test_outputs.rs b/crates/iota-genesis-builder/examples/snapshot_only_test_outputs.rs index 55b25187a01..eae82e48d02 100644 --- a/crates/iota-genesis-builder/examples/snapshot_only_test_outputs.rs +++ b/crates/iota-genesis-builder/examples/snapshot_only_test_outputs.rs @@ -7,31 +7,32 @@ use std::{fs::File, path::Path}; use clap::{Parser, Subcommand}; -use iota_genesis_builder::{ - IF_STARDUST_ADDRESS, - stardust::{ - parse::HornetSnapshotParser, - test_outputs::{add_snapshot_test_outputs, to_nanos}, - }, +use iota_genesis_builder::stardust::{ + parse::HornetSnapshotParser, + test_outputs::{add_snapshot_test_outputs, to_nanos}, +}; +use iota_sdk::types::block::address::Ed25519Address; +use iota_types::{ + base_types::IotaAddress, gas_coin::STARDUST_TOTAL_SUPPLY_IOTA, stardust::coin_type::CoinType, }; -use iota_sdk::types::block::address::Address; -use iota_types::{gas_coin::STARDUST_TOTAL_SUPPLY_IOTA, stardust::coin_type::CoinType}; const WITH_SAMPLING: bool = false; #[derive(Parser, Debug)] -#[clap(about = "Tool for generating Iota Hornet full-snapshot file with test data")] +#[command(about = "Tool for generating IOTA Hornet full-snapshot file with test data")] struct Cli { - #[clap(subcommand)] + #[command(subcommand)] snapshot: Snapshot, } #[derive(Subcommand, Debug)] enum Snapshot { - #[clap(about = "Parse an Iota Hornet full-snapshot file")] + #[command(about = "Parse an IOTA Hornet full-snapshot file")] Iota { - #[clap(long, help = "Path to the Iota Hornet full-snapshot file")] + #[arg(long, help = "Path to the IOTA Hornet full-snapshot file")] snapshot_path: String, + #[arg(long, help = "Specify the delegator address")] + delegator: IotaAddress, }, } @@ -62,8 +63,11 @@ fn parse_snapshot( #[tokio::main] async fn main() -> anyhow::Result<()> { let cli = Cli::parse(); - let (current_path, coin_type) = match cli.snapshot { - Snapshot::Iota { snapshot_path } => (snapshot_path, CoinType::Iota), + let (current_path, delegator, coin_type) = match cli.snapshot { + Snapshot::Iota { + snapshot_path, + delegator, + } => (snapshot_path, delegator, CoinType::Iota), }; let mut new_path = String::from("test-"); // prepend "test-" before the file name @@ -80,7 +84,7 @@ async fn main() -> anyhow::Result<()> { let (randomness_seed, delegator_address) = match coin_type { CoinType::Iota => { // IOTA coin type values - (0, IF_STARDUST_ADDRESS) + (0, delegator) } }; @@ -89,7 +93,7 @@ async fn main() -> anyhow::Result<()> { &new_path, coin_type, randomness_seed, - *Address::try_from_bech32(delegator_address)?.as_ed25519(), + Ed25519Address::from(delegator_address.to_inner()), WITH_SAMPLING, ) .await?; diff --git a/crates/iota-genesis-builder/src/lib.rs b/crates/iota-genesis-builder/src/lib.rs index ac464c309ce..69de4c1e0be 100644 --- a/crates/iota-genesis-builder/src/lib.rs +++ b/crates/iota-genesis-builder/src/lib.rs @@ -19,8 +19,8 @@ use genesis_build_effects::GenesisBuildEffects; use iota_config::{ IOTA_GENESIS_MIGRATION_TX_DATA_FILENAME, genesis::{ - Genesis, GenesisCeremonyParameters, GenesisChainParameters, TokenDistributionSchedule, - UnsignedGenesis, + Delegations, Genesis, GenesisCeremonyParameters, GenesisChainParameters, + TokenDistributionSchedule, UnsignedGenesis, }, migration_tx_data::{MigrationTxData, TransactionsData}, }; @@ -28,7 +28,7 @@ use iota_execution::{self, Executor}; use iota_framework::{BuiltInFramework, SystemPackage}; use iota_genesis_common::{execute_genesis_transaction, get_genesis_protocol_config}; use iota_protocol_config::{Chain, ProtocolConfig, ProtocolVersion}; -use iota_sdk::{Url, types::block::address::Address}; +use iota_sdk::Url; use iota_types::{ BRIDGE_ADDRESS, IOTA_BRIDGE_OBJECT_ID, IOTA_FRAMEWORK_PACKAGE_ID, IOTA_SYSTEM_ADDRESS, balance::{BALANCE_MODULE_NAME, Balance}, @@ -63,7 +63,6 @@ use iota_types::{ object::{Object, Owner}, programmable_transaction_builder::ProgrammableTransactionBuilder, randomness_state::{RANDOMNESS_MODULE_NAME, RANDOMNESS_STATE_CREATE_FUNCTION_NAME}, - stardust::stardust_to_iota_address, system_admin_cap::IOTA_SYSTEM_ADMIN_CAP_MODULE_NAME, timelock::{ stardust_upgrade_label::STARDUST_UPGRADE_LABEL_VALUE, @@ -78,7 +77,7 @@ use move_binary_format::CompiledModule; use move_core_types::ident_str; use serde::{Deserialize, Serialize}; use shared_crypto::intent::{Intent, IntentMessage, IntentScope}; -use stake::{GenesisStake, delegate_genesis_stake}; +use stake::GenesisStake; use stardust::migration::MigrationObjects; use tracing::trace; use validator_info::{GenesisValidatorInfo, GenesisValidatorMetadata, ValidatorInfo}; @@ -88,16 +87,14 @@ mod stake; pub mod stardust; pub mod validator_info; -// TODO: Lazy static `stardust_to_iota_address` -pub const IF_STARDUST_ADDRESS: &str = - "iota1qp8h9augeh6tk3uvlxqfapuwv93atv63eqkpru029p6sgvr49eufyz7katr"; - const GENESIS_BUILDER_COMMITTEE_DIR: &str = "committee"; pub const GENESIS_BUILDER_PARAMETERS_FILE: &str = "parameters"; const GENESIS_BUILDER_TOKEN_DISTRIBUTION_SCHEDULE_FILE: &str = "token-distribution-schedule"; const GENESIS_BUILDER_SIGNATURE_DIR: &str = "signatures"; const GENESIS_BUILDER_UNSIGNED_GENESIS_FILE: &str = "unsigned-genesis"; const GENESIS_BUILDER_MIGRATION_SOURCES_FILE: &str = "migration-sources"; +const GENESIS_BUILDER_DELEGATOR_FILE: &str = "delegator"; +const GENESIS_BUILDER_DELEGATOR_MAP_FILE: &str = "delegator-map"; pub const OBJECT_SNAPSHOT_FILE_PATH: &str = "stardust_object_snapshot.bin"; pub const IOTA_OBJECT_SNAPSHOT_URL: &str = "https://stardust-objects.s3.eu-central-1.amazonaws.com/iota/alphanet/latest/stardust_object_snapshot.bin.gz"; @@ -118,6 +115,15 @@ pub struct Builder { genesis_stake: GenesisStake, migration_sources: Vec, migration_tx_data: Option, + delegation: Option, +} + +enum GenesisDelegation { + /// Represents a single delegator address that applies to all validators. + OneToAll(IotaAddress), + /// Represents a map of delegator addresses to validator addresses and + /// a specified stake and gas allocation. + ManyToMany(Delegations), } impl Default for Builder { @@ -139,9 +145,20 @@ impl Builder { genesis_stake: Default::default(), migration_sources: Default::default(), migration_tx_data: Default::default(), + delegation: None, } } + pub fn with_delegator(mut self, delegator: IotaAddress) -> Self { + self.delegation = Some(GenesisDelegation::OneToAll(delegator)); + self + } + + pub fn with_delegations(mut self, delegations: Delegations) -> Self { + self.delegation = Some(GenesisDelegation::ManyToMany(delegations)); + self + } + /// Checks if the genesis to be built has no migration or if it includes /// Stardust migration stakes pub fn contains_migrations(&self) -> bool { @@ -253,19 +270,32 @@ impl Builder { /// Create and cache the [`GenesisStake`] if the builder /// contains migrated objects. + /// + /// Two cases can happen here: + /// 1. if a delegator map is given as input -> then use the map input to + /// create and cache the genesis stake. + /// 2. if a delegator map is NOT given as input -> then use one default + /// delegator passed as input and delegate the minimum required stake to + /// all validators to create and cache the genesis stake. fn create_and_cache_genesis_stake(&mut self) -> anyhow::Result<()> { if !self.migration_objects.is_empty() { - let delegator = - stardust_to_iota_address(Address::try_from_bech32(IF_STARDUST_ADDRESS).unwrap()) - .unwrap(); - // TODO: check whether we need to start with - // VALIDATOR_LOW_STAKE_THRESHOLD_NANOS - let minimum_stake = iota_types::governance::MIN_VALIDATOR_JOINING_STAKE_NANOS; - self.genesis_stake = delegate_genesis_stake( - self.validators.values(), - delegator, + self.genesis_stake = GenesisStake::new_with_delegations( + match &self.delegation { + Some(GenesisDelegation::ManyToMany(delegations)) => { + // Case 1 -> use the delegations input to create and cache the genesis stake + delegations.clone() + } + Some(GenesisDelegation::OneToAll(delegator)) => { + // Case 2 -> use one default delegator passed as input and delegate the + // minimum required stake to all validators to create the genesis stake + Delegations::new_for_validators_with_default_allocation( + self.validators.values().map(|v| v.info.iota_address()), + *delegator, + ) + } + None => bail!("no delegator/s assigned with a migration"), + }, &self.migration_objects, - minimum_stake, )?; } Ok(()) @@ -273,55 +303,76 @@ impl Builder { /// Evaluate the genesis [`TokenDistributionSchedule`]. /// - /// This merges conditionally the cached token distribution - /// (i.e. `self.token_distribution_schedule`) with the genesis stake - /// resulting from the migrated state. - /// - /// If the cached token distribution schedule contains timelocked stake, it - /// is assumed that the genesis stake is already merged and no operation - /// is performed. This is the case where we load a [`Builder`] from disk - /// that has already built genesis with the migrated state. + /// There are 6 cases for evaluating this: + /// 1. The genesis is built WITHOUT migration + /// 1. and a schedule is given as input -> then just use the input + /// schedule; + /// 2. and the schedule is NOT given as input -> then instantiate a + /// default token distribution schedule for a genesis without + /// migration. + /// 2. The genesis is built with migration, + /// 1. and token distribution schedule is given as input + /// 1. if the token distribution schedule contains a timelocked stake + /// -> then just use the input schedule, because it was initialized + /// for migration before this execution (this is the case where we + /// load a [`Builder`] from disk that has already built genesis + /// with the migrated state.); + /// 2. if the token distribution schedule does NOT contain any + /// timelocked stake -> then fetch the cached the genesis stake and + /// merge it to the token distribution schedule; + /// 2. and token distribution schedule is NOT given as input -> then + /// fetch the cached genesis stake and initialize a new token + /// distribution schedule with it. fn resolve_token_distribution_schedule(&mut self) -> TokenDistributionSchedule { - let validator_addresses = self.validators.values().map(|v| v.info.iota_address()); - let token_distribution_schedule = self.token_distribution_schedule.take(); + let is_genesis_with_migration = !self.migration_objects.is_empty(); let stardust_total_supply_nanos = self.migration_sources.len() as u64 * STARDUST_TOTAL_SUPPLY_NANOS; - if self.genesis_stake.is_empty() { - token_distribution_schedule.unwrap_or_else(|| { - TokenDistributionSchedule::new_for_validators_with_default_allocation( - validator_addresses, - ) - }) - } else if let Some(schedule) = token_distribution_schedule { - if schedule.contains_timelocked_stake() { - // Genesis stake is already included + + if let Some(schedule) = self.token_distribution_schedule.take() { + if !is_genesis_with_migration || schedule.contains_timelocked_stake() { + // Case 1.1 and 2.1.1 schedule } else { + // Case 2.1.2 self.genesis_stake .extend_token_distribution_schedule_without_migration( schedule, stardust_total_supply_nanos, ) } + } else if !is_genesis_with_migration { + // Case 1.2 + TokenDistributionSchedule::new_for_validators_with_default_allocation( + self.validators.values().map(|v| v.info.iota_address()), + ) } else { + // Case 2.2 self.genesis_stake .to_token_distribution_schedule(stardust_total_supply_nanos) } } fn build_and_cache_unsigned_genesis(&mut self) { - // Verify that all input data is valid + // Verify that all input data is valid. + // Check that if extra objects are present then it is allowed by the paramenters + // to add extra objects and it also validates the validator info self.validate_inputs().unwrap(); + // If migration sources are present, then load them into memory. + // Otherwise do nothing. self.load_migration_sources() .expect("migration sources should be loaded without errors"); + // If migration objects are present, then create and cache the genesis stake; + // this also prepares the data needed to resolve the token distribution + // schedule. Otherwise do nothing. self.create_and_cache_genesis_stake() .expect("genesis stake should be created without errors"); - // Get the token distribution schedule without migration or merge it with + // Resolve the token distribution schedule based on inputs and a possible // genesis stake let token_distribution_schedule = self.resolve_token_distribution_schedule(); + // Verify that token distribution schedule is valid token_distribution_schedule.validate(); token_distribution_schedule @@ -330,17 +381,17 @@ impl Builder { ) .expect("all validators should have the required stake"); - let objects = self.objects.clone().into_values().collect::>(); - // Finally build the genesis and migration data let (unsigned_genesis, migration_tx_data) = build_unsigned_genesis_data( &self.parameters, &token_distribution_schedule, self.validators.values(), - objects, + self.objects.clone().into_values().collect::>(), &mut self.genesis_stake, &mut self.migration_objects, ); + + // Store built data self.migration_tx_data = (!migration_tx_data.is_empty()).then_some(migration_tx_data); self.built_genesis = Some(unsigned_genesis); self.token_distribution_schedule = Some(token_distribution_schedule); @@ -357,7 +408,7 @@ impl Builder { fn committee(objects: &[Object]) -> Committee { let iota_system_object = - get_iota_system_state(&objects).expect("Iota System State object must always exist"); + get_iota_system_state(&objects).expect("IOTA System State object must always exist"); iota_system_object .get_current_epoch_committee() .committee() @@ -809,6 +860,26 @@ impl Builder { None }; + // Load delegator + let delegator_file = path.join(GENESIS_BUILDER_DELEGATOR_FILE); + let delegator = if delegator_file.exists() { + Some(serde_json::from_slice(&fs::read(delegator_file)?)?) + } else { + None + }; + + // Load delegator map + let delegator_map_file = path.join(GENESIS_BUILDER_DELEGATOR_MAP_FILE); + let delegator_map = if delegator_map_file.exists() { + Some(Delegations::from_csv(fs::File::open(delegator_map_file)?)?) + } else { + None + }; + + let delegation = delegator + .map(GenesisDelegation::OneToAll) + .or(delegator_map.map(GenesisDelegation::ManyToMany)); + let mut builder = Self { parameters, token_distribution_schedule, @@ -820,6 +891,7 @@ impl Builder { genesis_stake: Default::default(), migration_sources, migration_tx_data, + delegation, }; let unsigned_genesis_file = path.join(GENESIS_BUILDER_UNSIGNED_GENESIS_FILE); @@ -907,6 +979,23 @@ impl Builder { .save(file)?; } + if let Some(delegation) = &self.delegation { + match delegation { + GenesisDelegation::OneToAll(delegator) => { + // Write delegator to file + let file = path.join(GENESIS_BUILDER_DELEGATOR_FILE); + let delegator_json = serde_json::to_string(delegator)?; + fs::write(file, delegator_json)?; + } + GenesisDelegation::ManyToMany(delegator_map) => { + // Write delegator map to CSV file + delegator_map.to_csv(fs::File::create( + path.join(GENESIS_BUILDER_DELEGATOR_MAP_FILE), + )?)?; + } + } + } + Ok(()) } } @@ -1009,9 +1098,9 @@ fn build_unsigned_genesis_data<'info>( // migration data. These are either timelocked coins or gas coins. The token // distribution schedule logic assumes that these assets are indeed distributed // to some addresses and this happens above during the creation of the genesis - // objects. Here then we need to burn those assets from the original set of + // objects. Here then we need to destroy those assets from the original set of // migration objects. - let migration_objects = burn_staked_migration_objects( + let migration_objects = destroy_staked_migration_objects( &mut genesis_ctx, migration_objects.take_objects(), &genesis_objects, @@ -1538,9 +1627,9 @@ pub fn generate_genesis_system_object( // Migration objects as input to this function were previously used to create a // genesis stake, that in turn helps to create a token distribution schedule for -// the genesis. In this function the objects needed for the stake are burned +// the genesis. In this function the objects needed for the stake are destroyed // (and, if needed, split) to provide a new set of migration object as output. -fn burn_staked_migration_objects( +fn destroy_staked_migration_objects( genesis_ctx: &mut TxContext, migration_objects: Vec, genesis_objects: &[Object], @@ -1577,15 +1666,15 @@ fn burn_staked_migration_objects( // Extract objects from the store let mut intermediate_store = store.into_inner(); - // Second operation: burn gas and timelocks objects. - // If the genesis stake was created, then burn gas and timelock objects that + // Second operation: destroy gas and timelocks objects. + // If the genesis stake was created, then destroy gas and timelock objects that // were added to the token distribution schedule, because they will be // created on the Move side during genesis. That means we need to prevent // cloning value by evicting these here. - for (id, _, _) in genesis_stake.take_gas_coins_to_burn() { + for (id, _, _) in genesis_stake.take_gas_coins_to_destroy() { intermediate_store.remove(&id); } - for (id, _, _) in genesis_stake.take_timelocks_to_burn() { + for (id, _, _) in genesis_stake.take_timelocks_to_destroy() { intermediate_store.remove(&id); } @@ -1681,7 +1770,7 @@ impl From for SnapshotSource { } } -/// The URLs to download Iota object snapshot. +/// The URLs to download IOTA object snapshot. #[derive(Debug, Clone, Deserialize, Serialize)] pub enum SnapshotUrl { Iota, @@ -1713,7 +1802,7 @@ impl FromStr for SnapshotUrl { } impl SnapshotUrl { - /// Returns the Iota object snapshot download URL. + /// Returns the IOTA object snapshot download URL. pub fn to_url(&self) -> Url { match self { Self::Iota => Url::parse(IOTA_OBJECT_SNAPSHOT_URL).expect("should be valid URL"), diff --git a/crates/iota-genesis-builder/src/main.rs b/crates/iota-genesis-builder/src/main.rs index e0adc0db630..d654d0f6c39 100644 --- a/crates/iota-genesis-builder/src/main.rs +++ b/crates/iota-genesis-builder/src/main.rs @@ -4,50 +4,49 @@ //! Creating a stardust objects snapshot out of a Hornet snapshot. //! TIP that defines the Hornet snapshot file format: //! https://github.com/iotaledger/tips/blob/main/tips/TIP-0035/tip-0035.md -use std::{collections::BTreeMap, fs::File, io::BufWriter}; +use std::{fs::File, io::BufWriter}; -use anyhow::{Result, anyhow}; +use anyhow::Result; use clap::{Parser, Subcommand}; use iota_genesis_builder::{ OBJECT_SNAPSHOT_FILE_PATH, stardust::{ migration::{Migration, MigrationTargetNetwork}, parse::HornetSnapshotParser, - types::{address_swap_map::AddressSwapMap, output_header::OutputHeader}, + process_outputs::scale_amount_for_iota, + types::{address_swap_map::AddressSwapMap, address_swap_split_map::AddressSwapSplitMap}, }, }; -use iota_sdk::types::block::{ - address::Address, - output::{ - AliasOutputBuilder, BasicOutputBuilder, FoundryOutputBuilder, NftOutputBuilder, Output, - unlock_condition::{AddressUnlockCondition, StorageDepositReturnUnlockCondition}, - }, -}; -use iota_types::{stardust::coin_type::CoinType, timelock::timelock::is_vested_reward}; +use iota_types::stardust::coin_type::CoinType; use tracing::Level; use tracing_subscriber::FmtSubscriber; #[derive(Parser, Debug)] -#[clap(about = "Tool for migrating Iota Hornet full-snapshot file")] +#[command(about = "Tool for migrating IOTA Hornet full-snapshot file")] struct Cli { - #[clap(subcommand)] + #[command(subcommand)] snapshot: Snapshot, - #[clap(long, help = "Disable global snapshot verification")] + #[arg(long, help = "Disable global snapshot verification")] disable_global_snapshot_verification: bool, } #[derive(Subcommand, Debug)] enum Snapshot { - #[clap(about = "Migrate an Iota Hornet full-snapshot file")] + #[command(about = "Migrate an IOTA Hornet full-snapshot file")] Iota { - #[clap(long, help = "Path to the Iota Hornet full-snapshot file")] + #[arg(long, help = "Path to the IOTA Hornet full-snapshot file")] snapshot_path: String, - #[clap( + #[arg( long, - help = "Path to the address swap map file. This must be a CSV file with two columns, where an entry contains in the first column an IotaAddress present in the Hornet full-snapshot and in the second column an IotaAddress that will be used for the swap." + help = "Path to the address swap map file. This must be a CSV file with two columns, where an entry contains in the first column an IotaAddress present in the Hornet full-snapshot and in the second column an (ed25519 hex) IOTA Address that will be used for the swap." )] address_swap_map_path: Option, - #[clap(long, value_parser = clap::value_parser!(MigrationTargetNetwork), help = "Target network for migration")] + #[arg( + long, + help = "Path to the address swap split map file. This must be a CSV file with four columns, where an entry contains in the first column a (bech32) Address present in the Hornet full-snapshot, in the second column an (ed25519 hex) IOTA Address that will be used for the swap, in the third column a target amount of iota tokens to be split from the origin address to the destination address and in the fourth column the amount of timelocked iota tokens used for the same scope." + )] + address_swap_split_map_path: Option, + #[arg(long, value_parser = clap::value_parser!(MigrationTargetNetwork), help = "Target network for migration")] target_network: MigrationTargetNetwork, }, } @@ -55,21 +54,29 @@ enum Snapshot { fn main() -> Result<()> { // Initialize tracing let subscriber = FmtSubscriber::builder() - .with_max_level(Level::INFO) + .with_max_level(Level::DEBUG) .finish(); tracing::subscriber::set_global_default(subscriber).expect("setting default subscriber failed"); // Parse the CLI arguments let cli = Cli::parse(); - let (snapshot_path, address_swap_map_path, target_network, coin_type) = match cli.snapshot { + let ( + snapshot_path, + address_swap_map_path, + target_network, + address_swap_split_map_path, + coin_type, + ) = match cli.snapshot { Snapshot::Iota { snapshot_path, address_swap_map_path, + address_swap_split_map_path, target_network, } => ( snapshot_path, address_swap_map_path, target_network, + address_swap_split_map_path, CoinType::Iota, ), }; @@ -89,6 +96,13 @@ fn main() -> Result<()> { } else { AddressSwapMap::default() }; + + let address_swap_split_map = + if let Some(address_swap_split_map_path) = address_swap_split_map_path { + AddressSwapSplitMap::from_csv(&address_swap_split_map_path)? + } else { + AddressSwapSplitMap::default() + }; // Prepare the migration using the parser output stream let migration = Migration::new( snapshot_parser.target_milestone_timestamp(), @@ -104,182 +118,14 @@ fn main() -> Result<()> { match coin_type { CoinType::Iota => { - struct MergingIterator { - unlocked_address_balances: BTreeMap, - snapshot_timestamp_s: u32, - outputs: I, - } - - impl MergingIterator { - fn new(snapshot_timestamp_s: u32, outputs: I) -> Self { - Self { - unlocked_address_balances: Default::default(), - snapshot_timestamp_s, - outputs, - } - } - } - - impl>> Iterator for MergingIterator { - type Item = I::Item; - - fn next(&mut self) -> Option { - // First process all the outputs, building the unlocked_address_balances map as - // we go. - for res in self.outputs.by_ref() { - if let Ok((header, output)) = res { - fn mergeable_address( - header: &OutputHeader, - output: &Output, - snapshot_timestamp_s: u32, - ) -> Option
{ - // ignore all non-basic outputs and non vesting outputs - if !output.is_basic() - || !is_vested_reward(header.output_id(), output.as_basic()) - { - return None; - } - - if let Some(unlock_conditions) = output.unlock_conditions() { - // check if vesting unlock period is already done - if unlock_conditions.is_time_locked(snapshot_timestamp_s) { - return None; - } - unlock_conditions.address().map(|uc| *uc.address()) - } else { - None - } - } - - if let Some(address) = - mergeable_address(&header, &output, self.snapshot_timestamp_s) - { - // collect the unlocked vesting balances - self.unlocked_address_balances - .entry(address) - .and_modify(|x| x.balance += output.amount()) - .or_insert(OutputHeaderWithBalance { - output_header: header, - balance: output.amount(), - }); - continue; - } else { - return Some(Ok((header, output))); - } - } else { - return Some(res); - } - } - - // Now that we are out - self.unlocked_address_balances.pop_first().map( - |(address, output_header_with_balance)| { - // create a new basic output which holds the aggregated balance from - // unlocked vesting outputs for this address - let basic = BasicOutputBuilder::new_with_amount( - output_header_with_balance.balance, - ) - .add_unlock_condition(AddressUnlockCondition::new(address)) - .finish() - .expect("should be able to create a basic output"); - - Ok((output_header_with_balance.output_header, basic.into())) - }, - ) - } - } - - let merged_outputs = MergingIterator::new( + migration.run_for_iota( snapshot_parser.target_milestone_timestamp(), + address_swap_split_map, snapshot_parser.outputs(), - ) - .map(|res| { - let (header, mut output) = res?; - scale_output_amount_for_iota(&mut output)?; - - Ok::<_, anyhow::Error>((header, output)) - }); - itertools::process_results(merged_outputs, |outputs| { - migration.run(outputs, object_snapshot_writer) - })??; + object_snapshot_writer, + )?; } } Ok(()) } - -struct OutputHeaderWithBalance { - output_header: OutputHeader, - balance: u64, -} - -fn scale_output_amount_for_iota(output: &mut Output) -> Result<()> { - *output = match output { - Output::Basic(ref basic_output) => { - // Update amount - let mut builder = BasicOutputBuilder::from(basic_output) - .with_amount(scale_amount_for_iota(basic_output.amount())?); - - // Update amount in potential storage deposit return unlock condition - if let Some(sdr_uc) = basic_output - .unlock_conditions() - .get(StorageDepositReturnUnlockCondition::KIND) - { - let sdr_uc = sdr_uc.as_storage_deposit_return(); - builder = builder.replace_unlock_condition( - StorageDepositReturnUnlockCondition::new( - sdr_uc.return_address(), - scale_amount_for_iota(sdr_uc.amount())?, - u64::MAX, - ) - .unwrap(), - ); - }; - - Output::from(builder.finish()?) - } - Output::Alias(ref alias_output) => Output::from( - AliasOutputBuilder::from(alias_output) - .with_amount(scale_amount_for_iota(alias_output.amount())?) - .finish()?, - ), - Output::Foundry(ref foundry_output) => Output::from( - FoundryOutputBuilder::from(foundry_output) - .with_amount(scale_amount_for_iota(foundry_output.amount())?) - .finish()?, - ), - Output::Nft(ref nft_output) => { - // Update amount - let mut builder = NftOutputBuilder::from(nft_output) - .with_amount(scale_amount_for_iota(nft_output.amount())?); - - // Update amount in potential storage deposit return unlock condition - if let Some(sdr_uc) = nft_output - .unlock_conditions() - .get(StorageDepositReturnUnlockCondition::KIND) - { - let sdr_uc = sdr_uc.as_storage_deposit_return(); - builder = builder.replace_unlock_condition( - StorageDepositReturnUnlockCondition::new( - sdr_uc.return_address(), - scale_amount_for_iota(sdr_uc.amount())?, - u64::MAX, - ) - .unwrap(), - ); - }; - - Output::from(builder.finish()?) - } - Output::Treasury(_) => return Ok(()), - }; - Ok(()) -} - -fn scale_amount_for_iota(amount: u64) -> Result { - const IOTA_MULTIPLIER: u64 = 1000; - - amount - .checked_mul(IOTA_MULTIPLIER) - .ok_or_else(|| anyhow!("overflow multiplying amount {amount} by {IOTA_MULTIPLIER}")) -} diff --git a/crates/iota-genesis-builder/src/stake.rs b/crates/iota-genesis-builder/src/stake.rs index bdbceac5ae7..ef856fd7bd8 100644 --- a/crates/iota-genesis-builder/src/stake.rs +++ b/crates/iota-genesis-builder/src/stake.rs @@ -3,7 +3,8 @@ //! Logic and types to account for stake delegation during genesis. use iota_config::genesis::{ - TokenAllocation, TokenDistributionSchedule, TokenDistributionScheduleBuilder, + Delegations, TokenAllocation, TokenDistributionSchedule, TokenDistributionScheduleBuilder, + ValidatorAllocation, }; use iota_types::{ base_types::{IotaAddress, ObjectRef}, @@ -11,32 +12,29 @@ use iota_types::{ stardust::coin_kind::get_gas_balance_maybe, }; -use crate::{ - stardust::migration::{ExpirationTimestamp, MigrationObjects}, - validator_info::GenesisValidatorInfo, -}; +use crate::stardust::migration::{ExpirationTimestamp, MigrationObjects}; #[derive(Default, Debug, Clone)] pub struct GenesisStake { token_allocation: Vec, - gas_coins_to_burn: Vec, - timelocks_to_burn: Vec, + gas_coins_to_destroy: Vec, + timelocks_to_destroy: Vec, timelocks_to_split: Vec<(ObjectRef, u64, IotaAddress)>, } impl GenesisStake { - /// Take the inner gas-coin objects that must be burned. + /// Take the inner gas-coin objects that must be destroyed. /// /// This follows the semantics of [`std::mem::take`]. - pub fn take_gas_coins_to_burn(&mut self) -> Vec { - std::mem::take(&mut self.gas_coins_to_burn) + pub fn take_gas_coins_to_destroy(&mut self) -> Vec { + std::mem::take(&mut self.gas_coins_to_destroy) } - /// Take the inner timelock objects that must be burned. + /// Take the inner timelock objects that must be destroyed. /// /// This follows the semantics of [`std::mem::take`]. - pub fn take_timelocks_to_burn(&mut self) -> Vec { - std::mem::take(&mut self.timelocks_to_burn) + pub fn take_timelocks_to_destroy(&mut self) -> Vec { + std::mem::take(&mut self.timelocks_to_destroy) } /// Take the inner timelock objects that must be split. @@ -48,8 +46,9 @@ impl GenesisStake { pub fn is_empty(&self) -> bool { self.token_allocation.is_empty() - && self.gas_coins_to_burn.is_empty() - && self.timelocks_to_burn.is_empty() + && self.gas_coins_to_destroy.is_empty() + && self.timelocks_to_destroy.is_empty() + && self.timelocks_to_split.is_empty() } /// Calculate the total amount of token allocations. @@ -82,7 +81,7 @@ impl GenesisStake { /// inner token allocations. /// /// The resulting schedule is guaranteed to contain allocations - /// that sum up the initial total supply of Iota in nanos. + /// that sum up the initial total supply of IOTA in nanos. /// /// ## Errors /// @@ -105,168 +104,332 @@ impl GenesisStake { fn calculate_pre_minted_supply(&self, total_supply_nanos: u64) -> u64 { total_supply_nanos - self.sum_token_allocation() } + + /// Creates a `GenesisStake` using a `Delegations` containing the necessary + /// allocations for validators by some delegators. + /// + /// This function invokes `delegate_genesis_stake` for each delegator found + /// in `Delegations`. + pub fn new_with_delegations( + delegations: Delegations, + migration_objects: &MigrationObjects, + ) -> anyhow::Result { + let mut stake = GenesisStake::default(); + + for (delegator, validators_allocations) in delegations.allocations { + // Fetch all timelock and gas objects owned by the delegator + let timelocks_pool = + migration_objects.get_sorted_timelocks_and_expiration_by_owner(delegator); + let gas_coins_pool = migration_objects.get_gas_coins_by_owner(delegator); + if timelocks_pool.is_none() && gas_coins_pool.is_none() { + anyhow::bail!("no timelocks or gas-coin objects found for delegator {delegator:?}"); + } + stake.delegate_genesis_stake( + &validators_allocations, + delegator, + &mut timelocks_pool.unwrap_or_default().into_iter(), + &mut gas_coins_pool + .unwrap_or_default() + .into_iter() + .map(|object| (object, 0)), + )?; + } + + Ok(stake) + } + + fn create_token_allocation( + &mut self, + recipient_address: IotaAddress, + amount_nanos: u64, + staked_with_validator: Option, + staked_with_timelock_expiration: Option, + ) { + self.token_allocation.push(TokenAllocation { + recipient_address, + amount_nanos, + staked_with_validator, + staked_with_timelock_expiration, + }); + } + + /// Create the necessary allocations for `validators_allocations` using the + /// assets of the `delegator`. + /// + /// This function iterates in turn over [`TimeLock`] and + /// [`GasCoin`][iota_types::gas_coin::GasCoin] objects created + /// during stardust migration that are owned by the `delegator`. + pub fn delegate_genesis_stake<'obj>( + &mut self, + validators_allocations: &[ValidatorAllocation], + delegator: IotaAddress, + timelocks_pool: &mut impl Iterator, + gas_coins_pool: &mut impl Iterator, + ) -> anyhow::Result<()> { + // Temp stores for holding the surplus + let mut timelock_surplus = SurplusCoin::default(); + let mut gas_surplus = SurplusCoin::default(); + + // Then, try to create new token allocations for each validator using the + // objects fetched above + for validator_allocation in validators_allocations { + // The validator address + let validator = validator_allocation.validator; + // The target amount of nanos to be staked, either with timelock or gas objects + let mut target_stake_nanos = validator_allocation.amount_nanos_to_stake; + // The gas to pay to the validator + let gas_to_pay_nanos = validator_allocation.amount_nanos_to_pay_gas; + + // Start filling allocations with timelocks + + // Pick fresh timelock objects (if present) and possibly reuse the surplus + // coming from the previous iteration. + // The method `pick_objects_for_allocation` firstly checks if the + // `timelock_surplus` can be used to reach or reduce the `target_stake_nanos`. + // Then it iterates over the `timelocks_pool`. For each timelock object, its + // balance is used to reduce the `target_stake_nanos` while its the object + // reference is placed into a vector `to_destroy`. At the end, the + // `pick_objects_for_allocation` method returns an `AllocationObjects` including + // the list of objects to destroy, the list `staked_with_timelock` containing + // the information for creating token allocations with timestamps + // and a CoinSurplus (even empty). + let mut timelock_allocation_objects = pick_objects_for_allocation( + timelocks_pool, + target_stake_nanos, + &mut timelock_surplus, + ); + if !timelock_allocation_objects.staked_with_timelock.is_empty() { + // Inside this block some timelock objects were picked from the pool; so we can + // save all the references to timelocks to destroy, if there are any + self.timelocks_to_destroy + .append(&mut timelock_allocation_objects.to_destroy); + // Finally we create some token allocations based on timelock_allocation_objects + timelock_allocation_objects + .staked_with_timelock + .iter() + .for_each(|&(timelocked_amount, expiration_timestamp)| { + // For timelocks we create a `TokenAllocation` object with + // `staked_with_timelock` filled with entries + self.create_token_allocation( + delegator, + timelocked_amount, + Some(validator), + Some(expiration_timestamp), + ); + }); + } + // The remainder of the target stake after timelock objects were used. + target_stake_nanos -= timelock_allocation_objects.amount_nanos; + + // After allocating timelocked stakes, then + // 1. allocate gas coin stakes (if timelocked funds were not enough) + // 2. and/or allocate gas coin payments (if indicated in the validator + // allocation). + + // The target amount of gas coin nanos to be allocated, either with staking or + // to pay + let target_gas_nanos = target_stake_nanos + gas_to_pay_nanos; + // Pick fresh gas coin objects (if present) and possibly reuse the surplus + // coming from the previous iteration. The logic is the same as above with + // timelocks. + let mut gas_coin_objects = + pick_objects_for_allocation(gas_coins_pool, target_gas_nanos, &mut gas_surplus); + if gas_coin_objects.amount_nanos >= target_gas_nanos { + // Inside this block some gas coin objects were picked from the pool; so we can + // save all the references to gas coins to destroy + self.gas_coins_to_destroy + .append(&mut gas_coin_objects.to_destroy); + // Then + // Case 1. allocate gas stakes + if target_stake_nanos > 0 { + // For staking gas coins we create a `TokenAllocation` object with + // an empty `staked_with_timelock` + self.create_token_allocation( + delegator, + target_stake_nanos, + Some(validator), + None, + ); + } + // Case 2. allocate gas payments + if gas_to_pay_nanos > 0 { + // For gas coins payments we create a `TokenAllocation` object with + // `recipient_address` being the validator and no stake + self.create_token_allocation(validator, gas_to_pay_nanos, None, None); + } + } else { + // It means the delegator finished all the timelock or gas funds + return Err(anyhow::anyhow!( + "Not enough funds for delegator {:?}", + delegator + )); + } + } + + // 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() { + 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() { + self.gas_coins_to_destroy.push(surplus_gas_coin); + self.create_token_allocation(delegator, surplus_nanos, None, None); + } + + Ok(()) + } } /// The objects picked for token allocation during genesis #[derive(Default, Debug, Clone)] -pub struct AllocationObjects { - inner: Vec, +struct AllocationObjects { + /// The list of objects to destroy for the allocations + to_destroy: Vec, /// The total amount of nanos to be allocated from this /// collection of objects. amount_nanos: u64, - /// The surplus amount that is not be allocated from this - /// collection of objects. - surplus_nanos: u64, /// A (possible empty) vector of (amount, timelock_expiration) pairs /// indicating the amount to timelock stake and its expiration staked_with_timelock: Vec<(u64, u64)>, } +/// The surplus object that should be split for this allocation. Only part +/// of its balance will be used for this collection of this +/// `AllocationObjects`, the surplus might be used later. +#[derive(Default, Debug, Clone)] +struct SurplusCoin { + // The reference of the coin to possibly split to get the surplus. + coin_object_ref: Option, + /// The surplus amount for that coin object. + surplus_nanos: u64, + /// Possibly indicate a timelock stake expiration. + timestamp: u64, +} + +impl SurplusCoin { + // Check if the current surplus can be reused. + // The surplus coin_object_ref is returned to be included in a `to_destroy` list + // when surplus_nanos <= target_amount_nanos. Otherwise it means the + // target_amount_nanos is completely reached, so we can still keep + // coin_object_ref as surplus coin and only reduce the surplus_nanos value. + pub fn maybe_reuse_surplus( + &mut self, + target_amount_nanos: u64, + ) -> (Option, Option, u64) { + if self.coin_object_ref.is_some() { + 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) + } else { + self.surplus_nanos -= target_amount_nanos; + (None, Some(target_amount_nanos), self.timestamp) + } + } else { + (None, None, 0) + } + } + + // Destroy the `CoinSurplus` and take the fields. + pub fn take(self) -> (Option, u64) { + (self.coin_object_ref, self.surplus_nanos) + } +} + /// Pick gas-coin like objects from a pool to cover -/// the `target_amount`. +/// the `target_amount_nanos`. It might also make use of a previous coin +/// surplus. /// /// This does not split any surplus balance, but delegates /// splitting to the caller. -pub fn pick_objects_for_allocation<'obj>( +fn pick_objects_for_allocation<'obj>( pool: &mut impl Iterator, - target_amount: u64, + target_amount_nanos: u64, + previous_surplus_coin: &mut SurplusCoin, ) -> AllocationObjects { - let mut amount_nanos = 0; - let mut surplus_nanos = 0; + let mut allocation_tot_amount_nanos = 0; + let mut surplus_coin = SurplusCoin::default(); // Will be left empty in the case of gas coins let mut staked_with_timelock = vec![]; + let mut to_destroy = vec![]; - let objects = pool - .by_ref() - .map_while(|(object, timestamp)| { - if amount_nanos < target_amount { - let mut object_balance = get_gas_balance_maybe(object)?.value(); - // Check if remaining is needed to be handled - let remaining_needed = target_amount - amount_nanos; - if object_balance > remaining_needed { - surplus_nanos = object_balance - remaining_needed; - object_balance = remaining_needed; - } - // Finally update amount - amount_nanos += object_balance; - // Store timestamp if it is a Timelock - if timestamp > 0 { - staked_with_timelock.push((object_balance, timestamp)); - } - Some(object.compute_object_reference()) - } else { - None - } - }) - .collect(); - - AllocationObjects { - inner: objects, - amount_nanos, - surplus_nanos, - staked_with_timelock, + 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)); + } + // If the `surplus_object` is returned by `maybe_reuse_surplus`, then it means + // it used all its `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`. } -} -/// Create the necessary allocations to cover `amount_nanos` for all -/// `validators`. -/// -/// This function iterates in turn over [`TimeLock`] and -/// [`GasCoin`][iota_types::gas_coin::GasCoin] objects created -/// during stardust migration that are owned by the `delegator`. -pub fn delegate_genesis_stake<'info>( - validators: impl Iterator, - delegator: IotaAddress, - migration_objects: &MigrationObjects, - amount_nanos: u64, -) -> anyhow::Result { - let timelocks_pool = migration_objects.get_sorted_timelocks_and_expiration_by_owner(delegator); - let gas_coins_pool = migration_objects.get_gas_coins_by_owner(delegator); - if timelocks_pool.is_none() && gas_coins_pool.is_none() { - anyhow::bail!("no timelocks or gas-coin objects found for delegator {delegator:?}"); + // 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::>(), + ); } - let mut timelocks_pool = timelocks_pool.unwrap_or_default().into_iter(); - let mut gas_coins_pool = gas_coins_pool - .unwrap_or_default() - .into_iter() - .map(|object| (object, 0)); - let mut genesis_stake = GenesisStake::default(); - - // For each validator we try to fill their allocation up to - // total_amount_to_stake_per_validator - for validator in validators { - let target_stake = amount_nanos; - - // Start filling allocations with timelocks - let mut timelock_objects = pick_objects_for_allocation(&mut timelocks_pool, target_stake); - // TODO: This is not an optimal solution because the last timelock - // might have a surplus amount, which cannot be used without splitting. - if !timelock_objects.inner.is_empty() { - timelock_objects.staked_with_timelock.iter().for_each( - |&(timelocked_amount, expiration_timestamp)| { - // For timelocks we create a `TokenAllocation` object with - // `staked_with_timelock` filled with entries - genesis_stake.token_allocation.push(TokenAllocation { - recipient_address: delegator, - amount_nanos: timelocked_amount, - staked_with_validator: Some(validator.info.iota_address()), - staked_with_timelock_expiration: Some(expiration_timestamp), - }); - }, - ); - // Get the reference to the timelock to split needed to get exactly - // `amount_nanos` - let timelock_to_split = *timelock_objects - .inner - .last() - .expect("there should be at least two objects"); - // Save all the references to timelocks to burn - genesis_stake - .timelocks_to_burn - .append(&mut timelock_objects.inner); - // Save the reference for the token to split (and then burn) - genesis_stake.timelocks_to_split.push(( - timelock_to_split, - timelock_objects.surplus_nanos, - delegator, - )) - } - // Then cover any remaining target stake with gas coins - let remainder_target_stake = target_stake - timelock_objects.amount_nanos; - let mut gas_coin_objects = - pick_objects_for_allocation(&mut gas_coins_pool, remainder_target_stake); - genesis_stake - .gas_coins_to_burn - .append(&mut gas_coin_objects.inner); - // TODO: also here, this is not an optimal solution because the last gas object - // might have a surplus amount, which cannot be used without splitting. - if gas_coin_objects.amount_nanos < remainder_target_stake { - return Err(anyhow::anyhow!( - "Not enough funds for delegator {:?}", - delegator - )); - } else if gas_coin_objects.amount_nanos > 0 { - // For gas coins we create a `TokenAllocation` object with - // an empty`staked_with_timelock` - genesis_stake.token_allocation.push(TokenAllocation { - recipient_address: delegator, - amount_nanos: gas_coin_objects.amount_nanos, - staked_with_validator: Some(validator.info.iota_address()), - staked_with_timelock_expiration: None, - }); - if gas_coin_objects.surplus_nanos > 0 { - // This essentially schedules returning any surplus amount - // from the last coin in `gas_coin_objects` to the delegator - // as a new coin, so that the split is not needed - genesis_stake.token_allocation.push(TokenAllocation { - recipient_address: delegator, - amount_nanos: gas_coin_objects.surplus_nanos, - staked_with_validator: None, - staked_with_timelock_expiration: None, - }); - } - } + // Update the surplus coin passed from the caller + *previous_surplus_coin = surplus_coin; + + AllocationObjects { + to_destroy, + amount_nanos: allocation_tot_amount_nanos, + staked_with_timelock, } - Ok(genesis_stake) } diff --git a/crates/iota-genesis-builder/src/stardust/migration/migration.rs b/crates/iota-genesis-builder/src/stardust/migration/migration.rs index 96ef8c7fd2a..d80096d99d5 100644 --- a/crates/iota-genesis-builder/src/stardust/migration/migration.rs +++ b/crates/iota-genesis-builder/src/stardust/migration/migration.rs @@ -32,7 +32,11 @@ use crate::stardust::{ verification::{created_objects::CreatedObjects, verify_outputs}, }, native_token::package_data::NativeTokenPackageData, - types::{address_swap_map::AddressSwapMap, output_header::OutputHeader}, + process_outputs::process_outputs_for_iota, + types::{ + address_swap_map::AddressSwapMap, address_swap_split_map::AddressSwapSplitMap, + output_header::OutputHeader, + }, }; /// We fix the protocol version used in the migration. @@ -163,6 +167,21 @@ impl Migration { Ok(()) } + /// Run all stages of the migration coming from a Hornet snapshot with IOTA + /// coin type. + pub fn run_for_iota<'a>( + self, + target_milestone_timestamp: u32, + swap_split_map: AddressSwapSplitMap, + outputs: impl Iterator> + 'a, + writer: impl Write, + ) -> Result<()> { + itertools::process_results( + process_outputs_for_iota(target_milestone_timestamp, swap_split_map, outputs), + |outputs| self.run(outputs, writer), + )? + } + /// The migration objects. /// /// The system packages and underlying `init` objects diff --git a/crates/iota-genesis-builder/src/stardust/migration/tests/basic.rs b/crates/iota-genesis-builder/src/stardust/migration/tests/basic.rs index b503be9862c..7dcddce5933 100644 --- a/crates/iota-genesis-builder/src/stardust/migration/tests/basic.rs +++ b/crates/iota-genesis-builder/src/stardust/migration/tests/basic.rs @@ -76,7 +76,7 @@ fn basic_simple_coin_id() { fn basic_simple_coin_id_with_expired_timelock() { for header in [ random_output_header(), - OutputHeader::new_testing( + OutputHeader::new( // A potential vesting reward output transaction ID. *TransactionId::from_str( "0xb191c4bc825ac6983789e50545d5ef07a1d293a98ad974fc9498cb1812345678", diff --git a/crates/iota-genesis-builder/src/stardust/migration/tests/mod.rs b/crates/iota-genesis-builder/src/stardust/migration/tests/mod.rs index f694f1b8758..97615e4f0f1 100644 --- a/crates/iota-genesis-builder/src/stardust/migration/tests/mod.rs +++ b/crates/iota-genesis-builder/src/stardust/migration/tests/mod.rs @@ -52,7 +52,7 @@ mod foundry; mod nft; fn random_output_header() -> OutputHeader { - OutputHeader::new_testing( + OutputHeader::new( random(), random_output_index(), random(), diff --git a/crates/iota-genesis-builder/src/stardust/mod.rs b/crates/iota-genesis-builder/src/stardust/mod.rs index 56a24edab30..b4e832eea96 100644 --- a/crates/iota-genesis-builder/src/stardust/mod.rs +++ b/crates/iota-genesis-builder/src/stardust/mod.rs @@ -8,6 +8,7 @@ pub mod migration; pub mod native_token; pub mod parse; +pub mod process_outputs; #[cfg(feature = "test-outputs")] pub mod test_outputs; pub mod types; diff --git a/crates/iota-genesis-builder/src/stardust/native_token/package_builder.rs b/crates/iota-genesis-builder/src/stardust/native_token/package_builder.rs index b6ad5d813e7..38765a8a672 100644 --- a/crates/iota-genesis-builder/src/stardust/native_token/package_builder.rs +++ b/crates/iota-genesis-builder/src/stardust/native_token/package_builder.rs @@ -147,7 +147,7 @@ fn format_string_as_move_vector(string: &str) -> String { for (idx, byte) in string.as_bytes().iter().enumerate() { byte_string.push_str(&format!("{byte:#x}")); - if idx != string.as_bytes().len() - 1 { + if idx != string.len() - 1 { byte_string.push_str(", "); } } diff --git a/crates/iota-genesis-builder/src/stardust/process_outputs.rs b/crates/iota-genesis-builder/src/stardust/process_outputs.rs new file mode 100644 index 00000000000..86460c89161 --- /dev/null +++ b/crates/iota-genesis-builder/src/stardust/process_outputs.rs @@ -0,0 +1,739 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +use std::{ + cmp::Ordering, + collections::{BTreeMap, BTreeSet}, +}; + +use anyhow::{Result, anyhow}; +use fastcrypto::{encoding::Hex, hash::HashFunction}; +use iota_sdk::types::{ + api::plugins::participation::types::PARTICIPATION_TAG, + block::{ + address::{Address, Ed25519Address}, + output::{ + AliasOutputBuilder, BasicOutput, BasicOutputBuilder, FoundryOutputBuilder, + NftOutputBuilder, OUTPUT_INDEX_MAX, Output, OutputId, + feature::SenderFeature, + unlock_condition::{AddressUnlockCondition, StorageDepositReturnUnlockCondition}, + }, + payload::transaction::TransactionId, + }, +}; +use iota_types::{ + base_types::IotaAddress, + crypto::DefaultHash, + timelock::timelock::{VESTED_REWARD_ID_PREFIX, is_vested_reward}, +}; +use tracing::debug; + +use super::types::{ + address_swap_split_map::AddressSwapSplitMap, output_header::OutputHeader, + output_index::OutputIndex, +}; + +/// Processes an iterator of outputs coming from a Hornet snapshot chaining some +/// filters: +/// - the `ScaleIotaAmountIterator` scales balances of IOTA Tokens from micro to +/// nano. +/// - the `UnlockedVestingIterator` takes vesting outputs that can be unlocked +/// and merges them into a unique basic output. +/// - the `ParticipationOutputFilter` removes all features from the basic +/// outputs with a participation tag. +/// - the `SwapSplitIterator` performs the operation of SwapSplit given a map as +/// input, i.e., for certain origin addresses it swaps the addressUC to a +/// destination address and splits some amounts of tokens and/or timelocked +/// tokens (this operation can be done for several destinations). +pub fn process_outputs_for_iota<'a>( + target_milestone_timestamp: u32, + swap_split_map: AddressSwapSplitMap, + outputs: impl Iterator> + 'a, +) -> impl Iterator> + 'a { + // Create the iterator with the filters needed for an IOTA snapshot + outputs + .scale_iota_amount() + .filter_unlocked_vesting_outputs(target_milestone_timestamp) + .filter_participation_outputs() + .perform_swap_split(swap_split_map) + .map(|res| { + let (header, output) = res?; + Ok((header, output)) + }) +} + +/// Take an `amount` and scale it by a multiplier defined for the IOTA token. +pub fn scale_amount_for_iota(amount: u64) -> Result { + const IOTA_MULTIPLIER: u64 = 1000; + + amount + .checked_mul(IOTA_MULTIPLIER) + .ok_or_else(|| anyhow!("overflow multiplying amount {amount} by {IOTA_MULTIPLIER}")) +} + +// Check if the output is basic and has a feature Tag using the Participation +// Tag: https://github.com/iota-community/treasury/blob/main/specifications/hornet-participation-plugin.md +pub fn is_participation_output(output: &Output) -> bool { + if let Some(feat) = output.features() { + if output.is_basic() && !feat.is_empty() { + if let Some(tag) = feat.tag() { + return tag.to_string() == Hex::encode_with_format(PARTICIPATION_TAG); + }; + } + }; + false +} + +/// Iterator that modifies some outputs address unlocked by certain origin +/// addresses found in the `swap_split_map`. For each origin address there can +/// be a set of destination addresses. Each destination address as either a +/// tokens target, a tokens timelocked target or both. So, each output found by +/// this filter with an address unlock condition being the origin address, a +/// SwapSplit operation is performed. This operation consists in splitting the +/// output in different outputs given the targets indicated for the destinations +/// and swapping the address unlock condition to be the destination address one. +/// This operation is performed on all basic outputs and (vesting) timelocked +/// basic outputs until the targets are reached. +struct SwapSplitIterator { + /// Iterator over `(OutputHeader, Output)` pairs. + outputs: I, + /// Map used for the SwapSplit operation. It associates an origin address to + /// a vector of destinations. A destination is a tuple containing a + /// destination address, a tokens target and a timelocked tokens target. + swap_split_map: AddressSwapSplitMap, + /// Basic outputs with timelock unlock conditions. These are candidate + /// outputs that are kept in ascending order of timestamp and, when the + /// iteration over all outputs has finished, some of them will be popped + /// to be picked for the SwapSplit operation. + timelock_candidates: BTreeSet, + /// Basic outputs that have been split during the processing. These can be + /// either basic outputs or (vesting) timelocked basic outputs that will + /// be added as new in the ledger, before the migration. + split_basic_outputs: Vec<(OutputHeader, Output)>, + num_swapped_basic: u64, + num_swapped_timelocks: u64, + num_splits: u64, +} + +impl SwapSplitIterator { + fn new(outputs: I, swap_split_map: AddressSwapSplitMap) -> Self { + Self { + outputs, + swap_split_map, + timelock_candidates: Default::default(), + split_basic_outputs: Default::default(), + num_swapped_basic: 0, + num_swapped_timelocks: 0, + num_splits: 0, + } + } + + /// Pop an output from `split_basic_outputs`. Since this contains newly + /// created outputs, there is the need to create a new OutputHeader that + /// is not in conflict with any other one in the ledger. Use some data + /// coming from the original output header plus some unique information + /// about the new output. + fn get_split_output(&mut self) -> Option<(OutputHeader, Output)> { + let (original_header, output) = self.split_basic_outputs.pop()?; + self.num_splits += 1; + let pos = self.split_basic_outputs.len(); + + let (transaction_id, output_index) = if original_header + .output_id() + .to_string() + .starts_with(VESTED_REWARD_ID_PREFIX) + { + // If the original basic output is a vesting output, generate the new OutputId + // as: original-transaction-id|index + // where index is a unique input + // index being a number in the range 1 to OUTPUT_INDEX_MAX is safe because + // vesting output indexes are always 0 + // https://github.com/iotaledger/snapshot-tool-new-supply + if original_header.output_id().index() != 0 { + debug!( + "Found a vesting output with output index different than 0: {}", + original_header.output_id() + ); + } + let index = 1 + (pos as u16 % (OUTPUT_INDEX_MAX - 1)); + ( + *original_header.output_id().transaction_id(), + OutputIndex::new(index).unwrap(), + ) + } else { + // Otherwise, generate the new OutputId as: + // DefaultHash("iota-genesis-outputs"|original-output-id|pos)|index + // where pos is a unique input + let index = pos as u16 % OUTPUT_INDEX_MAX; + let mut hasher = DefaultHash::default(); + hasher.update(b"iota-genesis-outputs"); + hasher.update(original_header.output_id().hash()); + hasher.update(pos.to_le_bytes()); + let hash = hasher.finalize(); + ( + TransactionId::new(hash.into()), + OutputIndex::new(index).unwrap(), + ) + }; + + Some(( + OutputHeader::new( + *transaction_id, + output_index, + *original_header.block_id(), + *original_header.ms_index(), + original_header.ms_timestamp(), + ), + output, + )) + } +} + +impl Iterator for SwapSplitIterator +where + I: Iterator>, +{ + type Item = I::Item; + + /// Get the next from the chained self.outputs iterator and apply the + /// SwapSplit filter if that's the case. + fn next(&mut self) -> Option { + for mut output in self.outputs.by_ref() { + if let Ok((header, inner)) = &mut output { + if let Output::Basic(ref basic_output) = inner { + let uc = basic_output.unlock_conditions(); + // Only for outputs with timelock and/or address unlock conditions the SwapSplit + // operation can be performed + if uc.storage_deposit_return().is_none() && uc.expiration().is_none() { + // Now check if the addressUC's address is to swap + if let Some(destinations) = self + .swap_split_map + .get_destination_maybe_mut(uc.address().unwrap().address()) + { + if uc.timelock().is_some() { + // If the output has a timelock UC (and it is a vested reward) and + // at least one destination requires some timelocked tokens, then + // store it as a candidate and continue with the iterator + if is_vested_reward(header.output_id(), basic_output) + && destinations.contains_tokens_timelocked_target() + { + // Here we store all the timelocked basic outputs we find, + // because we need all the ones owned by the origin address + // sorted by the unlocking timestamp; outside this loop, + // i.e., once all have been collected, we'll start the + // SwapSplit operation in order, starting from the one that + // unlocks later in time. + self.timelock_candidates.insert(TimelockOrderedOutput { + header: header.clone(), + output: inner.clone(), + }); + continue; + } + } else { + // If it is just a basic output, try to perform the SwapSplit + // operation for several destinations once all tokens targets are + // meet. + let (original_output_opt, split_outputs) = swap_split_operation( + destinations.iter_by_tokens_target_mut_filtered(), + basic_output, + ); + // If some SwapSplit were performed, their result are basic inputs + // stored in split_outputs; so, we save them in + // split_basic_outputs to return them later + if !split_outputs.is_empty() { + self.num_swapped_basic += 1; + } + self.split_basic_outputs.extend( + split_outputs + .into_iter() + .map(|output| (header.clone(), output)), + ); + // If there was a remainder, the original output is returned for the + // iterator, possibly with a modified amount; else, continue the + // loop + if let Some(original_output) = original_output_opt { + *inner = original_output; + } else { + continue; + } + }; + } + } + } + } + return Some(output); + } + // Now that we are out of the loop we collect the processed outputs from the + // timelock filter and try to fulfill the target. + // First, resolve timelocks SwapSplit operations, taking those out from + // timelocks; the ordered_timelock_candidates is ordered by timestamp + // and we want to take the latest ones first. + while let Some(TimelockOrderedOutput { header, output }) = + self.timelock_candidates.pop_last() + { + // We know that all of them are timelocked basic outputs + let timelocked_basic_output = output.as_basic(); + let uc = timelocked_basic_output.unlock_conditions(); + // Get destination address and mutable timelocked tokens target + let destinations = self + .swap_split_map + .get_destination_maybe_mut(uc.address().unwrap().address()) + .expect("ordered timelock candidates should be part of the swap map"); + + // Try to perform the SwapSplit operation for several destinations once all + // tokens timelocked targets are met + let (original_output_opt, split_outputs) = swap_split_operation( + destinations.iter_by_tokens_timelocked_target_mut_filtered(), + timelocked_basic_output, + ); + // If some SwapSplit were performed, their result are timelocked basic inputs + // stored in split_outputs; so, we save them in + // split_basic_outputs to return them later + if !split_outputs.is_empty() { + self.num_swapped_timelocks += 1; + } + self.split_basic_outputs.extend( + split_outputs + .into_iter() + .map(|output| (header.clone(), output)), + ); + // If there was a remainder, the original output is returned for the + // iterator, possibly with a modified amount; otherwise, continue the + // loop + if let Some(original_output) = original_output_opt { + return Some(Ok((header, original_output))); + } else { + continue; + } + } + // Second, return all the remaining split outputs generated suring SwapSplit + // operations + Some(Ok(self.get_split_output()?)) + } +} + +impl Drop for SwapSplitIterator { + fn drop(&mut self) { + if let Some((origin, destination, tokens_target, tokens_timelocked_target)) = + self.swap_split_map.validate_successful_swap_split() + { + panic!( + "For at least one address, the SwapSplit operation was not fully performed. Origin: {}, destination: {}, tokens left: {}, timelocked tokens left: {}", + origin, destination, tokens_target, tokens_timelocked_target + ) + } + debug!( + "Number of basic outputs used for a SwapSplit (no timelock): {}", + self.num_swapped_basic + ); + debug!( + "Number of timelocked basic outputs used for a SwapSplit: {}", + self.num_swapped_timelocks + ); + debug!("Number of outputs created with splits: {}", self.num_splits); + } +} + +/// Iterator that modifies the amount of IOTA tokens for any output, scaling the +/// amount from micros to nanos. +struct ScaleIotaAmountIterator { + /// Iterator over `(OutputHeader, Output)` pairs. + outputs: I, + num_scaled_outputs: u64, +} + +impl ScaleIotaAmountIterator { + fn new(outputs: I) -> Self { + Self { + outputs, + num_scaled_outputs: 0, + } + } +} + +impl Iterator for ScaleIotaAmountIterator +where + I: Iterator>, +{ + type Item = I::Item; + + /// Get the next from the chained self.outputs iterator and always apply the + /// scaling (only an Output::Treasury kind is left out) + fn next(&mut self) -> Option { + let mut output = self.outputs.next()?; + if let Ok((_, inner)) = &mut output { + self.num_scaled_outputs += 1; + match inner { + Output::Basic(ref basic_output) => { + // Update amount + let mut builder = BasicOutputBuilder::from(basic_output).with_amount( + scale_amount_for_iota(basic_output.amount()) + .expect("should scale the amount for iota"), + ); + // Update amount in potential storage deposit return unlock condition + if let Some(sdr_uc) = basic_output + .unlock_conditions() + .get(StorageDepositReturnUnlockCondition::KIND) + { + let sdr_uc = sdr_uc.as_storage_deposit_return(); + builder = builder.replace_unlock_condition( + StorageDepositReturnUnlockCondition::new( + sdr_uc.return_address(), + scale_amount_for_iota(sdr_uc.amount()) + .expect("should scale the amount for iota"), + u64::MAX, + ) + .unwrap(), + ); + }; + *inner = builder + .finish() + .expect("failed to create basic output") + .into() + } + Output::Alias(ref alias_output) => { + *inner = AliasOutputBuilder::from(alias_output) + .with_amount( + scale_amount_for_iota(alias_output.amount()) + .expect("should scale the amount for iota"), + ) + .finish() + .expect("should be able to create an alias output") + .into() + } + Output::Foundry(ref foundry_output) => { + *inner = FoundryOutputBuilder::from(foundry_output) + .with_amount( + scale_amount_for_iota(foundry_output.amount()) + .expect("should scale the amount for iota"), + ) + .finish() + .expect("should be able to create a foundry output") + .into() + } + Output::Nft(ref nft_output) => { + // Update amount + let mut builder = NftOutputBuilder::from(nft_output).with_amount( + scale_amount_for_iota(nft_output.amount()) + .expect("should scale the amount for iota"), + ); + // Update amount in potential storage deposit return unlock condition + if let Some(sdr_uc) = nft_output + .unlock_conditions() + .get(StorageDepositReturnUnlockCondition::KIND) + { + let sdr_uc = sdr_uc.as_storage_deposit_return(); + builder = builder.replace_unlock_condition( + StorageDepositReturnUnlockCondition::new( + sdr_uc.return_address(), + scale_amount_for_iota(sdr_uc.amount()) + .expect("should scale the amount for iota"), + u64::MAX, + ) + .unwrap(), + ); + }; + *inner = builder + .finish() + .expect("should be able to create an nft output") + .into(); + } + Output::Treasury(_) => (), + } + } + Some(output) + } +} + +impl Drop for ScaleIotaAmountIterator { + fn drop(&mut self) { + debug!("Number of scaled outputs: {}", self.num_scaled_outputs); + } +} + +struct OutputHeaderWithBalance { + output_header: OutputHeader, + balance: u64, +} + +/// Filtering iterator that looks for vesting outputs that can be unlocked and +/// stores them during the iteration. At the end of the iteration it merges all +/// vesting outputs owned by a single address into a unique basic output. +struct UnlockedVestingIterator { + /// Iterator over `(OutputHeader, Output)` pairs. + outputs: I, + /// Stores aggregated balances for eligible addresses. + unlocked_address_balances: BTreeMap, + /// Timestamp used to evaluate timelock conditions. + snapshot_timestamp_s: u32, + /// Output picked to be merged + vesting_outputs: Vec, + num_vesting_outputs: u64, +} + +impl UnlockedVestingIterator { + fn new(outputs: I, snapshot_timestamp_s: u32) -> Self { + Self { + outputs, + unlocked_address_balances: Default::default(), + snapshot_timestamp_s, + vesting_outputs: Default::default(), + num_vesting_outputs: Default::default(), + } + } +} + +impl Iterator for UnlockedVestingIterator +where + I: Iterator>, +{ + type Item = I::Item; + + /// Get the next from the chained self.outputs iterator and apply the + /// processing only if the output is an unlocked vesting one + fn next(&mut self) -> Option { + for output in self.outputs.by_ref() { + if let Ok((header, inner)) = &output { + if let Some(address) = + get_address_if_vesting_output(header, inner, self.snapshot_timestamp_s) + { + self.vesting_outputs.push(header.output_id()); + self.unlocked_address_balances + .entry(address) + .and_modify(|x| x.balance += inner.amount()) + .or_insert(OutputHeaderWithBalance { + output_header: header.clone(), + balance: inner.amount(), + }); + continue; + } + } + return Some(output); + } + // Now that we are out of the loop we collect the processed outputs from the + // filters + let (address, output_header_with_balance) = self.unlocked_address_balances.pop_first()?; + self.num_vesting_outputs += 1; + // create a new basic output which holds the aggregated balance from + // unlocked vesting outputs for this address + let basic = BasicOutputBuilder::new_with_amount(output_header_with_balance.balance) + .add_unlock_condition(AddressUnlockCondition::new(address)) + .finish() + .expect("failed to create basic output"); + + Some(Ok((output_header_with_balance.output_header, basic.into()))) + } +} + +impl Drop for UnlockedVestingIterator { + fn drop(&mut self) { + debug!( + "Number of vesting outputs before merge: {}", + self.vesting_outputs.len() + ); + debug!( + "Number of vesting outputs after merging: {}", + self.num_vesting_outputs + ); + } +} + +/// Iterator that looks for basic outputs having a tag being the Participation +/// Tag and removes all features from the basic output. +struct ParticipationOutputIterator { + /// Iterator over `(OutputHeader, Output)` pairs. + outputs: I, + participation_outputs: Vec, +} + +impl ParticipationOutputIterator { + fn new(outputs: I) -> Self { + Self { + outputs, + participation_outputs: Default::default(), + } + } +} + +impl Iterator for ParticipationOutputIterator +where + I: Iterator>, +{ + type Item = I::Item; + + /// Get the next from the chained self.outputs iterator and apply the + /// processing only if the output has a participation tag + fn next(&mut self) -> Option { + let mut output = self.outputs.next()?; + if let Ok((header, inner)) = &mut output { + if is_participation_output(inner) { + self.participation_outputs.push(header.output_id()); + let basic_output = inner.as_basic(); + // replace the inner output + *inner = BasicOutputBuilder::from(basic_output) + .with_features( + vec![basic_output.features().get(SenderFeature::KIND).cloned()] + .into_iter() + .flatten(), + ) + .finish() + .expect("failed to create basic output") + .into() + } + } + Some(output) + } +} + +impl Drop for ParticipationOutputIterator { + fn drop(&mut self) { + debug!( + "Number of participation outputs: {}", + self.participation_outputs.len() + ); + debug!("Participation outputs: {:?}", self.participation_outputs); + } +} + +/// Extension trait that provides convenient methods for chaining and filtering +/// iterator operations. +/// +/// The iterators produced by this trait are designed to chain such that, +/// calling `next()` on the last iterator will recursively invoke `next()` on +/// the preceding iterators, maintaining the expected behavior. +trait IteratorExt: Iterator> + Sized { + fn perform_swap_split(self, swap_split_map: AddressSwapSplitMap) -> SwapSplitIterator { + SwapSplitIterator::new(self, swap_split_map) + } + + fn scale_iota_amount(self) -> ScaleIotaAmountIterator { + ScaleIotaAmountIterator::new(self) + } + + fn filter_unlocked_vesting_outputs( + self, + snapshot_timestamp_s: u32, + ) -> UnlockedVestingIterator { + UnlockedVestingIterator::new(self, snapshot_timestamp_s) + } + + fn filter_participation_outputs(self) -> ParticipationOutputIterator { + ParticipationOutputIterator::new(self) + } +} +impl>> IteratorExt for T {} + +/// Skip all outputs that are not basic or not vesting. For vesting (basic) +/// outputs, extract and return the address from their address unlock condition. +fn get_address_if_vesting_output( + header: &OutputHeader, + output: &Output, + snapshot_timestamp_s: u32, +) -> Option
{ + if !output.is_basic() || !is_vested_reward(header.output_id(), output.as_basic()) { + // if the output is not basic and a vested reward then skip + return None; + } + + output.unlock_conditions().and_then(|uc| { + if uc.is_time_locked(snapshot_timestamp_s) { + // if the output would still be time locked at snapshot_timestamp_s then skip + None + } else { + // return the address of a vested output that is or can be unlocked + uc.address().map(|a| *a.address()) + } + }) +} + +/// SwapSplit operation. Take a `basic_output` and split it until all targets +/// found in the `destinations` are meet. In the meantime, swap the address +/// unlock condition origin address with the destination address. Finally, if +/// the original `basic_output` has some remainder amount, then return it +/// (without swapping its address unlock condition). +fn swap_split_operation<'a>( + destinations: impl Iterator, + basic_output: &BasicOutput, +) -> (Option, Vec) { + let mut original_output_opt = None; + let mut split_outputs = vec![]; + let mut original_basic_output_remainder = basic_output.amount(); + + // if the addressUC's address is to swap, then it can have several + // destinations + for (destination, target) in destinations { + // break if the basic output was drained already + if original_basic_output_remainder == 0 { + break; + } + // we need to make sure that we split at most OUTPUT_INDEX_MAX - 1 times + debug_assert!( + split_outputs.len() < OUTPUT_INDEX_MAX as usize, + "Too many swap split operations to perform for a single output" + ); + // if the target for this destination is less than the basic output remainder, + // then use it to split the basic output and swap address; + // otherwise split and swap using the original_basic_output_remainder, and then + // break the loop. + let swap_split_amount = original_basic_output_remainder.min(*target); + split_outputs.push( + BasicOutputBuilder::from(basic_output) + .with_amount(swap_split_amount) + .replace_unlock_condition(AddressUnlockCondition::new(Ed25519Address::new( + destination.to_inner(), + ))) + .finish() + .expect("failed to create basic output during split") + .into(), + ); + *target -= swap_split_amount; + original_basic_output_remainder -= swap_split_amount; + } + + // if the basic output remainder is some, it means that all destinations are + // already covered; so the original basic output can be just kept with (maybe) + // an adjusted amount. + if original_basic_output_remainder > 0 { + original_output_opt = Some( + BasicOutputBuilder::from(basic_output) + .with_amount(original_basic_output_remainder) + .finish() + .expect("failed to create basic output") + .into(), + ); + } + (original_output_opt, split_outputs) +} + +/// Utility struct that defines the ordering between timelocked basic outputs. +/// It is required that the output is a basic outputs with timelock unlock +/// condition. +#[derive(PartialEq, Eq)] +struct TimelockOrderedOutput { + header: OutputHeader, + output: Output, +} + +impl TimelockOrderedOutput { + fn get_timestamp(&self) -> u32 { + self.output + .as_basic() + .unlock_conditions() + .timelock() + .unwrap() + .timestamp() + } +} + +impl Ord for TimelockOrderedOutput { + fn cmp(&self, other: &Self) -> Ordering { + self.get_timestamp() + .cmp(&other.get_timestamp()) + .then_with(|| self.header.output_id().cmp(&other.header.output_id())) + } +} +impl PartialOrd for TimelockOrderedOutput { + fn partial_cmp(&self, other: &Self) -> Option { + Some(self.cmp(other)) + } +} diff --git a/crates/iota-genesis-builder/src/stardust/test_outputs/alias_ownership.rs b/crates/iota-genesis-builder/src/stardust/test_outputs/alias_ownership.rs index 1f1f0620401..89168937e3b 100644 --- a/crates/iota-genesis-builder/src/stardust/test_outputs/alias_ownership.rs +++ b/crates/iota-genesis-builder/src/stardust/test_outputs/alias_ownership.rs @@ -180,7 +180,7 @@ fn random_foundry_output( } fn random_output_header(rng: &mut StdRng) -> OutputHeader { - OutputHeader::new_testing( + OutputHeader::new( rng.gen(), OutputIndex::new(rng.gen_range(OUTPUT_INDEX_RANGE)) .expect("range is guaranteed to be valid"), diff --git a/crates/iota-genesis-builder/src/stardust/test_outputs/delegator_outputs.rs b/crates/iota-genesis-builder/src/stardust/test_outputs/delegator_outputs.rs index ac9714fd80a..1084a4d33c3 100644 --- a/crates/iota-genesis-builder/src/stardust/test_outputs/delegator_outputs.rs +++ b/crates/iota-genesis-builder/src/stardust/test_outputs/delegator_outputs.rs @@ -30,7 +30,7 @@ pub(crate) fn new_simple_basic_output( address: Ed25519Address, rng: &mut StdRng, ) -> anyhow::Result<(OutputHeader, Output)> { - let output_header = OutputHeader::new_testing( + let output_header = OutputHeader::new( rng.gen::<[u8; 32]>(), random_output_index_with_rng(rng), [0; 32], @@ -59,7 +59,7 @@ pub(crate) fn new_vested_output( .copy_from_slice(&prefix_hex::decode::<[u8; 28]>(VESTED_REWARD_ID_PREFIX)?); transaction_id[28..32].copy_from_slice(&vested_index.to_le_bytes()); - let output_header = OutputHeader::new_testing( + let output_header = OutputHeader::new( transaction_id, random_output_index_with_rng(rng), [0; 32], diff --git a/crates/iota-genesis-builder/src/stardust/test_outputs/stardust_mix.rs b/crates/iota-genesis-builder/src/stardust/test_outputs/stardust_mix.rs index 1b55cfd2c57..63fb2e347e7 100644 --- a/crates/iota-genesis-builder/src/stardust/test_outputs/stardust_mix.rs +++ b/crates/iota-genesis-builder/src/stardust/test_outputs/stardust_mix.rs @@ -329,7 +329,7 @@ fn random_alias_foundry_native_token( fn finish_with_header(builder: impl Into, rng: &mut StdRng) -> (OutputHeader, Output) { ( - OutputHeader::new_testing( + OutputHeader::new( rng.gen::<[u8; 32]>(), random_output_index_with_rng(rng), [0; 32], diff --git a/crates/iota-genesis-builder/src/stardust/test_outputs/vesting_schedule_portfolio_mix.rs b/crates/iota-genesis-builder/src/stardust/test_outputs/vesting_schedule_portfolio_mix.rs index 3766af98425..05779e1ae93 100644 --- a/crates/iota-genesis-builder/src/stardust/test_outputs/vesting_schedule_portfolio_mix.rs +++ b/crates/iota-genesis-builder/src/stardust/test_outputs/vesting_schedule_portfolio_mix.rs @@ -73,7 +73,7 @@ pub(crate) async fn outputs( } fn random_output_header(rng: &mut StdRng) -> OutputHeader { - OutputHeader::new_testing( + OutputHeader::new( rng.gen(), OutputIndex::new(rng.gen_range(OUTPUT_INDEX_RANGE)) .expect("range is guaranteed to be valid"), diff --git a/crates/iota-genesis-builder/src/stardust/types/address_swap_split_map.rs b/crates/iota-genesis-builder/src/stardust/types/address_swap_split_map.rs new file mode 100644 index 00000000000..3ba7f80ca5c --- /dev/null +++ b/crates/iota-genesis-builder/src/stardust/types/address_swap_split_map.rs @@ -0,0 +1,171 @@ +// Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +use std::collections::HashMap; + +use iota_sdk::types::block::address::Address; +use iota_types::base_types::IotaAddress; + +type OriginAddress = Address; +type Destination = (IotaAddress, u64, u64); + +#[derive(Clone, Debug, Default)] +pub struct AddressSwapSplitDestinations { + destinations: Vec, +} + +impl AddressSwapSplitDestinations { + /// Iterate over mutable destinations filtered by `tokens_target > 0`. + pub fn iter_by_tokens_target_mut_filtered( + &mut self, + ) -> impl Iterator { + self.destinations + .iter_mut() + .filter_map(|(destination, tokens_target, _)| { + if *tokens_target > 0 { + Some((destination, tokens_target)) + } else { + None + } + }) + } + + /// Iterate over mutable destinations filtered by `tokens_timelocked_target + /// > 0`. + pub fn iter_by_tokens_timelocked_target_mut_filtered( + &mut self, + ) -> impl Iterator { + self.destinations + .iter_mut() + .filter_map(|(destination, _, tokens_timelocked_target)| { + if *tokens_timelocked_target > 0 { + Some((destination, tokens_timelocked_target)) + } else { + None + } + }) + } + + /// Returns true only if the destinations contains at least one + /// tokens_timelocked_target that is greater than 0. + pub fn contains_tokens_timelocked_target(&self) -> bool { + self.destinations + .iter() + .any(|&(_, _, tokens_timelocked_target)| tokens_timelocked_target > 0) + } +} + +impl<'a> IntoIterator for &'a AddressSwapSplitDestinations { + type Item = &'a Destination; + type IntoIter = std::slice::Iter<'a, Destination>; + + fn into_iter(self) -> Self::IntoIter { + self.destinations.iter() + } +} + +#[derive(Clone, Debug, Default)] +pub struct AddressSwapSplitMap { + map: HashMap, +} + +impl AddressSwapSplitMap { + /// If the `address` passed as input is present in the map, then return + /// a mutable reference to the destination, i.e., a tuple containing a + /// destination address, a tokens target and a timelocked tokens target. + pub fn get_destination_maybe_mut( + &mut self, + address: &OriginAddress, + ) -> Option<&mut AddressSwapSplitDestinations> { + self.map.get_mut(address) + } + + /// Check whether the map has all targets set to 0. Return the first + /// occurrence of an entry where one or both the two targets are greater + /// than zero. If none is found, then return None. + pub fn validate_successful_swap_split( + &self, + ) -> Option<(&OriginAddress, &IotaAddress, u64, u64)> { + for (origin, destinations) in self.map.iter() { + for (destination, tokens_target, tokens_timelocked_target) in destinations { + if *tokens_target > 0 || *tokens_timelocked_target > 0 { + return Some(( + origin, + destination, + *tokens_target, + *tokens_timelocked_target, + )); + } + } + } + None + } + + /// Get the map. + pub fn map(&self) -> &HashMap { + &self.map + } + + /// Initializes an [`AddressSwapSplitMap`] by reading address pairs from a + /// CSV file. + /// + /// The function expects the file to contain four columns: the origin + /// address (first column), the destination address (second column), the + /// tokens target (third column) and the timelocked tokens target + /// (fourth column). These are parsed into a [`HashMap`] that maps + /// origin addresses to tuples containing the destination address and + /// the two targets. + /// + /// # Example CSV File + /// ```csv + /// Origin,Destination,Tokens,TokensTimelocked + /// iota1qrukjnd6jhgwc0ls6dgt574sxuulcsmq5lnzhtv4jmlwkydhe2zvy69t7jj,0x1336d143de5eb55bcb069f55da5fc9f0c84e368022fd2bbe0125b1093b446313,107667149000,107667149000 + /// iota1qr4chj9jwhauvegqy40sdhj93mzmvc3mg9cmzlv2y6j8vpyxpvug2y6h5jd,0x83b5ed87bac715ecb09017a72d531ccc3c43bcb58edeb1ce383f1c46cfd79bec,388647312000,0 + /// ``` + /// + /// # Parameters + /// - `file_path`: The relative path to the CSV file containing the address + /// mappings. + /// + /// # Returns + /// - An [`AddressSwapSplitMap`] containing the parsed mappings. + /// + /// # Errors + /// - Returns an error if the file cannot be found, read, or parsed + /// correctly. + /// - Returns an error if the origin, destination addresses, or targets + /// cannot be parsed into. + pub fn from_csv(file_path: &str) -> Result { + let current_dir = std::env::current_dir()?; + let file_path = current_dir.join(file_path); + let mut reader = csv::ReaderBuilder::new().from_path(file_path)?; + let mut address_swap_split_map: AddressSwapSplitMap = Default::default(); + + let headers = reader.headers()?; + anyhow::ensure!( + headers.len() == 4 + && &headers[0] == "Origin" + && &headers[1] == "Destination" + && &headers[2] == "Tokens" + && &headers[3] == "TokensTimelocked", + "Invalid CSV headers" + ); + + for result in reader.records() { + let record = result?; + let origin = OriginAddress::try_from_bech32(&record[0])?; + let destination_address = record[1].parse()?; + let tokens_target = record[2].parse()?; + let tokens_timelocked_target = record[3].parse()?; + + address_swap_split_map + .map + .entry(origin) + .or_default() + .destinations + .push((destination_address, tokens_target, tokens_timelocked_target)); + } + + Ok(address_swap_split_map) + } +} diff --git a/crates/iota-genesis-builder/src/stardust/types/mod.rs b/crates/iota-genesis-builder/src/stardust/types/mod.rs index 49ea9368cf5..89cf2b9264a 100644 --- a/crates/iota-genesis-builder/src/stardust/types/mod.rs +++ b/crates/iota-genesis-builder/src/stardust/types/mod.rs @@ -2,6 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 pub mod address_swap_map; +pub mod address_swap_split_map; pub mod output_header; pub mod output_index; pub mod snapshot; diff --git a/crates/iota-genesis-builder/src/stardust/types/output_header.rs b/crates/iota-genesis-builder/src/stardust/types/output_header.rs index ae6de6eb270..3c0689af997 100644 --- a/crates/iota-genesis-builder/src/stardust/types/output_header.rs +++ b/crates/iota-genesis-builder/src/stardust/types/output_header.rs @@ -13,7 +13,7 @@ use crate::stardust::types::output_index::OutputIndex; /// The header of an [`Output`](iota_sdk::types::block::output::Output) in the /// snapshot -#[derive(Debug, Clone, Packable)] +#[derive(Debug, Clone, Packable, PartialEq, Eq)] pub struct OutputHeader { output_id: OutputId, block_id: BlockId, @@ -56,8 +56,8 @@ impl OutputHeader { self.length } - /// Creates a new OutputHeader for testing. - pub fn new_testing( + /// Creates a new OutputHeader + pub fn new( transaction_id_bytes: [u8; 32], output_index: OutputIndex, block_id_bytes: [u8; 32], diff --git a/crates/iota-graphql-e2e-tests/Cargo.toml b/crates/iota-graphql-e2e-tests/Cargo.toml index de5796645cb..e912872c3ec 100644 --- a/crates/iota-graphql-e2e-tests/Cargo.toml +++ b/crates/iota-graphql-e2e-tests/Cargo.toml @@ -5,7 +5,7 @@ authors = ["IOTA Foundation "] edition = "2021" license = "Apache-2.0" publish = false -description = "End to end tests for Iota GraphQL" +description = "End to end tests for IOTA GraphQL" [lints] workspace = true diff --git a/crates/iota-graphql-e2e-tests/README.md b/crates/iota-graphql-e2e-tests/README.md index a0001d1c739..71d3660615b 100644 --- a/crates/iota-graphql-e2e-tests/README.md +++ b/crates/iota-graphql-e2e-tests/README.md @@ -19,7 +19,7 @@ It is recommended that the database server is started in a docker container. ## Using `docker compose` ```sh -$ POSTGRES_USER=postgres POSTGRES_DB=postgres POSTGRES_PASSWORD=postgrespw POSTGRES_INITDB_ARGS="-U postgres" docker compose -f docker/pg-services-local/docker-compose.yaml up -d postgres +$ POSTGRES_USER=postgres POSTGRES_DB=postgres POSTGRES_PASSWORD=postgrespw POSTGRES_INITDB_ARGS="-U postgres" docker compose -f dev-tools/pg-services-local/docker-compose.yaml up -d postgres ``` ## Using `docker` diff --git a/crates/iota-graphql-e2e-tests/tests/available_range/available_range.exp b/crates/iota-graphql-e2e-tests/tests/available_range/available_range.exp index 6dfbb9b815e..9b7c31b39b0 100644 --- a/crates/iota-graphql-e2e-tests/tests/available_range/available_range.exp +++ b/crates/iota-graphql-e2e-tests/tests/available_range/available_range.exp @@ -6,20 +6,20 @@ Response: { "data": { "availableRange": { "first": { - "digest": "4ELBAJ4AW3LXSgsEoXn525rFUdvtAPNhdavRcGaFqNBr", + "digest": "Cg9T9D1hd7CfrbmtSnPNTtiaa4tXEmafknyZrSoLRqwM", "sequenceNumber": 0 }, "last": { - "digest": "4ELBAJ4AW3LXSgsEoXn525rFUdvtAPNhdavRcGaFqNBr", + "digest": "Cg9T9D1hd7CfrbmtSnPNTtiaa4tXEmafknyZrSoLRqwM", "sequenceNumber": 0 } }, "first": { - "digest": "4ELBAJ4AW3LXSgsEoXn525rFUdvtAPNhdavRcGaFqNBr", + "digest": "Cg9T9D1hd7CfrbmtSnPNTtiaa4tXEmafknyZrSoLRqwM", "sequenceNumber": 0 }, "last": { - "digest": "4ELBAJ4AW3LXSgsEoXn525rFUdvtAPNhdavRcGaFqNBr", + "digest": "Cg9T9D1hd7CfrbmtSnPNTtiaa4tXEmafknyZrSoLRqwM", "sequenceNumber": 0 } } @@ -39,20 +39,20 @@ Response: { "data": { "availableRange": { "first": { - "digest": "4ELBAJ4AW3LXSgsEoXn525rFUdvtAPNhdavRcGaFqNBr", + "digest": "Cg9T9D1hd7CfrbmtSnPNTtiaa4tXEmafknyZrSoLRqwM", "sequenceNumber": 0 }, "last": { - "digest": "6rszwvzRELvaUnWaphcdzP4fd7Q3uhbGYa2sUHkxw6p3", + "digest": "2um6TfiJxKGVxPVdDuvuN1ifqNtTgaP7n6mCSpQnBpbX", "sequenceNumber": 2 } }, "first": { - "digest": "4ELBAJ4AW3LXSgsEoXn525rFUdvtAPNhdavRcGaFqNBr", + "digest": "Cg9T9D1hd7CfrbmtSnPNTtiaa4tXEmafknyZrSoLRqwM", "sequenceNumber": 0 }, "last": { - "digest": "6rszwvzRELvaUnWaphcdzP4fd7Q3uhbGYa2sUHkxw6p3", + "digest": "2um6TfiJxKGVxPVdDuvuN1ifqNtTgaP7n6mCSpQnBpbX", "sequenceNumber": 2 } } diff --git a/crates/iota-graphql-e2e-tests/tests/available_range/available_range.move b/crates/iota-graphql-e2e-tests/tests/available_range/available_range.move index a88e1a9dde9..59a5ee4f030 100644 --- a/crates/iota-graphql-e2e-tests/tests/available_range/available_range.move +++ b/crates/iota-graphql-e2e-tests/tests/available_range/available_range.move @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -//# init --protocol-version 1 --simulator +//# init --protocol-version 3 --simulator //# run-graphql { diff --git a/crates/iota-graphql-e2e-tests/tests/call/checkpoint_connection_pagination.move b/crates/iota-graphql-e2e-tests/tests/call/checkpoint_connection_pagination.move index ef951e1de3a..558a404c3cd 100644 --- a/crates/iota-graphql-e2e-tests/tests/call/checkpoint_connection_pagination.move +++ b/crates/iota-graphql-e2e-tests/tests/call/checkpoint_connection_pagination.move @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -//# init --protocol-version 1 --addresses Test=0x0 --simulator +//# init --protocol-version 3 --addresses Test=0x0 --simulator // Test cursor connection pagination logic // The implementation privileges `after`, `before`, `first`, and `last` in that order. diff --git a/crates/iota-graphql-e2e-tests/tests/call/coin_metadata.move b/crates/iota-graphql-e2e-tests/tests/call/coin_metadata.move index 9564caafec2..251b2a67c16 100644 --- a/crates/iota-graphql-e2e-tests/tests/call/coin_metadata.move +++ b/crates/iota-graphql-e2e-tests/tests/call/coin_metadata.move @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -//# init --protocol-version 1 --addresses test=0x0 --accounts A --simulator +//# init --protocol-version 3 --addresses test=0x0 --accounts A --simulator //# publish --sender A module test::fake { diff --git a/crates/iota-graphql-e2e-tests/tests/call/dynamic_fields.exp b/crates/iota-graphql-e2e-tests/tests/call/dynamic_fields.exp index 4ea401d7a3f..d1187a2d134 100644 --- a/crates/iota-graphql-e2e-tests/tests/call/dynamic_fields.exp +++ b/crates/iota-graphql-e2e-tests/tests/call/dynamic_fields.exp @@ -41,12 +41,12 @@ Response: { { "name": { "type": { - "repr": "u64" + "repr": "vector" }, "data": { - "Number": "0" + "Vector": [] }, - "bcs": "AAAAAAAAAAA=" + "bcs": "AA==" }, "value": { "__typename": "MoveValue" @@ -55,15 +55,15 @@ Response: { { "name": { "type": { - "repr": "vector" + "repr": "u64" }, "data": { - "Vector": [] + "Number": "0" }, - "bcs": "AA==" + "bcs": "AAAAAAAAAAA=" }, "value": { - "__typename": "MoveValue" + "__typename": "MoveObject" } }, { @@ -91,7 +91,7 @@ Response: { "bcs": "AAAAAAAAAAA=" }, "value": { - "__typename": "MoveObject" + "__typename": "MoveValue" } } ] @@ -121,12 +121,12 @@ Response: { { "name": { "type": { - "repr": "u64" + "repr": "vector" }, "data": { - "Number": "0" + "Vector": [] }, - "bcs": "AAAAAAAAAAA=" + "bcs": "AA==" }, "value": { "__typename": "MoveValue" @@ -135,15 +135,15 @@ Response: { { "name": { "type": { - "repr": "vector" + "repr": "u64" }, "data": { - "Vector": [] + "Number": "0" }, - "bcs": "AA==" + "bcs": "AAAAAAAAAAA=" }, "value": { - "__typename": "MoveValue" + "__typename": "MoveObject" } }, { @@ -171,7 +171,7 @@ Response: { "bcs": "AAAAAAAAAAA=" }, "value": { - "__typename": "MoveObject" + "__typename": "MoveValue" } } ] @@ -190,17 +190,17 @@ Response: { { "name": { "type": { - "repr": "u64" + "repr": "vector" }, "data": { - "Number": "0" + "Vector": [] }, - "bcs": "AAAAAAAAAAA=" + "bcs": "AA==" }, "value": { - "bcs": "AAAAAAAAAAA=", + "bcs": "AQAAAAAAAAA=", "data": { - "Number": "0" + "Number": "1" }, "__typename": "MoveValue" } @@ -208,19 +208,15 @@ Response: { { "name": { "type": { - "repr": "vector" + "repr": "u64" }, "data": { - "Vector": [] + "Number": "0" }, - "bcs": "AA==" + "bcs": "AAAAAAAAAAA=" }, "value": { - "bcs": "AQAAAAAAAAA=", - "data": { - "Number": "1" - }, - "__typename": "MoveValue" + "__typename": "MoveObject" } }, { @@ -252,7 +248,11 @@ Response: { "bcs": "AAAAAAAAAAA=" }, "value": { - "__typename": "MoveObject" + "bcs": "AAAAAAAAAAA=", + "data": { + "Number": "0" + }, + "__typename": "MoveValue" } } ] diff --git a/crates/iota-graphql-e2e-tests/tests/call/dynamic_fields.move b/crates/iota-graphql-e2e-tests/tests/call/dynamic_fields.move index 8942d4af172..45db0a290b7 100644 --- a/crates/iota-graphql-e2e-tests/tests/call/dynamic_fields.move +++ b/crates/iota-graphql-e2e-tests/tests/call/dynamic_fields.move @@ -9,7 +9,7 @@ // This test also demonstrates why we need separate dynamicField and dynamicObjectField APIs. // It is possible for a dynamic field and a dynamic object field to share the same name lookup. -//# init --protocol-version 1 --addresses Test=0x0 --accounts A --simulator +//# init --protocol-version 3 --addresses Test=0x0 --accounts A --simulator //# publish module Test::m { diff --git a/crates/iota-graphql-e2e-tests/tests/call/owned_objects.move b/crates/iota-graphql-e2e-tests/tests/call/owned_objects.move index 98090a2a635..c48cfd43b8a 100644 --- a/crates/iota-graphql-e2e-tests/tests/call/owned_objects.move +++ b/crates/iota-graphql-e2e-tests/tests/call/owned_objects.move @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -//# init --protocol-version 1 --addresses Test=0x0 A=0x42 --simulator +//# init --protocol-version 3 --addresses Test=0x0 A=0x42 --simulator // Tests objects on address, object, and owner. // diff --git a/crates/iota-graphql-e2e-tests/tests/call/simple.exp b/crates/iota-graphql-e2e-tests/tests/call/simple.exp index 732d92b4bd4..4f13efa33a6 100644 --- a/crates/iota-graphql-e2e-tests/tests/call/simple.exp +++ b/crates/iota-graphql-e2e-tests/tests/call/simple.exp @@ -25,14 +25,18 @@ task 4, line 32: //# view-object 0,0 Owner: Account Address ( validator_0 ) Version: 1 -Contents: iota::coin::Coin { +Contents: iota_system::staking_pool::StakedIota { id: iota::object::UID { id: iota::object::ID { bytes: fake(0,0), }, }, - balance: iota::balance::Balance { - value: 300000000000000u64, + pool_id: iota::object::ID { + bytes: _, + }, + stake_activation_epoch: 0u64, + principal: iota::balance::Balance { + value: 1500000000000000u64, }, } @@ -77,7 +81,7 @@ Epoch advanced: 5 task 10, line 44: //# view-checkpoint -CheckpointSummary { epoch: 5, seq: 10, content_digest: Ee6ZUSAsovYRwYFDNkWyii9fVgYaAmL9kcdgDwnDQ5if, +CheckpointSummary { epoch: 5, seq: 10, content_digest: CL93M1EZvQpyaKNGyzktdDemHqDsryHhnB2ccsBEGbNN, epoch_rolling_gas_cost_summary: GasCostSummary { computation_cost: 0, computation_cost_burned: 0, storage_cost: 0, storage_rebate: 0, non_refundable_storage_fee: 0 }} task 11, lines 46-51: @@ -114,11 +118,11 @@ task 15, lines 64-69: Headers: { "content-type": "application/json", "content-length": "157", - "x-iota-rpc-version": "0.8.0-testing-no-sha", + "x-iota-rpc-version": "0.9.0-testing-no-sha", "vary": "origin, access-control-request-method, access-control-request-headers", "access-control-allow-origin": "*", } -Service version: 0.8.0-testing-no-sha +Service version: 0.9.0-testing-no-sha Response: { "data": { "checkpoint": { @@ -155,8 +159,8 @@ Response: { "edges": [ { "node": { - "address": "0xeb65a9b4c043abdf3e0fefa3047fb5ea8ecb9d0239477624d1fd55d67d229891", - "digest": "GpfNenBbHNc3zUKfsAGEkiDsryUtvSSDN3k55eAAKsVv", + "address": "0xf5b2015775703e52d984852ad314d54d05b91c04caaa4202da5e36da30e54612", + "digest": "ELFhMCtdYyZbchZ1imeFxcZux4ZDkF5uGtJaXxs23epn", "owner": { "__typename": "AddressOwner" } @@ -182,8 +186,8 @@ Response: { "edges": [ { "node": { - "address": "0xeb65a9b4c043abdf3e0fefa3047fb5ea8ecb9d0239477624d1fd55d67d229891", - "digest": "GpfNenBbHNc3zUKfsAGEkiDsryUtvSSDN3k55eAAKsVv", + "address": "0xf5b2015775703e52d984852ad314d54d05b91c04caaa4202da5e36da30e54612", + "digest": "ELFhMCtdYyZbchZ1imeFxcZux4ZDkF5uGtJaXxs23epn", "owner": { "__typename": "AddressOwner" } @@ -197,8 +201,8 @@ Response: { "edges": [ { "node": { - "address": "0x0133ca00247f984c7280ea2aa1dac2630055ced0d5080825a0d9cdddf523f4f6", - "digest": "7Ye4pTNg8MB1KWaRyz1cT4WdiNKB3MxaMJ1tgxgDbkfS", + "address": "0x1e1bfe85b16cc0699b1d953bb3e9a1ff8c729e0fab4a4fecf9a642ba1ff76473", + "digest": "CFRoehNgzop1Hy7eauzeyXht6dK3GNJ7gCrzp76pHxGx", "owner": { "__typename": "AddressOwner" } @@ -206,8 +210,8 @@ Response: { }, { "node": { - "address": "0x0ef04a70a5215989129b276c3ada1b43a2772169b1db5e157b40743e1ecac0ad", - "digest": "A1Gp7sqj3AeNUYBq8SScjGZJv2Hp9cuvJ1W4V7KZswDy", + "address": "0x5897aac1e95a981e9bd3a7a9bbf0ebbd2cc78cbb0bc594458715e679c84097dc", + "digest": "BedWH4HtkS9dWjFpAsLBM4dcH8mLwKq9xQBMUqxcE23x", "owner": { "__typename": "AddressOwner" } @@ -215,8 +219,8 @@ Response: { }, { "node": { - "address": "0x26bf0f03edd09bb3f862e13cec014d17c26dd739d2563d9c704aa8d206301df2", - "digest": "9LoSY4zTcsU3iZkaXK3vreVgQnNFBmuuTmxhbHXGoTju", + "address": "0x72e3c78b1a7949e55e291745f3e44c423fd6dcddeb00012dfa81b994647c552d", + "digest": "Do5wuaRiJWP2UyqtCXZX1xMaeu6fPCrDAFCyxfpJTWvw", "owner": { "__typename": "AddressOwner" } @@ -224,8 +228,8 @@ Response: { }, { "node": { - "address": "0x3442446f02377d1025b211e51564e4f1c9a46845ccad733beeb06180d3f66c31", - "digest": "BAdieXDoeWexinDjhx69GEu3cKKiXc7XeEZg21cvymTp", + "address": "0x8b58506a0c77bbc2d7ddf7183c02b88318972bdce3e1f0e122e4511e4b4b7696", + "digest": "A2s8G7x2CK6p3Pt5NU29amt5DEP7xL4hpukWnr4jsfSa", "owner": { "__typename": "AddressOwner" } @@ -233,8 +237,8 @@ Response: { }, { "node": { - "address": "0x3c88cad5799a8da0467b8456a7429a97e7c141cfcf25f02faf51aa8cb4840461", - "digest": "Bg4vTzDaxxRmzHqKjRfv895zdc85Hv27xVu9ErR1Utsi", + "address": "0x9448ced828b28e01e6ecea8827a5476c3ea65dda6384c2d2bad2427ea3848b5d", + "digest": "4dh8DYxwoqstXF4nrsUqW6jKgourMiaUxqNHtAWWVL8H", "owner": { "__typename": "AddressOwner" } @@ -242,8 +246,8 @@ Response: { }, { "node": { - "address": "0x4bf4927b5491f5611d4cb83ada18d95c1bf6cc73320a5aa10b521e74a62016d2", - "digest": "mVvbS2vkuQrnRW1FsBjXjpNSdR92fJiRXXyUNdnmb67", + "address": "0x954705871e318ba8de121943084b47a25d42930d7471841971d73402e1e067a5", + "digest": "HHbxAHGH5MApVmZ5howtXkxhEbb7mruqZftcUZBCYX5G", "owner": { "__typename": "AddressOwner" } @@ -251,8 +255,8 @@ Response: { }, { "node": { - "address": "0x51e8ad8999fd29749b8afed87b965adbd781deb08b2f5325e4cf4e5528e17a7f", - "digest": "GgbrysrMW9XnKr2MvsxenrnShDgZ47J4adpwcnL23bdG", + "address": "0xad4386af8fc645ceeb78057b77b2bdc398fde74ba9f31458b3e4c0a381cd9ba4", + "digest": "5WmaWbEeGMqRuMf9icBdjMwdLk59huNsDXREixDNhgmm", "owner": { "__typename": "AddressOwner" } @@ -260,8 +264,8 @@ Response: { }, { "node": { - "address": "0x6139a8d91e9662934040407da8832dabd0f1b4e8ed9a79a6f0075fff7477e1f3", - "digest": "BtL1usVLMKgswweuB6wv7bddgVb4pV1ASmNEEvgiPcB1", + "address": "0xb0027d9b634e7d91f66eff316a097c92ae54ccc9a4f5081b8d5c076c6c0de10b", + "digest": "49fJ1Prd9C7WkLQXKW8C7catXr1pzvvX4NavA4utgcT2", "owner": { "__typename": "AddressOwner" } @@ -269,8 +273,8 @@ Response: { }, { "node": { - "address": "0x7d569ebee60b485b12152a96d76cc7ed6ad521146ad4bd3fd62d12e4c2cae76b", - "digest": "P1Me6uRFcWqjHeNx41oAa4nVQYmYpYpwUk67vd8osjZ", + "address": "0xbe31de2cc7c8fa48810819cdb3f5373451716cb81c16455974c8c2f6a8ef709a", + "digest": "BDyCwG2RwYmw4oM8WNdPoG8f8mD49cwuFx3Qy1HRd3qY", "owner": { "__typename": "AddressOwner" } @@ -278,8 +282,8 @@ Response: { }, { "node": { - "address": "0x847c914d647e7387d7cea4db5ad8fefeffe66773635804a991dfd4385fab6a97", - "digest": "J5mrwkf2RT8qVNjyg9abkJMQWXZEu8PKphBAkPSG3REF", + "address": "0xd70ac75a9489aa0a673a8f8ccd5d4e3e84ade6cf9d2c44d8ba1ce5acb042e02b", + "digest": "FXu6jYwudcV3k6eJa2gwZi5merEWdV2qmgrUKasvrJ5k", "owner": { "__typename": "AddressOwner" } @@ -287,8 +291,8 @@ Response: { }, { "node": { - "address": "0xa79cc544021a721176cdc4497728ec35a5311b8ff0aa293a5d29c0d32cb56056", - "digest": "DU399Yt1piD6iDhMYJ4kywMaorf3rTdW1zUsE7bsB7nX", + "address": "0xd98228affe398ab3bc22286d6b7b11da1442f113d0f2c298a7548c72c8483657", + "digest": "ESfkPLfitLBVAB9u6TjaNuRZfrGHrJvxtkouuJNuZtoL", "owner": { "__typename": "AddressOwner" } @@ -296,8 +300,8 @@ Response: { }, { "node": { - "address": "0xb21c0b03871456040643740e238d03bde38de240d7b17055f4670777a19f07b8", - "digest": "H6FaahQNYfKavippZbge7xHzox29vRPqAaCMuUWnYmCz", + "address": "0xfba59abaf5940f30567b53f21a580203b3e5766f51cbeeab8f15de918bf14fb1", + "digest": "HeM2fifov6dm5EBGLSnBmvwXQZGb8dfwJr8fiWQNNRxH", "owner": { "__typename": "AddressOwner" } @@ -375,7 +379,7 @@ Response: { "data": { "serviceConfig": { "availableVersions": [ - "0.8" + "0.9" ] } } diff --git a/crates/iota-graphql-e2e-tests/tests/call/simple.move b/crates/iota-graphql-e2e-tests/tests/call/simple.move index 91dee3fe9a5..ef6aa861856 100644 --- a/crates/iota-graphql-e2e-tests/tests/call/simple.move +++ b/crates/iota-graphql-e2e-tests/tests/call/simple.move @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -//# init --protocol-version 1 --addresses Test=0x0 A=0x42 --simulator --custom-validator-account --reference-gas-price 234 --default-gas-price 1000 +//# init --protocol-version 3 --addresses Test=0x0 A=0x42 --simulator --custom-validator-account --reference-gas-price 234 --default-gas-price 1000 //# publish module Test::M1 { diff --git a/crates/iota-graphql-e2e-tests/tests/consistency/balances.exp b/crates/iota-graphql-e2e-tests/tests/consistency/balances.exp index 98f98b2c9c6..2175bbadbdc 100644 --- a/crates/iota-graphql-e2e-tests/tests/consistency/balances.exp +++ b/crates/iota-graphql-e2e-tests/tests/consistency/balances.exp @@ -80,7 +80,7 @@ Response: { }, { "coinType": { - "repr": "0xbdf6cc52e18ba611bf235bf856f16c4c30f609167401546f52e08ba168429473::fake::FAKE" + "repr": "0xd083d89dc732b2e50099892c964ded83f62e4b19d28e1ca62f99ea8a003fd5cf::fake::FAKE" }, "coinObjectCount": 3, "totalBalance": "700" @@ -103,7 +103,7 @@ Response: { { "sender": { "fakeCoinBalance": { - "totalBalance": "500" + "totalBalance": "600" }, "allBalances": { "nodes": [ @@ -116,10 +116,10 @@ Response: { }, { "coinType": { - "repr": "0xbdf6cc52e18ba611bf235bf856f16c4c30f609167401546f52e08ba168429473::fake::FAKE" + "repr": "0xd083d89dc732b2e50099892c964ded83f62e4b19d28e1ca62f99ea8a003fd5cf::fake::FAKE" }, "coinObjectCount": 2, - "totalBalance": "500" + "totalBalance": "600" } ] } @@ -139,7 +139,7 @@ Response: { { "sender": { "fakeCoinBalance": { - "totalBalance": "200" + "totalBalance": "300" }, "allBalances": { "nodes": [ @@ -152,10 +152,10 @@ Response: { }, { "coinType": { - "repr": "0xbdf6cc52e18ba611bf235bf856f16c4c30f609167401546f52e08ba168429473::fake::FAKE" + "repr": "0xd083d89dc732b2e50099892c964ded83f62e4b19d28e1ca62f99ea8a003fd5cf::fake::FAKE" }, "coinObjectCount": 1, - "totalBalance": "200" + "totalBalance": "300" } ] } @@ -196,7 +196,7 @@ Response: { }, { "coinType": { - "repr": "0xbdf6cc52e18ba611bf235bf856f16c4c30f609167401546f52e08ba168429473::fake::FAKE" + "repr": "0xd083d89dc732b2e50099892c964ded83f62e4b19d28e1ca62f99ea8a003fd5cf::fake::FAKE" }, "coinObjectCount": 3, "totalBalance": "700" @@ -219,7 +219,7 @@ Response: { { "sender": { "fakeCoinBalance": { - "totalBalance": "500" + "totalBalance": "600" }, "allBalances": { "nodes": [ @@ -232,10 +232,10 @@ Response: { }, { "coinType": { - "repr": "0xbdf6cc52e18ba611bf235bf856f16c4c30f609167401546f52e08ba168429473::fake::FAKE" + "repr": "0xd083d89dc732b2e50099892c964ded83f62e4b19d28e1ca62f99ea8a003fd5cf::fake::FAKE" }, "coinObjectCount": 2, - "totalBalance": "500" + "totalBalance": "600" } ] } @@ -255,7 +255,7 @@ Response: { { "sender": { "fakeCoinBalance": { - "totalBalance": "200" + "totalBalance": "300" }, "allBalances": { "nodes": [ @@ -268,10 +268,10 @@ Response: { }, { "coinType": { - "repr": "0xbdf6cc52e18ba611bf235bf856f16c4c30f609167401546f52e08ba168429473::fake::FAKE" + "repr": "0xd083d89dc732b2e50099892c964ded83f62e4b19d28e1ca62f99ea8a003fd5cf::fake::FAKE" }, "coinObjectCount": 1, - "totalBalance": "200" + "totalBalance": "300" } ] } @@ -334,7 +334,7 @@ Response: { { "sender": { "fakeCoinBalance": { - "totalBalance": "500" + "totalBalance": "600" }, "allBalances": { "nodes": [ @@ -347,10 +347,10 @@ Response: { }, { "coinType": { - "repr": "0xbdf6cc52e18ba611bf235bf856f16c4c30f609167401546f52e08ba168429473::fake::FAKE" + "repr": "0xd083d89dc732b2e50099892c964ded83f62e4b19d28e1ca62f99ea8a003fd5cf::fake::FAKE" }, "coinObjectCount": 2, - "totalBalance": "500" + "totalBalance": "600" } ] } @@ -370,7 +370,7 @@ Response: { { "sender": { "fakeCoinBalance": { - "totalBalance": "200" + "totalBalance": "300" }, "allBalances": { "nodes": [ @@ -383,10 +383,10 @@ Response: { }, { "coinType": { - "repr": "0xbdf6cc52e18ba611bf235bf856f16c4c30f609167401546f52e08ba168429473::fake::FAKE" + "repr": "0xd083d89dc732b2e50099892c964ded83f62e4b19d28e1ca62f99ea8a003fd5cf::fake::FAKE" }, "coinObjectCount": 1, - "totalBalance": "200" + "totalBalance": "300" } ] } diff --git a/crates/iota-graphql-e2e-tests/tests/consistency/balances.move b/crates/iota-graphql-e2e-tests/tests/consistency/balances.move index a4d66327955..5cb4bc54786 100644 --- a/crates/iota-graphql-e2e-tests/tests/consistency/balances.move +++ b/crates/iota-graphql-e2e-tests/tests/consistency/balances.move @@ -15,7 +15,7 @@ // snapshot@[0, 4), first two transaction blocks are out of available range. // snapshot@[0, 6), all transaction blocks are out of available range. -//# init --protocol-version 1 --addresses P0=0x0 --accounts A B --simulator +//# init --protocol-version 3 --addresses P0=0x0 --accounts A B --simulator //# publish --sender A module P0::fake { diff --git a/crates/iota-graphql-e2e-tests/tests/consistency/checkpoints/transaction_blocks.exp b/crates/iota-graphql-e2e-tests/tests/consistency/checkpoints/transaction_blocks.exp index 674bc426868..c01d16c5d2c 100644 --- a/crates/iota-graphql-e2e-tests/tests/consistency/checkpoints/transaction_blocks.exp +++ b/crates/iota-graphql-e2e-tests/tests/consistency/checkpoints/transaction_blocks.exp @@ -94,12 +94,12 @@ Response: { { "cursor": "eyJjIjozLCJ0IjoyLCJpIjpmYWxzZX0", "node": { - "digest": "ywf9ak8rV9kDDx73zGH5vtTJkHmfxXHvLbSGhwAyxdM", + "digest": "7BPdUc3LpRmchBjPiSZ5Uju5yDZMbVhTQNYjDjmTXP5D", "sender": { "objects": { "edges": [ { - "cursor": "IOZ8ocIl02ZSSkdsdSrpt8BzDKmSCK2CZJpYvoPS+ilAAwAAAAAAAAA=" + "cursor": "IOgqlyHReHTY5weyEZOqIFQo+bdy3dX6B6ZXq8EnpHkGAwAAAAAAAAA=" } ] } @@ -109,12 +109,12 @@ Response: { { "cursor": "eyJjIjozLCJ0IjozLCJpIjpmYWxzZX0", "node": { - "digest": "25MhkStEmB44afcLcmtdA426Qbo6a5z6sJrURSfn4wSM", + "digest": "3s48BKV1NGNPV5VRKFsAJKWiyUiWDLVxguSERpo8qRTV", "sender": { "objects": { "edges": [ { - "cursor": "IOZ8ocIl02ZSSkdsdSrpt8BzDKmSCK2CZJpYvoPS+ilAAwAAAAAAAAA=" + "cursor": "IOgqlyHReHTY5weyEZOqIFQo+bdy3dX6B6ZXq8EnpHkGAwAAAAAAAAA=" } ] } @@ -124,12 +124,12 @@ Response: { { "cursor": "eyJjIjozLCJ0Ijo0LCJpIjpmYWxzZX0", "node": { - "digest": "Hutiw6GLNGCuRwMTZhxFW2CrYF6PYt2DomNMwtN1hLUo", + "digest": "6adEehTM2gxGKdumJXeKFwcaYhSB6RwGHbqg7Fv7JBmk", "sender": { "objects": { "edges": [ { - "cursor": "IOZ8ocIl02ZSSkdsdSrpt8BzDKmSCK2CZJpYvoPS+ilAAwAAAAAAAAA=" + "cursor": "IOgqlyHReHTY5weyEZOqIFQo+bdy3dX6B6ZXq8EnpHkGAwAAAAAAAAA=" } ] } @@ -139,12 +139,12 @@ Response: { { "cursor": "eyJjIjozLCJ0Ijo1LCJpIjpmYWxzZX0", "node": { - "digest": "4YeKsZh5nDLNfbNVT2GRwenv1gvaVdDde9BASgiBqkv8", + "digest": "E4Lt2ME1UNXjXnuVzF9CMyrHnhdQWbWRXj3myqpzZMrP", "sender": { "objects": { "edges": [ { - "cursor": "IOZ8ocIl02ZSSkdsdSrpt8BzDKmSCK2CZJpYvoPS+ilAAwAAAAAAAAA=" + "cursor": "IOgqlyHReHTY5weyEZOqIFQo+bdy3dX6B6ZXq8EnpHkGAwAAAAAAAAA=" } ] } @@ -161,12 +161,12 @@ Response: { { "cursor": "eyJjIjozLCJ0Ijo2LCJpIjpmYWxzZX0", "node": { - "digest": "EnghHbuhpcGuNpC1L2iqikieXAyHJUnanzg5urDmwgdz", + "digest": "DEYu7BBRqZyroncK1on7suMYzHy7GLJMoSsC6K8d14BR", "sender": { "objects": { "edges": [ { - "cursor": "IOZ8ocIl02ZSSkdsdSrpt8BzDKmSCK2CZJpYvoPS+ilAAwAAAAAAAAA=" + "cursor": "IOgqlyHReHTY5weyEZOqIFQo+bdy3dX6B6ZXq8EnpHkGAwAAAAAAAAA=" } ] } @@ -176,12 +176,12 @@ Response: { { "cursor": "eyJjIjozLCJ0Ijo3LCJpIjpmYWxzZX0", "node": { - "digest": "9G4gNmS2XYetMxBty65fKfx9iDRBetdpdNZuyK7oRd6c", + "digest": "32S1CoAgaGv7diFo2Bs7StnPB7Aakoma1JUT4k4cUpA7", "sender": { "objects": { "edges": [ { - "cursor": "IOZ8ocIl02ZSSkdsdSrpt8BzDKmSCK2CZJpYvoPS+ilAAwAAAAAAAAA=" + "cursor": "IOgqlyHReHTY5weyEZOqIFQo+bdy3dX6B6ZXq8EnpHkGAwAAAAAAAAA=" } ] } @@ -191,12 +191,12 @@ Response: { { "cursor": "eyJjIjozLCJ0Ijo4LCJpIjpmYWxzZX0", "node": { - "digest": "3ivB1ebWRpc4Si1vd8tsSY7XwaY7DrumxdS3KdXyZLVr", + "digest": "3gEc6E6ypnwUqRtVBcF3ZwXPEQJaisXDDaK21p4sZyM8", "sender": { "objects": { "edges": [ { - "cursor": "IOZ8ocIl02ZSSkdsdSrpt8BzDKmSCK2CZJpYvoPS+ilAAwAAAAAAAAA=" + "cursor": "IOgqlyHReHTY5weyEZOqIFQo+bdy3dX6B6ZXq8EnpHkGAwAAAAAAAAA=" } ] } @@ -213,12 +213,12 @@ Response: { { "cursor": "eyJjIjozLCJ0Ijo5LCJpIjpmYWxzZX0", "node": { - "digest": "6i5QZFKJgWGMArwRBVmd124V2mWv4BaiVVuoBxxfe3Mu", + "digest": "6RpeYVhE2pRoKHE4yP99YreciLexUN7WtKDG3qrRpTpE", "sender": { "objects": { "edges": [ { - "cursor": "IOZ8ocIl02ZSSkdsdSrpt8BzDKmSCK2CZJpYvoPS+ilAAwAAAAAAAAA=" + "cursor": "IOgqlyHReHTY5weyEZOqIFQo+bdy3dX6B6ZXq8EnpHkGAwAAAAAAAAA=" } ] } @@ -228,12 +228,12 @@ Response: { { "cursor": "eyJjIjozLCJ0IjoxMCwiaSI6ZmFsc2V9", "node": { - "digest": "ATX5C4Vryx6k3utG6b2ASv32hdXZ3dVkxVMHq8E6JbTE", + "digest": "HFhCBUpVFLKMXW3GT7of6iyZJCnMerKdLNRsZE9KVR5C", "sender": { "objects": { "edges": [ { - "cursor": "IOZ8ocIl02ZSSkdsdSrpt8BzDKmSCK2CZJpYvoPS+ilAAwAAAAAAAAA=" + "cursor": "IOgqlyHReHTY5weyEZOqIFQo+bdy3dX6B6ZXq8EnpHkGAwAAAAAAAAA=" } ] } diff --git a/crates/iota-graphql-e2e-tests/tests/consistency/checkpoints/transaction_blocks.move b/crates/iota-graphql-e2e-tests/tests/consistency/checkpoints/transaction_blocks.move index db7c4e7aa68..234a112659b 100644 --- a/crates/iota-graphql-e2e-tests/tests/consistency/checkpoints/transaction_blocks.move +++ b/crates/iota-graphql-e2e-tests/tests/consistency/checkpoints/transaction_blocks.move @@ -9,7 +9,7 @@ // 2 | 3 // 3 | 2 -//# init --protocol-version 1 --addresses Test=0x0 --accounts A B --simulator +//# init --protocol-version 3 --addresses Test=0x0 --accounts A B --simulator //# publish module Test::M1 { diff --git a/crates/iota-graphql-e2e-tests/tests/consistency/coins.exp b/crates/iota-graphql-e2e-tests/tests/consistency/coins.exp index f4477a71240..30a12ed6f1f 100644 --- a/crates/iota-graphql-e2e-tests/tests/consistency/coins.exp +++ b/crates/iota-graphql-e2e-tests/tests/consistency/coins.exp @@ -33,7 +33,7 @@ Response: { "queryCoinsAtLatest": { "edges": [ { - "cursor": "IFZ/ZyCVFYjCf7cignHQQS2MNn/eq+6kji+rGr7Di8pEAgAAAAAAAAA=", + "cursor": "IApniwe7Z2bjgyFQCb0B9CXz4dET8IjzA12i9bRMR7/CAgAAAAAAAAA=", "node": { "consistentStateForEachCoin": { "owner": { @@ -41,37 +41,37 @@ Response: { "coins": { "edges": [ { - "cursor": "IFZ/ZyCVFYjCf7cignHQQS2MNn/eq+6kji+rGr7Di8pEAgAAAAAAAAA=", + "cursor": "IApniwe7Z2bjgyFQCb0B9CXz4dET8IjzA12i9bRMR7/CAgAAAAAAAAA=", "node": { "contents": { "json": { - "id": "0x567f6720951588c27fb7228271d0412d8c367fdeabeea48e2fab1abec38bca44", + "id": "0x0a678b07bb6766e383215009bd01f425f3e1d113f088f3035da2f5b44c47bfc2", "balance": { - "value": "100100" + "value": "100200" } } } } }, { - "cursor": "IJ3CINFJKYLv+Em6UHIRANMjkBe7f+s1nKjlNzVkxaJsAgAAAAAAAAA=", + "cursor": "IKvInbcjeUbNXxlsZmlaw02PXhlQ+UuIUGdLXk9hi5gJAgAAAAAAAAA=", "node": { "contents": { "json": { - "id": "0x9dc220d1492982eff849ba50721100d3239017bb7feb359ca8e5373564c5a26c", + "id": "0xabc89db7237946cd5f196c66695ac34d8f5e1950f94b8850674b5e4f618b9809", "balance": { - "value": "200" + "value": "100" } } } } }, { - "cursor": "INqo/pVaj/aZbQ0uWk9SX8bQdKsDqH22Yewchi34U2E0AgAAAAAAAAA=", + "cursor": "IPSGBTtl6PcfooWqNntlxy0bgSKaP1vrFtTbW1TbPtLtAgAAAAAAAAA=", "node": { "contents": { "json": { - "id": "0xdaa8fe955a8ff6996d0d2e5a4f525fc6d074ab03a87db661ec1c862df8536134", + "id": "0xf486053b65e8f71fa285aa367b65c72d1b81229a3f5beb16d4db5b54db3ed2ed", "balance": { "value": "300" } @@ -85,16 +85,16 @@ Response: { }, "contents": { "json": { - "id": "0x567f6720951588c27fb7228271d0412d8c367fdeabeea48e2fab1abec38bca44", + "id": "0x0a678b07bb6766e383215009bd01f425f3e1d113f088f3035da2f5b44c47bfc2", "balance": { - "value": "100100" + "value": "100200" } } } } }, { - "cursor": "IJ3CINFJKYLv+Em6UHIRANMjkBe7f+s1nKjlNzVkxaJsAgAAAAAAAAA=", + "cursor": "IKvInbcjeUbNXxlsZmlaw02PXhlQ+UuIUGdLXk9hi5gJAgAAAAAAAAA=", "node": { "consistentStateForEachCoin": { "owner": { @@ -102,37 +102,37 @@ Response: { "coins": { "edges": [ { - "cursor": "IFZ/ZyCVFYjCf7cignHQQS2MNn/eq+6kji+rGr7Di8pEAgAAAAAAAAA=", + "cursor": "IApniwe7Z2bjgyFQCb0B9CXz4dET8IjzA12i9bRMR7/CAgAAAAAAAAA=", "node": { "contents": { "json": { - "id": "0x567f6720951588c27fb7228271d0412d8c367fdeabeea48e2fab1abec38bca44", + "id": "0x0a678b07bb6766e383215009bd01f425f3e1d113f088f3035da2f5b44c47bfc2", "balance": { - "value": "100100" + "value": "100200" } } } } }, { - "cursor": "IJ3CINFJKYLv+Em6UHIRANMjkBe7f+s1nKjlNzVkxaJsAgAAAAAAAAA=", + "cursor": "IKvInbcjeUbNXxlsZmlaw02PXhlQ+UuIUGdLXk9hi5gJAgAAAAAAAAA=", "node": { "contents": { "json": { - "id": "0x9dc220d1492982eff849ba50721100d3239017bb7feb359ca8e5373564c5a26c", + "id": "0xabc89db7237946cd5f196c66695ac34d8f5e1950f94b8850674b5e4f618b9809", "balance": { - "value": "200" + "value": "100" } } } } }, { - "cursor": "INqo/pVaj/aZbQ0uWk9SX8bQdKsDqH22Yewchi34U2E0AgAAAAAAAAA=", + "cursor": "IPSGBTtl6PcfooWqNntlxy0bgSKaP1vrFtTbW1TbPtLtAgAAAAAAAAA=", "node": { "contents": { "json": { - "id": "0xdaa8fe955a8ff6996d0d2e5a4f525fc6d074ab03a87db661ec1c862df8536134", + "id": "0xf486053b65e8f71fa285aa367b65c72d1b81229a3f5beb16d4db5b54db3ed2ed", "balance": { "value": "300" } @@ -146,16 +146,16 @@ Response: { }, "contents": { "json": { - "id": "0x9dc220d1492982eff849ba50721100d3239017bb7feb359ca8e5373564c5a26c", + "id": "0xabc89db7237946cd5f196c66695ac34d8f5e1950f94b8850674b5e4f618b9809", "balance": { - "value": "200" + "value": "100" } } } } }, { - "cursor": "INqo/pVaj/aZbQ0uWk9SX8bQdKsDqH22Yewchi34U2E0AgAAAAAAAAA=", + "cursor": "IPSGBTtl6PcfooWqNntlxy0bgSKaP1vrFtTbW1TbPtLtAgAAAAAAAAA=", "node": { "consistentStateForEachCoin": { "owner": { @@ -163,37 +163,37 @@ Response: { "coins": { "edges": [ { - "cursor": "IFZ/ZyCVFYjCf7cignHQQS2MNn/eq+6kji+rGr7Di8pEAgAAAAAAAAA=", + "cursor": "IApniwe7Z2bjgyFQCb0B9CXz4dET8IjzA12i9bRMR7/CAgAAAAAAAAA=", "node": { "contents": { "json": { - "id": "0x567f6720951588c27fb7228271d0412d8c367fdeabeea48e2fab1abec38bca44", + "id": "0x0a678b07bb6766e383215009bd01f425f3e1d113f088f3035da2f5b44c47bfc2", "balance": { - "value": "100100" + "value": "100200" } } } } }, { - "cursor": "IJ3CINFJKYLv+Em6UHIRANMjkBe7f+s1nKjlNzVkxaJsAgAAAAAAAAA=", + "cursor": "IKvInbcjeUbNXxlsZmlaw02PXhlQ+UuIUGdLXk9hi5gJAgAAAAAAAAA=", "node": { "contents": { "json": { - "id": "0x9dc220d1492982eff849ba50721100d3239017bb7feb359ca8e5373564c5a26c", + "id": "0xabc89db7237946cd5f196c66695ac34d8f5e1950f94b8850674b5e4f618b9809", "balance": { - "value": "200" + "value": "100" } } } } }, { - "cursor": "INqo/pVaj/aZbQ0uWk9SX8bQdKsDqH22Yewchi34U2E0AgAAAAAAAAA=", + "cursor": "IPSGBTtl6PcfooWqNntlxy0bgSKaP1vrFtTbW1TbPtLtAgAAAAAAAAA=", "node": { "contents": { "json": { - "id": "0xdaa8fe955a8ff6996d0d2e5a4f525fc6d074ab03a87db661ec1c862df8536134", + "id": "0xf486053b65e8f71fa285aa367b65c72d1b81229a3f5beb16d4db5b54db3ed2ed", "balance": { "value": "300" } @@ -207,7 +207,7 @@ Response: { }, "contents": { "json": { - "id": "0xdaa8fe955a8ff6996d0d2e5a4f525fc6d074ab03a87db661ec1c862df8536134", + "id": "0xf486053b65e8f71fa285aa367b65c72d1b81229a3f5beb16d4db5b54db3ed2ed", "balance": { "value": "300" } @@ -221,37 +221,37 @@ Response: { "coins": { "edges": [ { - "cursor": "IFZ/ZyCVFYjCf7cignHQQS2MNn/eq+6kji+rGr7Di8pEAgAAAAAAAAA=", + "cursor": "IApniwe7Z2bjgyFQCb0B9CXz4dET8IjzA12i9bRMR7/CAgAAAAAAAAA=", "node": { "contents": { "json": { - "id": "0x567f6720951588c27fb7228271d0412d8c367fdeabeea48e2fab1abec38bca44", + "id": "0x0a678b07bb6766e383215009bd01f425f3e1d113f088f3035da2f5b44c47bfc2", "balance": { - "value": "100100" + "value": "100200" } } } } }, { - "cursor": "IJ3CINFJKYLv+Em6UHIRANMjkBe7f+s1nKjlNzVkxaJsAgAAAAAAAAA=", + "cursor": "IKvInbcjeUbNXxlsZmlaw02PXhlQ+UuIUGdLXk9hi5gJAgAAAAAAAAA=", "node": { "contents": { "json": { - "id": "0x9dc220d1492982eff849ba50721100d3239017bb7feb359ca8e5373564c5a26c", + "id": "0xabc89db7237946cd5f196c66695ac34d8f5e1950f94b8850674b5e4f618b9809", "balance": { - "value": "200" + "value": "100" } } } } }, { - "cursor": "INqo/pVaj/aZbQ0uWk9SX8bQdKsDqH22Yewchi34U2E0AgAAAAAAAAA=", + "cursor": "IPSGBTtl6PcfooWqNntlxy0bgSKaP1vrFtTbW1TbPtLtAgAAAAAAAAA=", "node": { "contents": { "json": { - "id": "0xdaa8fe955a8ff6996d0d2e5a4f525fc6d074ab03a87db661ec1c862df8536134", + "id": "0xf486053b65e8f71fa285aa367b65c72d1b81229a3f5beb16d4db5b54db3ed2ed", "balance": { "value": "300" } @@ -272,7 +272,7 @@ Response: { "queryCoinsAtChkpt1": { "edges": [ { - "cursor": "IFZ/ZyCVFYjCf7cignHQQS2MNn/eq+6kji+rGr7Di8pEAQAAAAAAAAA=", + "cursor": "IApniwe7Z2bjgyFQCb0B9CXz4dET8IjzA12i9bRMR7/CAQAAAAAAAAA=", "node": { "consistentStateForEachCoin": { "owner": { @@ -280,37 +280,37 @@ Response: { "coins": { "edges": [ { - "cursor": "IFZ/ZyCVFYjCf7cignHQQS2MNn/eq+6kji+rGr7Di8pEAQAAAAAAAAA=", + "cursor": "IApniwe7Z2bjgyFQCb0B9CXz4dET8IjzA12i9bRMR7/CAQAAAAAAAAA=", "node": { "contents": { "json": { - "id": "0x567f6720951588c27fb7228271d0412d8c367fdeabeea48e2fab1abec38bca44", + "id": "0x0a678b07bb6766e383215009bd01f425f3e1d113f088f3035da2f5b44c47bfc2", "balance": { - "value": "100" + "value": "200" } } } } }, { - "cursor": "IJ3CINFJKYLv+Em6UHIRANMjkBe7f+s1nKjlNzVkxaJsAQAAAAAAAAA=", + "cursor": "IKvInbcjeUbNXxlsZmlaw02PXhlQ+UuIUGdLXk9hi5gJAQAAAAAAAAA=", "node": { "contents": { "json": { - "id": "0x9dc220d1492982eff849ba50721100d3239017bb7feb359ca8e5373564c5a26c", + "id": "0xabc89db7237946cd5f196c66695ac34d8f5e1950f94b8850674b5e4f618b9809", "balance": { - "value": "200" + "value": "100" } } } } }, { - "cursor": "INqo/pVaj/aZbQ0uWk9SX8bQdKsDqH22Yewchi34U2E0AQAAAAAAAAA=", + "cursor": "IPSGBTtl6PcfooWqNntlxy0bgSKaP1vrFtTbW1TbPtLtAQAAAAAAAAA=", "node": { "contents": { "json": { - "id": "0xdaa8fe955a8ff6996d0d2e5a4f525fc6d074ab03a87db661ec1c862df8536134", + "id": "0xf486053b65e8f71fa285aa367b65c72d1b81229a3f5beb16d4db5b54db3ed2ed", "balance": { "value": "300" } @@ -324,16 +324,16 @@ Response: { }, "contents": { "json": { - "id": "0x567f6720951588c27fb7228271d0412d8c367fdeabeea48e2fab1abec38bca44", + "id": "0x0a678b07bb6766e383215009bd01f425f3e1d113f088f3035da2f5b44c47bfc2", "balance": { - "value": "100" + "value": "200" } } } } }, { - "cursor": "IJ3CINFJKYLv+Em6UHIRANMjkBe7f+s1nKjlNzVkxaJsAQAAAAAAAAA=", + "cursor": "IKvInbcjeUbNXxlsZmlaw02PXhlQ+UuIUGdLXk9hi5gJAQAAAAAAAAA=", "node": { "consistentStateForEachCoin": { "owner": { @@ -341,37 +341,37 @@ Response: { "coins": { "edges": [ { - "cursor": "IFZ/ZyCVFYjCf7cignHQQS2MNn/eq+6kji+rGr7Di8pEAQAAAAAAAAA=", + "cursor": "IApniwe7Z2bjgyFQCb0B9CXz4dET8IjzA12i9bRMR7/CAQAAAAAAAAA=", "node": { "contents": { "json": { - "id": "0x567f6720951588c27fb7228271d0412d8c367fdeabeea48e2fab1abec38bca44", + "id": "0x0a678b07bb6766e383215009bd01f425f3e1d113f088f3035da2f5b44c47bfc2", "balance": { - "value": "100" + "value": "200" } } } } }, { - "cursor": "IJ3CINFJKYLv+Em6UHIRANMjkBe7f+s1nKjlNzVkxaJsAQAAAAAAAAA=", + "cursor": "IKvInbcjeUbNXxlsZmlaw02PXhlQ+UuIUGdLXk9hi5gJAQAAAAAAAAA=", "node": { "contents": { "json": { - "id": "0x9dc220d1492982eff849ba50721100d3239017bb7feb359ca8e5373564c5a26c", + "id": "0xabc89db7237946cd5f196c66695ac34d8f5e1950f94b8850674b5e4f618b9809", "balance": { - "value": "200" + "value": "100" } } } } }, { - "cursor": "INqo/pVaj/aZbQ0uWk9SX8bQdKsDqH22Yewchi34U2E0AQAAAAAAAAA=", + "cursor": "IPSGBTtl6PcfooWqNntlxy0bgSKaP1vrFtTbW1TbPtLtAQAAAAAAAAA=", "node": { "contents": { "json": { - "id": "0xdaa8fe955a8ff6996d0d2e5a4f525fc6d074ab03a87db661ec1c862df8536134", + "id": "0xf486053b65e8f71fa285aa367b65c72d1b81229a3f5beb16d4db5b54db3ed2ed", "balance": { "value": "300" } @@ -385,9 +385,9 @@ Response: { }, "contents": { "json": { - "id": "0x9dc220d1492982eff849ba50721100d3239017bb7feb359ca8e5373564c5a26c", + "id": "0xabc89db7237946cd5f196c66695ac34d8f5e1950f94b8850674b5e4f618b9809", "balance": { - "value": "200" + "value": "100" } } } @@ -399,26 +399,26 @@ Response: { "coins": { "edges": [ { - "cursor": "IFZ/ZyCVFYjCf7cignHQQS2MNn/eq+6kji+rGr7Di8pEAQAAAAAAAAA=", + "cursor": "IApniwe7Z2bjgyFQCb0B9CXz4dET8IjzA12i9bRMR7/CAQAAAAAAAAA=", "node": { "contents": { "json": { - "id": "0x567f6720951588c27fb7228271d0412d8c367fdeabeea48e2fab1abec38bca44", + "id": "0x0a678b07bb6766e383215009bd01f425f3e1d113f088f3035da2f5b44c47bfc2", "balance": { - "value": "100" + "value": "200" } } } } }, { - "cursor": "IJ3CINFJKYLv+Em6UHIRANMjkBe7f+s1nKjlNzVkxaJsAQAAAAAAAAA=", + "cursor": "IKvInbcjeUbNXxlsZmlaw02PXhlQ+UuIUGdLXk9hi5gJAQAAAAAAAAA=", "node": { "contents": { "json": { - "id": "0x9dc220d1492982eff849ba50721100d3239017bb7feb359ca8e5373564c5a26c", + "id": "0xabc89db7237946cd5f196c66695ac34d8f5e1950f94b8850674b5e4f618b9809", "balance": { - "value": "200" + "value": "100" } } } @@ -453,7 +453,7 @@ Response: { "queryCoins": { "edges": [ { - "cursor": "IFZ/ZyCVFYjCf7cignHQQS2MNn/eq+6kji+rGr7Di8pEAwAAAAAAAAA=", + "cursor": "IApniwe7Z2bjgyFQCb0B9CXz4dET8IjzA12i9bRMR7/CAwAAAAAAAAA=", "node": { "owner": { "owner": { @@ -461,13 +461,13 @@ Response: { "coins": { "edges": [ { - "cursor": "IFZ/ZyCVFYjCf7cignHQQS2MNn/eq+6kji+rGr7Di8pEAwAAAAAAAAA=", + "cursor": "IApniwe7Z2bjgyFQCb0B9CXz4dET8IjzA12i9bRMR7/CAwAAAAAAAAA=", "node": { "contents": { "json": { - "id": "0x567f6720951588c27fb7228271d0412d8c367fdeabeea48e2fab1abec38bca44", + "id": "0x0a678b07bb6766e383215009bd01f425f3e1d113f088f3035da2f5b44c47bfc2", "balance": { - "value": "100100" + "value": "100200" } } } @@ -479,16 +479,16 @@ Response: { }, "contents": { "json": { - "id": "0x567f6720951588c27fb7228271d0412d8c367fdeabeea48e2fab1abec38bca44", + "id": "0x0a678b07bb6766e383215009bd01f425f3e1d113f088f3035da2f5b44c47bfc2", "balance": { - "value": "100100" + "value": "100200" } } } } }, { - "cursor": "IJ3CINFJKYLv+Em6UHIRANMjkBe7f+s1nKjlNzVkxaJsAwAAAAAAAAA=", + "cursor": "IKvInbcjeUbNXxlsZmlaw02PXhlQ+UuIUGdLXk9hi5gJAwAAAAAAAAA=", "node": { "owner": { "owner": { @@ -496,24 +496,24 @@ Response: { "coins": { "edges": [ { - "cursor": "IJ3CINFJKYLv+Em6UHIRANMjkBe7f+s1nKjlNzVkxaJsAwAAAAAAAAA=", + "cursor": "IKvInbcjeUbNXxlsZmlaw02PXhlQ+UuIUGdLXk9hi5gJAwAAAAAAAAA=", "node": { "contents": { "json": { - "id": "0x9dc220d1492982eff849ba50721100d3239017bb7feb359ca8e5373564c5a26c", + "id": "0xabc89db7237946cd5f196c66695ac34d8f5e1950f94b8850674b5e4f618b9809", "balance": { - "value": "200" + "value": "100" } } } } }, { - "cursor": "INqo/pVaj/aZbQ0uWk9SX8bQdKsDqH22Yewchi34U2E0AwAAAAAAAAA=", + "cursor": "IPSGBTtl6PcfooWqNntlxy0bgSKaP1vrFtTbW1TbPtLtAwAAAAAAAAA=", "node": { "contents": { "json": { - "id": "0xdaa8fe955a8ff6996d0d2e5a4f525fc6d074ab03a87db661ec1c862df8536134", + "id": "0xf486053b65e8f71fa285aa367b65c72d1b81229a3f5beb16d4db5b54db3ed2ed", "balance": { "value": "300" } @@ -527,16 +527,16 @@ Response: { }, "contents": { "json": { - "id": "0x9dc220d1492982eff849ba50721100d3239017bb7feb359ca8e5373564c5a26c", + "id": "0xabc89db7237946cd5f196c66695ac34d8f5e1950f94b8850674b5e4f618b9809", "balance": { - "value": "200" + "value": "100" } } } } }, { - "cursor": "INqo/pVaj/aZbQ0uWk9SX8bQdKsDqH22Yewchi34U2E0AwAAAAAAAAA=", + "cursor": "IPSGBTtl6PcfooWqNntlxy0bgSKaP1vrFtTbW1TbPtLtAwAAAAAAAAA=", "node": { "owner": { "owner": { @@ -544,24 +544,24 @@ Response: { "coins": { "edges": [ { - "cursor": "IJ3CINFJKYLv+Em6UHIRANMjkBe7f+s1nKjlNzVkxaJsAwAAAAAAAAA=", + "cursor": "IKvInbcjeUbNXxlsZmlaw02PXhlQ+UuIUGdLXk9hi5gJAwAAAAAAAAA=", "node": { "contents": { "json": { - "id": "0x9dc220d1492982eff849ba50721100d3239017bb7feb359ca8e5373564c5a26c", + "id": "0xabc89db7237946cd5f196c66695ac34d8f5e1950f94b8850674b5e4f618b9809", "balance": { - "value": "200" + "value": "100" } } } } }, { - "cursor": "INqo/pVaj/aZbQ0uWk9SX8bQdKsDqH22Yewchi34U2E0AwAAAAAAAAA=", + "cursor": "IPSGBTtl6PcfooWqNntlxy0bgSKaP1vrFtTbW1TbPtLtAwAAAAAAAAA=", "node": { "contents": { "json": { - "id": "0xdaa8fe955a8ff6996d0d2e5a4f525fc6d074ab03a87db661ec1c862df8536134", + "id": "0xf486053b65e8f71fa285aa367b65c72d1b81229a3f5beb16d4db5b54db3ed2ed", "balance": { "value": "300" } @@ -575,7 +575,7 @@ Response: { }, "contents": { "json": { - "id": "0xdaa8fe955a8ff6996d0d2e5a4f525fc6d074ab03a87db661ec1c862df8536134", + "id": "0xf486053b65e8f71fa285aa367b65c72d1b81229a3f5beb16d4db5b54db3ed2ed", "balance": { "value": "300" } @@ -589,13 +589,13 @@ Response: { "coins": { "edges": [ { - "cursor": "IFZ/ZyCVFYjCf7cignHQQS2MNn/eq+6kji+rGr7Di8pEAwAAAAAAAAA=", + "cursor": "IApniwe7Z2bjgyFQCb0B9CXz4dET8IjzA12i9bRMR7/CAwAAAAAAAAA=", "node": { "contents": { "json": { - "id": "0x567f6720951588c27fb7228271d0412d8c367fdeabeea48e2fab1abec38bca44", + "id": "0x0a678b07bb6766e383215009bd01f425f3e1d113f088f3035da2f5b44c47bfc2", "balance": { - "value": "100100" + "value": "100200" } } } @@ -608,24 +608,24 @@ Response: { "coins": { "edges": [ { - "cursor": "IJ3CINFJKYLv+Em6UHIRANMjkBe7f+s1nKjlNzVkxaJsAwAAAAAAAAA=", + "cursor": "IKvInbcjeUbNXxlsZmlaw02PXhlQ+UuIUGdLXk9hi5gJAwAAAAAAAAA=", "node": { "contents": { "json": { - "id": "0x9dc220d1492982eff849ba50721100d3239017bb7feb359ca8e5373564c5a26c", + "id": "0xabc89db7237946cd5f196c66695ac34d8f5e1950f94b8850674b5e4f618b9809", "balance": { - "value": "200" + "value": "100" } } } } }, { - "cursor": "INqo/pVaj/aZbQ0uWk9SX8bQdKsDqH22Yewchi34U2E0AwAAAAAAAAA=", + "cursor": "IPSGBTtl6PcfooWqNntlxy0bgSKaP1vrFtTbW1TbPtLtAwAAAAAAAAA=", "node": { "contents": { "json": { - "id": "0xdaa8fe955a8ff6996d0d2e5a4f525fc6d074ab03a87db661ec1c862df8536134", + "id": "0xf486053b65e8f71fa285aa367b65c72d1b81229a3f5beb16d4db5b54db3ed2ed", "balance": { "value": "300" } @@ -658,7 +658,7 @@ Response: { "queryCoinsAtChkpt1BeforeSnapshotCatchup": { "edges": [ { - "cursor": "IFZ/ZyCVFYjCf7cignHQQS2MNn/eq+6kji+rGr7Di8pEAQAAAAAAAAA=", + "cursor": "IApniwe7Z2bjgyFQCb0B9CXz4dET8IjzA12i9bRMR7/CAQAAAAAAAAA=", "node": { "consistentStateForEachCoin": { "owner": { @@ -666,37 +666,37 @@ Response: { "coins": { "edges": [ { - "cursor": "IFZ/ZyCVFYjCf7cignHQQS2MNn/eq+6kji+rGr7Di8pEAQAAAAAAAAA=", + "cursor": "IApniwe7Z2bjgyFQCb0B9CXz4dET8IjzA12i9bRMR7/CAQAAAAAAAAA=", "node": { "contents": { "json": { - "id": "0x567f6720951588c27fb7228271d0412d8c367fdeabeea48e2fab1abec38bca44", + "id": "0x0a678b07bb6766e383215009bd01f425f3e1d113f088f3035da2f5b44c47bfc2", "balance": { - "value": "100" + "value": "200" } } } } }, { - "cursor": "IJ3CINFJKYLv+Em6UHIRANMjkBe7f+s1nKjlNzVkxaJsAQAAAAAAAAA=", + "cursor": "IKvInbcjeUbNXxlsZmlaw02PXhlQ+UuIUGdLXk9hi5gJAQAAAAAAAAA=", "node": { "contents": { "json": { - "id": "0x9dc220d1492982eff849ba50721100d3239017bb7feb359ca8e5373564c5a26c", + "id": "0xabc89db7237946cd5f196c66695ac34d8f5e1950f94b8850674b5e4f618b9809", "balance": { - "value": "200" + "value": "100" } } } } }, { - "cursor": "INqo/pVaj/aZbQ0uWk9SX8bQdKsDqH22Yewchi34U2E0AQAAAAAAAAA=", + "cursor": "IPSGBTtl6PcfooWqNntlxy0bgSKaP1vrFtTbW1TbPtLtAQAAAAAAAAA=", "node": { "contents": { "json": { - "id": "0xdaa8fe955a8ff6996d0d2e5a4f525fc6d074ab03a87db661ec1c862df8536134", + "id": "0xf486053b65e8f71fa285aa367b65c72d1b81229a3f5beb16d4db5b54db3ed2ed", "balance": { "value": "300" } @@ -710,16 +710,16 @@ Response: { }, "contents": { "json": { - "id": "0x567f6720951588c27fb7228271d0412d8c367fdeabeea48e2fab1abec38bca44", + "id": "0x0a678b07bb6766e383215009bd01f425f3e1d113f088f3035da2f5b44c47bfc2", "balance": { - "value": "100" + "value": "200" } } } } }, { - "cursor": "IJ3CINFJKYLv+Em6UHIRANMjkBe7f+s1nKjlNzVkxaJsAQAAAAAAAAA=", + "cursor": "IKvInbcjeUbNXxlsZmlaw02PXhlQ+UuIUGdLXk9hi5gJAQAAAAAAAAA=", "node": { "consistentStateForEachCoin": { "owner": { @@ -727,37 +727,37 @@ Response: { "coins": { "edges": [ { - "cursor": "IFZ/ZyCVFYjCf7cignHQQS2MNn/eq+6kji+rGr7Di8pEAQAAAAAAAAA=", + "cursor": "IApniwe7Z2bjgyFQCb0B9CXz4dET8IjzA12i9bRMR7/CAQAAAAAAAAA=", "node": { "contents": { "json": { - "id": "0x567f6720951588c27fb7228271d0412d8c367fdeabeea48e2fab1abec38bca44", + "id": "0x0a678b07bb6766e383215009bd01f425f3e1d113f088f3035da2f5b44c47bfc2", "balance": { - "value": "100" + "value": "200" } } } } }, { - "cursor": "IJ3CINFJKYLv+Em6UHIRANMjkBe7f+s1nKjlNzVkxaJsAQAAAAAAAAA=", + "cursor": "IKvInbcjeUbNXxlsZmlaw02PXhlQ+UuIUGdLXk9hi5gJAQAAAAAAAAA=", "node": { "contents": { "json": { - "id": "0x9dc220d1492982eff849ba50721100d3239017bb7feb359ca8e5373564c5a26c", + "id": "0xabc89db7237946cd5f196c66695ac34d8f5e1950f94b8850674b5e4f618b9809", "balance": { - "value": "200" + "value": "100" } } } } }, { - "cursor": "INqo/pVaj/aZbQ0uWk9SX8bQdKsDqH22Yewchi34U2E0AQAAAAAAAAA=", + "cursor": "IPSGBTtl6PcfooWqNntlxy0bgSKaP1vrFtTbW1TbPtLtAQAAAAAAAAA=", "node": { "contents": { "json": { - "id": "0xdaa8fe955a8ff6996d0d2e5a4f525fc6d074ab03a87db661ec1c862df8536134", + "id": "0xf486053b65e8f71fa285aa367b65c72d1b81229a3f5beb16d4db5b54db3ed2ed", "balance": { "value": "300" } @@ -771,9 +771,9 @@ Response: { }, "contents": { "json": { - "id": "0x9dc220d1492982eff849ba50721100d3239017bb7feb359ca8e5373564c5a26c", + "id": "0xabc89db7237946cd5f196c66695ac34d8f5e1950f94b8850674b5e4f618b9809", "balance": { - "value": "200" + "value": "100" } } } @@ -785,26 +785,26 @@ Response: { "coins": { "edges": [ { - "cursor": "IFZ/ZyCVFYjCf7cignHQQS2MNn/eq+6kji+rGr7Di8pEAQAAAAAAAAA=", + "cursor": "IApniwe7Z2bjgyFQCb0B9CXz4dET8IjzA12i9bRMR7/CAQAAAAAAAAA=", "node": { "contents": { "json": { - "id": "0x567f6720951588c27fb7228271d0412d8c367fdeabeea48e2fab1abec38bca44", + "id": "0x0a678b07bb6766e383215009bd01f425f3e1d113f088f3035da2f5b44c47bfc2", "balance": { - "value": "100" + "value": "200" } } } } }, { - "cursor": "IJ3CINFJKYLv+Em6UHIRANMjkBe7f+s1nKjlNzVkxaJsAQAAAAAAAAA=", + "cursor": "IKvInbcjeUbNXxlsZmlaw02PXhlQ+UuIUGdLXk9hi5gJAQAAAAAAAAA=", "node": { "contents": { "json": { - "id": "0x9dc220d1492982eff849ba50721100d3239017bb7feb359ca8e5373564c5a26c", + "id": "0xabc89db7237946cd5f196c66695ac34d8f5e1950f94b8850674b5e4f618b9809", "balance": { - "value": "200" + "value": "100" } } } diff --git a/crates/iota-graphql-e2e-tests/tests/consistency/coins.move b/crates/iota-graphql-e2e-tests/tests/consistency/coins.move index 48557666ed0..65a0ef359c5 100644 --- a/crates/iota-graphql-e2e-tests/tests/consistency/coins.move +++ b/crates/iota-graphql-e2e-tests/tests/consistency/coins.move @@ -8,7 +8,7 @@ // coin2@A | coin2@B | coin2@B | coin2@B | coin2@B | coin2@B // coin3@A | coin3@A | coin3@A | coin3@A | coin3@A | coin3@A -//# init --protocol-version 1 --addresses P0=0x0 --accounts A B --simulator +//# init --protocol-version 3 --addresses P0=0x0 --accounts A B --simulator //# publish --sender A module P0::fake { diff --git a/crates/iota-graphql-e2e-tests/tests/consistency/dynamic_fields/deleted_df.exp b/crates/iota-graphql-e2e-tests/tests/consistency/dynamic_fields/deleted_df.exp index 7797f60515a..fdda38195c5 100644 --- a/crates/iota-graphql-e2e-tests/tests/consistency/dynamic_fields/deleted_df.exp +++ b/crates/iota-graphql-e2e-tests/tests/consistency/dynamic_fields/deleted_df.exp @@ -90,7 +90,7 @@ Response: { "dynamicFields": { "edges": [ { - "cursor": "IDlNUKtDqd9vWwIVLOcN6o7pIjYlCnVi16y5TbsLXWPyAQAAAAAAAAA=", + "cursor": "IAOkY3jrEBbDW3xbrO0c1Mx8MP9pP+atJlOUX17hx2rEAQAAAAAAAAA=", "node": { "name": { "bcs": "A2RmNA==" @@ -101,24 +101,24 @@ Response: { } }, { - "cursor": "IJ+efA+QWUV9kAUqmpMdM3i4HNzB+PLztem56WantRmIAQAAAAAAAAA=", + "cursor": "IFv0f9anLK64q0vDAtSGl/jl4D7Og9M2gXu8ei77LkyJAQAAAAAAAAA=", "node": { "name": { - "bcs": "A2RmNQ==" + "bcs": "A2RmNg==" }, "value": { - "json": "df5" + "json": "df6" } } }, { - "cursor": "INReOXMS6qJ8gt1WilNgHeSOMmhr2RmX7DmC5kEEwJW8AQAAAAAAAAA=", + "cursor": "INcXbq/S1eJ+TG+iUTbJQB5R7pjHOtoI/CsDpGFVdlpwAQAAAAAAAAA=", "node": { "name": { - "bcs": "A2RmNg==" + "bcs": "A2RmNQ==" }, "value": { - "json": "df6" + "json": "df5" } } } @@ -139,7 +139,7 @@ Response: { "dynamicFields": { "edges": [ { - "cursor": "IDlNUKtDqd9vWwIVLOcN6o7pIjYlCnVi16y5TbsLXWPyAQAAAAAAAAA=", + "cursor": "IAOkY3jrEBbDW3xbrO0c1Mx8MP9pP+atJlOUX17hx2rEAQAAAAAAAAA=", "node": { "name": { "bcs": "A2RmNA==" @@ -150,24 +150,24 @@ Response: { } }, { - "cursor": "IJ+efA+QWUV9kAUqmpMdM3i4HNzB+PLztem56WantRmIAQAAAAAAAAA=", + "cursor": "IFv0f9anLK64q0vDAtSGl/jl4D7Og9M2gXu8ei77LkyJAQAAAAAAAAA=", "node": { "name": { - "bcs": "A2RmNQ==" + "bcs": "A2RmNg==" }, "value": { - "json": "df5" + "json": "df6" } } }, { - "cursor": "INReOXMS6qJ8gt1WilNgHeSOMmhr2RmX7DmC5kEEwJW8AQAAAAAAAAA=", + "cursor": "INcXbq/S1eJ+TG+iUTbJQB5R7pjHOtoI/CsDpGFVdlpwAQAAAAAAAAA=", "node": { "name": { - "bcs": "A2RmNg==" + "bcs": "A2RmNQ==" }, "value": { - "json": "df6" + "json": "df5" } } } @@ -188,7 +188,7 @@ Response: { "dynamicFields": { "edges": [ { - "cursor": "IDlNUKtDqd9vWwIVLOcN6o7pIjYlCnVi16y5TbsLXWPyAQAAAAAAAAA=", + "cursor": "IAOkY3jrEBbDW3xbrO0c1Mx8MP9pP+atJlOUX17hx2rEAQAAAAAAAAA=", "node": { "name": { "bcs": "A2RmNA==" @@ -199,7 +199,7 @@ Response: { } }, { - "cursor": "IJOw9qCrVkGI8COYq8tW/sbkKDI7w1ag9Pu3bm8smSxgAQAAAAAAAAA=", + "cursor": "IDnc1DUmdy8ysuS4Uqd9eWxiQASc5PGAtHosmFU57ivkAQAAAAAAAAA=", "node": { "name": { "bcs": "A2RmMg==" @@ -210,46 +210,46 @@ Response: { } }, { - "cursor": "IJR01eHq28HFpZPEQAEIn11wvGH3QhEIUdKBy/U4+HTTAQAAAAAAAAA=", + "cursor": "IFv0f9anLK64q0vDAtSGl/jl4D7Og9M2gXu8ei77LkyJAQAAAAAAAAA=", "node": { "name": { - "bcs": "A2RmMw==" + "bcs": "A2RmNg==" }, "value": { - "json": "df3" + "json": "df6" } } }, { - "cursor": "IJ+efA+QWUV9kAUqmpMdM3i4HNzB+PLztem56WantRmIAQAAAAAAAAA=", + "cursor": "IH/f6fG8OIen97QWjQixM07rBmDXJS6IpYwlTx/70YsFAQAAAAAAAAA=", "node": { "name": { - "bcs": "A2RmNQ==" + "bcs": "A2RmMQ==" }, "value": { - "json": "df5" + "json": "df1" } } }, { - "cursor": "INReOXMS6qJ8gt1WilNgHeSOMmhr2RmX7DmC5kEEwJW8AQAAAAAAAAA=", + "cursor": "IK14TshYNK60jZChixb1mT91DCUiBE+d1Dp56IWxnjN9AQAAAAAAAAA=", "node": { "name": { - "bcs": "A2RmNg==" + "bcs": "A2RmMw==" }, "value": { - "json": "df6" + "json": "df3" } } }, { - "cursor": "IPAzcJ3N3Kd+REjvmwJLLDHNOedOaN/m/SpGEatoJZlnAQAAAAAAAAA=", + "cursor": "INcXbq/S1eJ+TG+iUTbJQB5R7pjHOtoI/CsDpGFVdlpwAQAAAAAAAAA=", "node": { "name": { - "bcs": "A2RmMQ==" + "bcs": "A2RmNQ==" }, "value": { - "json": "df1" + "json": "df5" } } } @@ -283,7 +283,7 @@ Response: { "dynamicFields": { "edges": [ { - "cursor": "IDlNUKtDqd9vWwIVLOcN6o7pIjYlCnVi16y5TbsLXWPyAQAAAAAAAAA=", + "cursor": "IAOkY3jrEBbDW3xbrO0c1Mx8MP9pP+atJlOUX17hx2rEAQAAAAAAAAA=", "node": { "name": { "bcs": "A2RmNA==" @@ -294,24 +294,24 @@ Response: { } }, { - "cursor": "IJ+efA+QWUV9kAUqmpMdM3i4HNzB+PLztem56WantRmIAQAAAAAAAAA=", + "cursor": "IFv0f9anLK64q0vDAtSGl/jl4D7Og9M2gXu8ei77LkyJAQAAAAAAAAA=", "node": { "name": { - "bcs": "A2RmNQ==" + "bcs": "A2RmNg==" }, "value": { - "json": "df5" + "json": "df6" } } }, { - "cursor": "INReOXMS6qJ8gt1WilNgHeSOMmhr2RmX7DmC5kEEwJW8AQAAAAAAAAA=", + "cursor": "INcXbq/S1eJ+TG+iUTbJQB5R7pjHOtoI/CsDpGFVdlpwAQAAAAAAAAA=", "node": { "name": { - "bcs": "A2RmNg==" + "bcs": "A2RmNQ==" }, "value": { - "json": "df6" + "json": "df5" } } } diff --git a/crates/iota-graphql-e2e-tests/tests/consistency/dynamic_fields/deleted_df.move b/crates/iota-graphql-e2e-tests/tests/consistency/dynamic_fields/deleted_df.move index 18f046df98f..c42279e9c60 100644 --- a/crates/iota-graphql-e2e-tests/tests/consistency/dynamic_fields/deleted_df.move +++ b/crates/iota-graphql-e2e-tests/tests/consistency/dynamic_fields/deleted_df.move @@ -10,7 +10,7 @@ // 5 | removed df1, df2, df3 // 6 | mutated parent -//# init --protocol-version 1 --addresses Test=0x0 --accounts A --simulator +//# init --protocol-version 3 --addresses Test=0x0 --accounts A --simulator //# publish module Test::M1 { diff --git a/crates/iota-graphql-e2e-tests/tests/consistency/dynamic_fields/deleted_dof.exp b/crates/iota-graphql-e2e-tests/tests/consistency/dynamic_fields/deleted_dof.exp index 64fbcfc0f80..3c09e5e36cb 100644 --- a/crates/iota-graphql-e2e-tests/tests/consistency/dynamic_fields/deleted_dof.exp +++ b/crates/iota-graphql-e2e-tests/tests/consistency/dynamic_fields/deleted_dof.exp @@ -41,7 +41,7 @@ Response: { "dynamicFields": { "edges": [ { - "cursor": "IClB4T7AHWEOVWKrXS5TxSolCdMgz1kvtKBpJwRFEQ4OAQAAAAAAAAA=", + "cursor": "IJ5a72V7783CzJV8LuLqMbXqtMsjLn36fDAtHjr10BjOAQAAAAAAAAA=", "node": { "name": { "bcs": "KgAAAAAAAAA=" @@ -49,7 +49,7 @@ Response: { "value": { "contents": { "json": { - "id": "0x253884793f1f9a266382615636a3407f3e624c02d0a41627cdf04ec9a9a8e26e", + "id": "0x63f53752157292d413cd6ca4b92ebcab016a084f74bfd143f555f57f1fa412bd", "count": "0" } } @@ -65,7 +65,7 @@ Response: { "value": { "contents": { "json": { - "id": "0x253884793f1f9a266382615636a3407f3e624c02d0a41627cdf04ec9a9a8e26e", + "id": "0x63f53752157292d413cd6ca4b92ebcab016a084f74bfd143f555f57f1fa412bd", "count": "0" } } @@ -77,7 +77,7 @@ Response: { "dynamicFields": { "edges": [ { - "cursor": "IClB4T7AHWEOVWKrXS5TxSolCdMgz1kvtKBpJwRFEQ4OAQAAAAAAAAA=", + "cursor": "IJ5a72V7783CzJV8LuLqMbXqtMsjLn36fDAtHjr10BjOAQAAAAAAAAA=", "node": { "name": { "bcs": "KgAAAAAAAAA=" @@ -85,7 +85,7 @@ Response: { "value": { "contents": { "json": { - "id": "0x253884793f1f9a266382615636a3407f3e624c02d0a41627cdf04ec9a9a8e26e", + "id": "0x63f53752157292d413cd6ca4b92ebcab016a084f74bfd143f555f57f1fa412bd", "count": "0" } } @@ -101,7 +101,7 @@ Response: { "value": { "contents": { "json": { - "id": "0x253884793f1f9a266382615636a3407f3e624c02d0a41627cdf04ec9a9a8e26e", + "id": "0x63f53752157292d413cd6ca4b92ebcab016a084f74bfd143f555f57f1fa412bd", "count": "0" } } @@ -117,7 +117,7 @@ Response: { "value": { "contents": { "json": { - "id": "0x253884793f1f9a266382615636a3407f3e624c02d0a41627cdf04ec9a9a8e26e", + "id": "0x63f53752157292d413cd6ca4b92ebcab016a084f74bfd143f555f57f1fa412bd", "count": "0" } } @@ -168,7 +168,7 @@ Response: { "value": { "contents": { "json": { - "id": "0x253884793f1f9a266382615636a3407f3e624c02d0a41627cdf04ec9a9a8e26e", + "id": "0x63f53752157292d413cd6ca4b92ebcab016a084f74bfd143f555f57f1fa412bd", "count": "0" } } @@ -222,7 +222,7 @@ Response: { "value": { "contents": { "json": { - "id": "0x253884793f1f9a266382615636a3407f3e624c02d0a41627cdf04ec9a9a8e26e", + "id": "0x63f53752157292d413cd6ca4b92ebcab016a084f74bfd143f555f57f1fa412bd", "count": "0" } } diff --git a/crates/iota-graphql-e2e-tests/tests/consistency/dynamic_fields/deleted_dof.move b/crates/iota-graphql-e2e-tests/tests/consistency/dynamic_fields/deleted_dof.move index e50ebdb2ceb..b4e49ecbee3 100644 --- a/crates/iota-graphql-e2e-tests/tests/consistency/dynamic_fields/deleted_dof.move +++ b/crates/iota-graphql-e2e-tests/tests/consistency/dynamic_fields/deleted_dof.move @@ -10,7 +10,7 @@ // 5 | | deleted child // 6 | | mutated parent -//# init --protocol-version 1 --addresses Test=0x0 --accounts A --simulator +//# init --protocol-version 3 --addresses Test=0x0 --accounts A --simulator //# publish module Test::M1 { diff --git a/crates/iota-graphql-e2e-tests/tests/consistency/dynamic_fields/dof_add_reclaim_transfer.exp b/crates/iota-graphql-e2e-tests/tests/consistency/dynamic_fields/dof_add_reclaim_transfer.exp index 404738532fc..03d7d92966b 100644 --- a/crates/iota-graphql-e2e-tests/tests/consistency/dynamic_fields/dof_add_reclaim_transfer.exp +++ b/crates/iota-graphql-e2e-tests/tests/consistency/dynamic_fields/dof_add_reclaim_transfer.exp @@ -36,7 +36,7 @@ Response: { "dynamicFields": { "edges": [ { - "cursor": "IK1Tx9SLMlBMaGqVyH107e/Uq5o56RGyC5wdCvulOCUYAQAAAAAAAAA=", + "cursor": "IIxlYMuyiBfpICRFw7EmSRs0LsIbcKIVngvYcbpZQhJWAQAAAAAAAAA=", "node": { "name": { "bcs": "KgAAAAAAAAA=" @@ -44,7 +44,7 @@ Response: { "value": { "contents": { "json": { - "id": "0xcff88bb86f25644cf26a3943b3d5ea96fdda9a5c65c49bb80443da8137504e73", + "id": "0x7f1515cdcb6f867821d2559cfe754ea0d2345a4c7ac4726451d5548e78b81339", "count": "0" } } @@ -60,7 +60,7 @@ Response: { "value": { "contents": { "json": { - "id": "0xcff88bb86f25644cf26a3943b3d5ea96fdda9a5c65c49bb80443da8137504e73", + "id": "0x7f1515cdcb6f867821d2559cfe754ea0d2345a4c7ac4726451d5548e78b81339", "count": "0" } } @@ -71,7 +71,7 @@ Response: { "dynamicFields": { "edges": [ { - "cursor": "IK1Tx9SLMlBMaGqVyH107e/Uq5o56RGyC5wdCvulOCUYAQAAAAAAAAA=", + "cursor": "IIxlYMuyiBfpICRFw7EmSRs0LsIbcKIVngvYcbpZQhJWAQAAAAAAAAA=", "node": { "name": { "bcs": "KgAAAAAAAAA=" @@ -79,7 +79,7 @@ Response: { "value": { "contents": { "json": { - "id": "0xcff88bb86f25644cf26a3943b3d5ea96fdda9a5c65c49bb80443da8137504e73", + "id": "0x7f1515cdcb6f867821d2559cfe754ea0d2345a4c7ac4726451d5548e78b81339", "count": "0" } } @@ -95,7 +95,7 @@ Response: { "value": { "contents": { "json": { - "id": "0xcff88bb86f25644cf26a3943b3d5ea96fdda9a5c65c49bb80443da8137504e73", + "id": "0x7f1515cdcb6f867821d2559cfe754ea0d2345a4c7ac4726451d5548e78b81339", "count": "0" } } @@ -107,7 +107,7 @@ Response: { "dynamicFields": { "edges": [ { - "cursor": "IK1Tx9SLMlBMaGqVyH107e/Uq5o56RGyC5wdCvulOCUYAQAAAAAAAAA=", + "cursor": "IIxlYMuyiBfpICRFw7EmSRs0LsIbcKIVngvYcbpZQhJWAQAAAAAAAAA=", "node": { "name": { "bcs": "KgAAAAAAAAA=" @@ -115,7 +115,7 @@ Response: { "value": { "contents": { "json": { - "id": "0xcff88bb86f25644cf26a3943b3d5ea96fdda9a5c65c49bb80443da8137504e73", + "id": "0x7f1515cdcb6f867821d2559cfe754ea0d2345a4c7ac4726451d5548e78b81339", "count": "0" } } @@ -131,7 +131,7 @@ Response: { "value": { "contents": { "json": { - "id": "0xcff88bb86f25644cf26a3943b3d5ea96fdda9a5c65c49bb80443da8137504e73", + "id": "0x7f1515cdcb6f867821d2559cfe754ea0d2345a4c7ac4726451d5548e78b81339", "count": "0" } } @@ -184,7 +184,7 @@ Response: { "value": { "contents": { "json": { - "id": "0xcff88bb86f25644cf26a3943b3d5ea96fdda9a5c65c49bb80443da8137504e73", + "id": "0x7f1515cdcb6f867821d2559cfe754ea0d2345a4c7ac4726451d5548e78b81339", "count": "0" } } diff --git a/crates/iota-graphql-e2e-tests/tests/consistency/dynamic_fields/dof_add_reclaim_transfer.move b/crates/iota-graphql-e2e-tests/tests/consistency/dynamic_fields/dof_add_reclaim_transfer.move index 660730c5df2..5b8767227fa 100644 --- a/crates/iota-graphql-e2e-tests/tests/consistency/dynamic_fields/dof_add_reclaim_transfer.move +++ b/crates/iota-graphql-e2e-tests/tests/consistency/dynamic_fields/dof_add_reclaim_transfer.move @@ -15,7 +15,7 @@ // 3 | 3 | added child to parent // 4 | 4 | reclaimed child from parent -//# init --protocol-version 1 --addresses Test=0x0 --accounts A --simulator +//# init --protocol-version 3 --addresses Test=0x0 --accounts A --simulator //# publish module Test::M1 { diff --git a/crates/iota-graphql-e2e-tests/tests/consistency/dynamic_fields/dof_add_reclaim_transfer_reclaim_add.exp b/crates/iota-graphql-e2e-tests/tests/consistency/dynamic_fields/dof_add_reclaim_transfer_reclaim_add.exp index a941516ec37..6c42a4a84a6 100644 --- a/crates/iota-graphql-e2e-tests/tests/consistency/dynamic_fields/dof_add_reclaim_transfer_reclaim_add.exp +++ b/crates/iota-graphql-e2e-tests/tests/consistency/dynamic_fields/dof_add_reclaim_transfer_reclaim_add.exp @@ -61,7 +61,7 @@ Response: { "dynamicFields": { "edges": [ { - "cursor": "IBgLCA95qc1evvZsIBNXsfk2tH1khevoO737VjBjaRq1AQAAAAAAAAA=", + "cursor": "IB4FVYgg9V6CDa+eXirLoV3kwHlX7ANZ+jwGvF/CVCj2AQAAAAAAAAA=", "node": { "name": { "bcs": "KgAAAAAAAAA=" @@ -69,7 +69,7 @@ Response: { "value": { "contents": { "json": { - "id": "0xc656ed2c790f5f9e2a5bab26c47613796636b6b54956fe9c92a6d6a191a277e9", + "id": "0x3938cfdf027a1be71937b133b59fb1dd29196ffeed24699c71ce25575a48cb5a", "count": "0" } } @@ -85,7 +85,7 @@ Response: { "value": { "contents": { "json": { - "id": "0xc656ed2c790f5f9e2a5bab26c47613796636b6b54956fe9c92a6d6a191a277e9", + "id": "0x3938cfdf027a1be71937b133b59fb1dd29196ffeed24699c71ce25575a48cb5a", "count": "0" } } @@ -96,7 +96,7 @@ Response: { "dynamicFields": { "edges": [ { - "cursor": "IBgLCA95qc1evvZsIBNXsfk2tH1khevoO737VjBjaRq1AQAAAAAAAAA=", + "cursor": "IB4FVYgg9V6CDa+eXirLoV3kwHlX7ANZ+jwGvF/CVCj2AQAAAAAAAAA=", "node": { "name": { "bcs": "KgAAAAAAAAA=" @@ -104,7 +104,7 @@ Response: { "value": { "contents": { "json": { - "id": "0xc656ed2c790f5f9e2a5bab26c47613796636b6b54956fe9c92a6d6a191a277e9", + "id": "0x3938cfdf027a1be71937b133b59fb1dd29196ffeed24699c71ce25575a48cb5a", "count": "0" } } @@ -120,7 +120,7 @@ Response: { "value": { "contents": { "json": { - "id": "0xc656ed2c790f5f9e2a5bab26c47613796636b6b54956fe9c92a6d6a191a277e9", + "id": "0x3938cfdf027a1be71937b133b59fb1dd29196ffeed24699c71ce25575a48cb5a", "count": "0" } } @@ -139,7 +139,7 @@ Response: { "dynamicFields": { "edges": [ { - "cursor": "IBgLCA95qc1evvZsIBNXsfk2tH1khevoO737VjBjaRq1AQAAAAAAAAA=", + "cursor": "IB4FVYgg9V6CDa+eXirLoV3kwHlX7ANZ+jwGvF/CVCj2AQAAAAAAAAA=", "node": { "name": { "bcs": "KgAAAAAAAAA=" @@ -147,7 +147,7 @@ Response: { "value": { "contents": { "json": { - "id": "0xc656ed2c790f5f9e2a5bab26c47613796636b6b54956fe9c92a6d6a191a277e9", + "id": "0x3938cfdf027a1be71937b133b59fb1dd29196ffeed24699c71ce25575a48cb5a", "count": "0" } } @@ -163,7 +163,7 @@ Response: { "value": { "contents": { "json": { - "id": "0xc656ed2c790f5f9e2a5bab26c47613796636b6b54956fe9c92a6d6a191a277e9", + "id": "0x3938cfdf027a1be71937b133b59fb1dd29196ffeed24699c71ce25575a48cb5a", "count": "0" } } @@ -182,7 +182,7 @@ Response: { "dynamicFields": { "edges": [ { - "cursor": "IBgLCA95qc1evvZsIBNXsfk2tH1khevoO737VjBjaRq1AQAAAAAAAAA=", + "cursor": "IB4FVYgg9V6CDa+eXirLoV3kwHlX7ANZ+jwGvF/CVCj2AQAAAAAAAAA=", "node": { "name": { "bcs": "KgAAAAAAAAA=" @@ -190,7 +190,7 @@ Response: { "value": { "contents": { "json": { - "id": "0xc656ed2c790f5f9e2a5bab26c47613796636b6b54956fe9c92a6d6a191a277e9", + "id": "0x3938cfdf027a1be71937b133b59fb1dd29196ffeed24699c71ce25575a48cb5a", "count": "0" } } @@ -206,7 +206,7 @@ Response: { "value": { "contents": { "json": { - "id": "0xc656ed2c790f5f9e2a5bab26c47613796636b6b54956fe9c92a6d6a191a277e9", + "id": "0x3938cfdf027a1be71937b133b59fb1dd29196ffeed24699c71ce25575a48cb5a", "count": "0" } } diff --git a/crates/iota-graphql-e2e-tests/tests/consistency/dynamic_fields/dof_add_reclaim_transfer_reclaim_add.move b/crates/iota-graphql-e2e-tests/tests/consistency/dynamic_fields/dof_add_reclaim_transfer_reclaim_add.move index e64864ade62..c4a87e21c46 100644 --- a/crates/iota-graphql-e2e-tests/tests/consistency/dynamic_fields/dof_add_reclaim_transfer_reclaim_add.move +++ b/crates/iota-graphql-e2e-tests/tests/consistency/dynamic_fields/dof_add_reclaim_transfer_reclaim_add.move @@ -14,7 +14,7 @@ // 4 | 6 | reclaim child from another parent // 7 | 7 | add child to original parent -//# init --protocol-version 1 --addresses Test=0x0 --accounts A --simulator +//# init --protocol-version 3 --addresses Test=0x0 --accounts A --simulator //# publish module Test::M1 { diff --git a/crates/iota-graphql-e2e-tests/tests/consistency/dynamic_fields/dynamic_fields.exp b/crates/iota-graphql-e2e-tests/tests/consistency/dynamic_fields/dynamic_fields.exp index f553d2641e1..8ccdd3fec00 100644 --- a/crates/iota-graphql-e2e-tests/tests/consistency/dynamic_fields/dynamic_fields.exp +++ b/crates/iota-graphql-e2e-tests/tests/consistency/dynamic_fields/dynamic_fields.exp @@ -84,7 +84,7 @@ task 9, lines 103-165: Response: { "data": { "parent_version_2_no_dof": { - "address": "0x76e8be7a8a2c5e59b18ae4123b6c400a060e54acac33ebaef35c6359008a39b7", + "address": "0x8bd5b2580dad76f5c91b04a5c8abfa81dcaf7791e55adf97e758394f3a3ecd64", "dynamicFields": { "edges": [] } @@ -93,7 +93,7 @@ Response: { "dynamicFields": { "edges": [ { - "cursor": "IMltckgisEII5yOBiLuvjsH2EULYkwu6lEaHTZDlMMLrAQAAAAAAAAA=", + "cursor": "INM02HGoE6QSb10FrovecYwBvBd26gG4dfgiIucXNRBsAQAAAAAAAAA=", "node": { "name": { "bcs": "pAEAAAAAAAA=", @@ -104,7 +104,7 @@ Response: { "value": { "contents": { "json": { - "id": "0xd9e0a11bb56f6fa383c493fd8aa805417f09e50daf84af662f71b46effdc4c76", + "id": "0x5a2e05a43a7478d7d980b862b1cb771767f79d659c3b4b869d652d5d0ba0aae1", "count": "1" } } @@ -115,13 +115,13 @@ Response: { } }, "child_version_2_no_parent": { - "address": "0xd9e0a11bb56f6fa383c493fd8aa805417f09e50daf84af662f71b46effdc4c76", + "address": "0x5a2e05a43a7478d7d980b862b1cb771767f79d659c3b4b869d652d5d0ba0aae1", "owner": {} }, "child_version_3_has_parent": { "owner": { "parent": { - "address": "0xc96d724822b04208e7238188bbaf8ec1f61142d8930bba9446874d90e530c2eb" + "address": "0xd334d871a813a4126f5d05ae8bde718c01bc1776ea01b875f82222e71735106c" } } } @@ -173,63 +173,63 @@ Response: { "dynamicFields": { "edges": [ { - "cursor": "IBHqo8yUZkJxCchyKB6tSCkMBIp3j3HtyLiOI5qQ3YCFAgAAAAAAAAA=", + "cursor": "IH5T1ST1RgLPlUZ+IdyKz+sLLiMj/akGfLZJEohOMLR6AgAAAAAAAAA=", "node": { "name": { - "bcs": "A2RmMg==", + "bcs": "A2RmMw==", "type": { "repr": "0x0000000000000000000000000000000000000000000000000000000000000001::string::String" } }, "value": { - "json": "df2" + "json": "df3" } } }, { - "cursor": "ICtSJBD2mvBMSbYw7lALjwqJIu1qj71gDeP4G0ZF2IdPAgAAAAAAAAA=", + "cursor": "INM02HGoE6QSb10FrovecYwBvBd26gG4dfgiIucXNRBsAgAAAAAAAAA=", "node": { "name": { - "bcs": "A2RmMQ==", + "bcs": "pAEAAAAAAAA=", "type": { - "repr": "0x0000000000000000000000000000000000000000000000000000000000000001::string::String" + "repr": "u64" } }, "value": { - "json": "df1" + "contents": { + "json": { + "id": "0x5a2e05a43a7478d7d980b862b1cb771767f79d659c3b4b869d652d5d0ba0aae1", + "count": "2" + } + } } } }, { - "cursor": "IMltckgisEII5yOBiLuvjsH2EULYkwu6lEaHTZDlMMLrAgAAAAAAAAA=", + "cursor": "IOIvp81rGEne+kFVHgmiVU8RU3CeKUDAUb7xOhPAwSlQAgAAAAAAAAA=", "node": { "name": { - "bcs": "pAEAAAAAAAA=", + "bcs": "A2RmMg==", "type": { - "repr": "u64" + "repr": "0x0000000000000000000000000000000000000000000000000000000000000001::string::String" } }, "value": { - "contents": { - "json": { - "id": "0xd9e0a11bb56f6fa383c493fd8aa805417f09e50daf84af662f71b46effdc4c76", - "count": "2" - } - } + "json": "df2" } } }, { - "cursor": "IP0sJsB7Ip8J9WsIbqXbgDAcIeih8L+/hTYxca+GYwLFAgAAAAAAAAA=", + "cursor": "IPGhGiz28/F9NiuEIwlViuWrRaNdiBxHKbVKaGY7mykIAgAAAAAAAAA=", "node": { "name": { - "bcs": "A2RmMw==", + "bcs": "A2RmMQ==", "type": { "repr": "0x0000000000000000000000000000000000000000000000000000000000000001::string::String" } }, "value": { - "json": "df3" + "json": "df1" } } } @@ -240,7 +240,7 @@ Response: { "dynamicFields": { "edges": [ { - "cursor": "IMltckgisEII5yOBiLuvjsH2EULYkwu6lEaHTZDlMMLrAgAAAAAAAAA=", + "cursor": "INM02HGoE6QSb10FrovecYwBvBd26gG4dfgiIucXNRBsAgAAAAAAAAA=", "node": { "name": { "bcs": "pAEAAAAAAAA=", @@ -251,7 +251,7 @@ Response: { "value": { "contents": { "json": { - "id": "0xd9e0a11bb56f6fa383c493fd8aa805417f09e50daf84af662f71b46effdc4c76", + "id": "0x5a2e05a43a7478d7d980b862b1cb771767f79d659c3b4b869d652d5d0ba0aae1", "count": "1" } } @@ -270,16 +270,30 @@ Response: { "dynamicFields": { "edges": [ { - "cursor": "IP0sJsB7Ip8J9WsIbqXbgDAcIeih8L+/hTYxca+GYwLFAgAAAAAAAAA=", + "cursor": "IOIvp81rGEne+kFVHgmiVU8RU3CeKUDAUb7xOhPAwSlQAgAAAAAAAAA=", "node": { "name": { - "bcs": "A2RmMw==", + "bcs": "A2RmMg==", "type": { "repr": "0x0000000000000000000000000000000000000000000000000000000000000001::string::String" } }, "value": { - "json": "df3" + "json": "df2" + } + } + }, + { + "cursor": "IPGhGiz28/F9NiuEIwlViuWrRaNdiBxHKbVKaGY7mykIAgAAAAAAAAA=", + "node": { + "name": { + "bcs": "A2RmMQ==", + "type": { + "repr": "0x0000000000000000000000000000000000000000000000000000000000000001::string::String" + } + }, + "value": { + "json": "df1" } } } @@ -314,7 +328,7 @@ Response: { "value": { "contents": { "json": { - "id": "0xd9e0a11bb56f6fa383c493fd8aa805417f09e50daf84af662f71b46effdc4c76", + "id": "0x5a2e05a43a7478d7d980b862b1cb771767f79d659c3b4b869d652d5d0ba0aae1", "count": "1" } } @@ -333,7 +347,7 @@ Response: { "value": { "contents": { "json": { - "id": "0xd9e0a11bb56f6fa383c493fd8aa805417f09e50daf84af662f71b46effdc4c76", + "id": "0x5a2e05a43a7478d7d980b862b1cb771767f79d659c3b4b869d652d5d0ba0aae1", "count": "2" } } @@ -398,35 +412,21 @@ Response: { "dynamicFields": { "edges": [ { - "cursor": "IBHqo8yUZkJxCchyKB6tSCkMBIp3j3HtyLiOI5qQ3YCFAwAAAAAAAAA=", - "node": { - "name": { - "bcs": "A2RmMg==", - "type": { - "repr": "0x0000000000000000000000000000000000000000000000000000000000000001::string::String" - } - }, - "value": { - "json": "df2" - } - } - }, - { - "cursor": "ICtSJBD2mvBMSbYw7lALjwqJIu1qj71gDeP4G0ZF2IdPAwAAAAAAAAA=", + "cursor": "IH5T1ST1RgLPlUZ+IdyKz+sLLiMj/akGfLZJEohOMLR6AwAAAAAAAAA=", "node": { "name": { - "bcs": "A2RmMQ==", + "bcs": "A2RmMw==", "type": { "repr": "0x0000000000000000000000000000000000000000000000000000000000000001::string::String" } }, "value": { - "json": "df1" + "json": "df3" } } }, { - "cursor": "IMltckgisEII5yOBiLuvjsH2EULYkwu6lEaHTZDlMMLrAwAAAAAAAAA=", + "cursor": "INM02HGoE6QSb10FrovecYwBvBd26gG4dfgiIucXNRBsAwAAAAAAAAA=", "node": { "name": { "bcs": "pAEAAAAAAAA=", @@ -437,7 +437,7 @@ Response: { "value": { "contents": { "json": { - "id": "0xd9e0a11bb56f6fa383c493fd8aa805417f09e50daf84af662f71b46effdc4c76", + "id": "0x5a2e05a43a7478d7d980b862b1cb771767f79d659c3b4b869d652d5d0ba0aae1", "count": "2" } } @@ -445,47 +445,41 @@ Response: { } }, { - "cursor": "IP0sJsB7Ip8J9WsIbqXbgDAcIeih8L+/hTYxca+GYwLFAwAAAAAAAAA=", + "cursor": "IOIvp81rGEne+kFVHgmiVU8RU3CeKUDAUb7xOhPAwSlQAwAAAAAAAAA=", "node": { "name": { - "bcs": "A2RmMw==", + "bcs": "A2RmMg==", "type": { "repr": "0x0000000000000000000000000000000000000000000000000000000000000001::string::String" } }, "value": { - "json": "df3" + "json": "df2" } } - } - ] - } - }, - "parent_version_4_paginated_on_dof_consistent": { - "dynamicFields": { - "edges": [ + }, { - "cursor": "IP0sJsB7Ip8J9WsIbqXbgDAcIeih8L+/hTYxca+GYwLFAgAAAAAAAAA=", + "cursor": "IPGhGiz28/F9NiuEIwlViuWrRaNdiBxHKbVKaGY7mykIAwAAAAAAAAA=", "node": { "name": { - "bcs": "A2RmMw==", + "bcs": "A2RmMQ==", "type": { "repr": "0x0000000000000000000000000000000000000000000000000000000000000001::string::String" } }, "value": { - "json": "df3" + "json": "df1" } } } ] } }, - "parent_version_5_has_7_children": { + "parent_version_4_paginated_on_dof_consistent": { "dynamicFields": { "edges": [ { - "cursor": "IBHqo8yUZkJxCchyKB6tSCkMBIp3j3HtyLiOI5qQ3YCFAwAAAAAAAAA=", + "cursor": "IOIvp81rGEne+kFVHgmiVU8RU3CeKUDAUb7xOhPAwSlQAgAAAAAAAAA=", "node": { "name": { "bcs": "A2RmMg==", @@ -499,7 +493,7 @@ Response: { } }, { - "cursor": "ICtSJBD2mvBMSbYw7lALjwqJIu1qj71gDeP4G0ZF2IdPAwAAAAAAAAA=", + "cursor": "IPGhGiz28/F9NiuEIwlViuWrRaNdiBxHKbVKaGY7mykIAgAAAAAAAAA=", "node": { "name": { "bcs": "A2RmMQ==", @@ -511,9 +505,15 @@ Response: { "json": "df1" } } - }, + } + ] + } + }, + "parent_version_5_has_7_children": { + "dynamicFields": { + "edges": [ { - "cursor": "IE+66B4qhmJHvgLRXCzBkJcKtIq9/3t9zYS98b6bMLhDAwAAAAAAAAA=", + "cursor": "IDhNv3675G3XXlexv/qRsZ+/KmiXpzE6611Dg+P5PCpCAwAAAAAAAAA=", "node": { "name": { "bcs": "A2RmNg==", @@ -527,21 +527,35 @@ Response: { } }, { - "cursor": "IFqQu0yJoDJda7AeIZmvhIW3x34EsmfTInmLo9ZXTVExAwAAAAAAAAA=", + "cursor": "IH5T1ST1RgLPlUZ+IdyKz+sLLiMj/akGfLZJEohOMLR6AwAAAAAAAAA=", "node": { "name": { - "bcs": "A2RmNQ==", + "bcs": "A2RmMw==", "type": { "repr": "0x0000000000000000000000000000000000000000000000000000000000000001::string::String" } }, "value": { - "json": "df5" + "json": "df3" } } }, { - "cursor": "IMltckgisEII5yOBiLuvjsH2EULYkwu6lEaHTZDlMMLrAwAAAAAAAAA=", + "cursor": "IJffeetDkRORzdANh97AfytTmdNRS7khUerDMiSvg5OMAwAAAAAAAAA=", + "node": { + "name": { + "bcs": "A2RmNA==", + "type": { + "repr": "0x0000000000000000000000000000000000000000000000000000000000000001::string::String" + } + }, + "value": { + "json": "df4" + } + } + }, + { + "cursor": "INM02HGoE6QSb10FrovecYwBvBd26gG4dfgiIucXNRBsAwAAAAAAAAA=", "node": { "name": { "bcs": "pAEAAAAAAAA=", @@ -552,7 +566,7 @@ Response: { "value": { "contents": { "json": { - "id": "0xd9e0a11bb56f6fa383c493fd8aa805417f09e50daf84af662f71b46effdc4c76", + "id": "0x5a2e05a43a7478d7d980b862b1cb771767f79d659c3b4b869d652d5d0ba0aae1", "count": "2" } } @@ -560,30 +574,44 @@ Response: { } }, { - "cursor": "INLCyu+uz92dAqQqrMubrTVBken7AGvouhvfBABDIiOuAwAAAAAAAAA=", + "cursor": "IOIvp81rGEne+kFVHgmiVU8RU3CeKUDAUb7xOhPAwSlQAwAAAAAAAAA=", "node": { "name": { - "bcs": "A2RmNA==", + "bcs": "A2RmMg==", "type": { "repr": "0x0000000000000000000000000000000000000000000000000000000000000001::string::String" } }, "value": { - "json": "df4" + "json": "df2" } } }, { - "cursor": "IP0sJsB7Ip8J9WsIbqXbgDAcIeih8L+/hTYxca+GYwLFAwAAAAAAAAA=", + "cursor": "IOstAacpirk81QX749dCGqXUsLsT0eq1llfo5vUncdfQAwAAAAAAAAA=", "node": { "name": { - "bcs": "A2RmMw==", + "bcs": "A2RmNQ==", "type": { "repr": "0x0000000000000000000000000000000000000000000000000000000000000001::string::String" } }, "value": { - "json": "df3" + "json": "df5" + } + } + }, + { + "cursor": "IPGhGiz28/F9NiuEIwlViuWrRaNdiBxHKbVKaGY7mykIAwAAAAAAAAA=", + "node": { + "name": { + "bcs": "A2RmMQ==", + "type": { + "repr": "0x0000000000000000000000000000000000000000000000000000000000000001::string::String" + } + }, + "value": { + "json": "df1" } } } @@ -594,30 +622,44 @@ Response: { "dynamicFields": { "edges": [ { - "cursor": "INLCyu+uz92dAqQqrMubrTVBken7AGvouhvfBABDIiOuAwAAAAAAAAA=", + "cursor": "IOIvp81rGEne+kFVHgmiVU8RU3CeKUDAUb7xOhPAwSlQAwAAAAAAAAA=", "node": { "name": { - "bcs": "A2RmNA==", + "bcs": "A2RmMg==", "type": { "repr": "0x0000000000000000000000000000000000000000000000000000000000000001::string::String" } }, "value": { - "json": "df4" + "json": "df2" } } }, { - "cursor": "IP0sJsB7Ip8J9WsIbqXbgDAcIeih8L+/hTYxca+GYwLFAwAAAAAAAAA=", + "cursor": "IOstAacpirk81QX749dCGqXUsLsT0eq1llfo5vUncdfQAwAAAAAAAAA=", "node": { "name": { - "bcs": "A2RmMw==", + "bcs": "A2RmNQ==", "type": { "repr": "0x0000000000000000000000000000000000000000000000000000000000000001::string::String" } }, "value": { - "json": "df3" + "json": "df5" + } + } + }, + { + "cursor": "IPGhGiz28/F9NiuEIwlViuWrRaNdiBxHKbVKaGY7mykIAwAAAAAAAAA=", + "node": { + "name": { + "bcs": "A2RmMQ==", + "type": { + "repr": "0x0000000000000000000000000000000000000000000000000000000000000001::string::String" + } + }, + "value": { + "json": "df1" } } } @@ -671,63 +713,63 @@ Response: { "dynamicFields": { "edges": [ { - "cursor": "IBHqo8yUZkJxCchyKB6tSCkMBIp3j3HtyLiOI5qQ3YCFBAAAAAAAAAA=", + "cursor": "IH5T1ST1RgLPlUZ+IdyKz+sLLiMj/akGfLZJEohOMLR6BAAAAAAAAAA=", "node": { "name": { - "bcs": "A2RmMg==", + "bcs": "A2RmMw==", "type": { "repr": "0x0000000000000000000000000000000000000000000000000000000000000001::string::String" } }, "value": { - "json": "df2" + "json": "df3" } } }, { - "cursor": "ICtSJBD2mvBMSbYw7lALjwqJIu1qj71gDeP4G0ZF2IdPBAAAAAAAAAA=", + "cursor": "INM02HGoE6QSb10FrovecYwBvBd26gG4dfgiIucXNRBsBAAAAAAAAAA=", "node": { "name": { - "bcs": "A2RmMQ==", + "bcs": "pAEAAAAAAAA=", "type": { - "repr": "0x0000000000000000000000000000000000000000000000000000000000000001::string::String" + "repr": "u64" } }, "value": { - "json": "df1" + "contents": { + "json": { + "id": "0x5a2e05a43a7478d7d980b862b1cb771767f79d659c3b4b869d652d5d0ba0aae1", + "count": "2" + } + } } } }, { - "cursor": "IMltckgisEII5yOBiLuvjsH2EULYkwu6lEaHTZDlMMLrBAAAAAAAAAA=", + "cursor": "IOIvp81rGEne+kFVHgmiVU8RU3CeKUDAUb7xOhPAwSlQBAAAAAAAAAA=", "node": { "name": { - "bcs": "pAEAAAAAAAA=", + "bcs": "A2RmMg==", "type": { - "repr": "u64" + "repr": "0x0000000000000000000000000000000000000000000000000000000000000001::string::String" } }, "value": { - "contents": { - "json": { - "id": "0xd9e0a11bb56f6fa383c493fd8aa805417f09e50daf84af662f71b46effdc4c76", - "count": "2" - } - } + "json": "df2" } } }, { - "cursor": "IP0sJsB7Ip8J9WsIbqXbgDAcIeih8L+/hTYxca+GYwLFBAAAAAAAAAA=", + "cursor": "IPGhGiz28/F9NiuEIwlViuWrRaNdiBxHKbVKaGY7mykIBAAAAAAAAAA=", "node": { "name": { - "bcs": "A2RmMw==", + "bcs": "A2RmMQ==", "type": { "repr": "0x0000000000000000000000000000000000000000000000000000000000000001::string::String" } }, "value": { - "json": "df3" + "json": "df1" } } } @@ -738,16 +780,30 @@ Response: { "dynamicFields": { "edges": [ { - "cursor": "IP0sJsB7Ip8J9WsIbqXbgDAcIeih8L+/hTYxca+GYwLFAgAAAAAAAAA=", + "cursor": "IOIvp81rGEne+kFVHgmiVU8RU3CeKUDAUb7xOhPAwSlQAgAAAAAAAAA=", "node": { "name": { - "bcs": "A2RmMw==", + "bcs": "A2RmMg==", "type": { "repr": "0x0000000000000000000000000000000000000000000000000000000000000001::string::String" } }, "value": { - "json": "df3" + "json": "df2" + } + } + }, + { + "cursor": "IPGhGiz28/F9NiuEIwlViuWrRaNdiBxHKbVKaGY7mykIAgAAAAAAAAA=", + "node": { + "name": { + "bcs": "A2RmMQ==", + "type": { + "repr": "0x0000000000000000000000000000000000000000000000000000000000000001::string::String" + } + }, + "value": { + "json": "df1" } } } @@ -758,7 +814,7 @@ Response: { "dynamicFields": { "edges": [ { - "cursor": "IE+66B4qhmJHvgLRXCzBkJcKtIq9/3t9zYS98b6bMLhDBAAAAAAAAAA=", + "cursor": "IDhNv3675G3XXlexv/qRsZ+/KmiXpzE6611Dg+P5PCpCBAAAAAAAAAA=", "node": { "name": { "bcs": "A2RmNg==", @@ -772,21 +828,21 @@ Response: { } }, { - "cursor": "IFqQu0yJoDJda7AeIZmvhIW3x34EsmfTInmLo9ZXTVExBAAAAAAAAAA=", + "cursor": "IJffeetDkRORzdANh97AfytTmdNRS7khUerDMiSvg5OMBAAAAAAAAAA=", "node": { "name": { - "bcs": "A2RmNQ==", + "bcs": "A2RmNA==", "type": { "repr": "0x0000000000000000000000000000000000000000000000000000000000000001::string::String" } }, "value": { - "json": "df5" + "json": "df4" } } }, { - "cursor": "IMltckgisEII5yOBiLuvjsH2EULYkwu6lEaHTZDlMMLrBAAAAAAAAAA=", + "cursor": "INM02HGoE6QSb10FrovecYwBvBd26gG4dfgiIucXNRBsBAAAAAAAAAA=", "node": { "name": { "bcs": "pAEAAAAAAAA=", @@ -797,7 +853,7 @@ Response: { "value": { "contents": { "json": { - "id": "0xd9e0a11bb56f6fa383c493fd8aa805417f09e50daf84af662f71b46effdc4c76", + "id": "0x5a2e05a43a7478d7d980b862b1cb771767f79d659c3b4b869d652d5d0ba0aae1", "count": "2" } } @@ -805,16 +861,16 @@ Response: { } }, { - "cursor": "INLCyu+uz92dAqQqrMubrTVBken7AGvouhvfBABDIiOuBAAAAAAAAAA=", + "cursor": "IOstAacpirk81QX749dCGqXUsLsT0eq1llfo5vUncdfQBAAAAAAAAAA=", "node": { "name": { - "bcs": "A2RmNA==", + "bcs": "A2RmNQ==", "type": { "repr": "0x0000000000000000000000000000000000000000000000000000000000000001::string::String" } }, "value": { - "json": "df4" + "json": "df5" } } } @@ -825,16 +881,16 @@ Response: { "dynamicFields": { "edges": [ { - "cursor": "INLCyu+uz92dAqQqrMubrTVBken7AGvouhvfBABDIiOuBAAAAAAAAAA=", + "cursor": "IOstAacpirk81QX749dCGqXUsLsT0eq1llfo5vUncdfQBAAAAAAAAAA=", "node": { "name": { - "bcs": "A2RmNA==", + "bcs": "A2RmNQ==", "type": { "repr": "0x0000000000000000000000000000000000000000000000000000000000000001::string::String" } }, "value": { - "json": "df4" + "json": "df5" } } } @@ -891,7 +947,7 @@ Response: { "dynamicFields": { "edges": [ { - "cursor": "IMltckgisEII5yOBiLuvjsH2EULYkwu6lEaHTZDlMMLrBwAAAAAAAAA=", + "cursor": "INM02HGoE6QSb10FrovecYwBvBd26gG4dfgiIucXNRBsBwAAAAAAAAA=", "node": { "name": { "bcs": "pAEAAAAAAAA=", @@ -902,7 +958,7 @@ Response: { "value": { "contents": { "json": { - "id": "0xd9e0a11bb56f6fa383c493fd8aa805417f09e50daf84af662f71b46effdc4c76", + "id": "0x5a2e05a43a7478d7d980b862b1cb771767f79d659c3b4b869d652d5d0ba0aae1", "count": "2" } } @@ -917,7 +973,7 @@ Response: { "dynamicFields": { "edges": [ { - "cursor": "IE+66B4qhmJHvgLRXCzBkJcKtIq9/3t9zYS98b6bMLhDBwAAAAAAAAA=", + "cursor": "IDhNv3675G3XXlexv/qRsZ+/KmiXpzE6611Dg+P5PCpCBwAAAAAAAAA=", "node": { "name": { "bcs": "A2RmNg==", @@ -931,21 +987,21 @@ Response: { } }, { - "cursor": "IFqQu0yJoDJda7AeIZmvhIW3x34EsmfTInmLo9ZXTVExBwAAAAAAAAA=", + "cursor": "IJffeetDkRORzdANh97AfytTmdNRS7khUerDMiSvg5OMBwAAAAAAAAA=", "node": { "name": { - "bcs": "A2RmNQ==", + "bcs": "A2RmNA==", "type": { "repr": "0x0000000000000000000000000000000000000000000000000000000000000001::string::String" } }, "value": { - "json": "df5" + "json": "df4" } } }, { - "cursor": "IMltckgisEII5yOBiLuvjsH2EULYkwu6lEaHTZDlMMLrBwAAAAAAAAA=", + "cursor": "INM02HGoE6QSb10FrovecYwBvBd26gG4dfgiIucXNRBsBwAAAAAAAAA=", "node": { "name": { "bcs": "pAEAAAAAAAA=", @@ -956,7 +1012,7 @@ Response: { "value": { "contents": { "json": { - "id": "0xd9e0a11bb56f6fa383c493fd8aa805417f09e50daf84af662f71b46effdc4c76", + "id": "0x5a2e05a43a7478d7d980b862b1cb771767f79d659c3b4b869d652d5d0ba0aae1", "count": "2" } } @@ -964,16 +1020,16 @@ Response: { } }, { - "cursor": "INLCyu+uz92dAqQqrMubrTVBken7AGvouhvfBABDIiOuBwAAAAAAAAA=", + "cursor": "IOstAacpirk81QX749dCGqXUsLsT0eq1llfo5vUncdfQBwAAAAAAAAA=", "node": { "name": { - "bcs": "A2RmNA==", + "bcs": "A2RmNQ==", "type": { "repr": "0x0000000000000000000000000000000000000000000000000000000000000001::string::String" } }, "value": { - "json": "df4" + "json": "df5" } } } @@ -984,16 +1040,16 @@ Response: { "dynamicFields": { "edges": [ { - "cursor": "INLCyu+uz92dAqQqrMubrTVBken7AGvouhvfBABDIiOuBAAAAAAAAAA=", + "cursor": "IOstAacpirk81QX749dCGqXUsLsT0eq1llfo5vUncdfQBAAAAAAAAAA=", "node": { "name": { - "bcs": "A2RmNA==", + "bcs": "A2RmNQ==", "type": { "repr": "0x0000000000000000000000000000000000000000000000000000000000000001::string::String" } }, "value": { - "json": "df4" + "json": "df5" } } } diff --git a/crates/iota-graphql-e2e-tests/tests/consistency/dynamic_fields/dynamic_fields.move b/crates/iota-graphql-e2e-tests/tests/consistency/dynamic_fields/dynamic_fields.move index fece3d3b265..4ada17a2ab1 100644 --- a/crates/iota-graphql-e2e-tests/tests/consistency/dynamic_fields/dynamic_fields.move +++ b/crates/iota-graphql-e2e-tests/tests/consistency/dynamic_fields/dynamic_fields.move @@ -8,7 +8,7 @@ // chkpt3: add df4, 5, 6 parent @ version 5, child @ version 4 // chkpt4: remove df1, df2, df3 parent @ version 6, child @ version 4 -//# init --protocol-version 1 --addresses Test=0x0 --accounts A --simulator +//# init --protocol-version 3 --addresses Test=0x0 --accounts A --simulator //# publish module Test::M1 { diff --git a/crates/iota-graphql-e2e-tests/tests/consistency/dynamic_fields/immutable_dof.exp b/crates/iota-graphql-e2e-tests/tests/consistency/dynamic_fields/immutable_dof.exp index 67c09b48c94..13cd9403ee7 100644 --- a/crates/iota-graphql-e2e-tests/tests/consistency/dynamic_fields/immutable_dof.exp +++ b/crates/iota-graphql-e2e-tests/tests/consistency/dynamic_fields/immutable_dof.exp @@ -58,11 +58,11 @@ Response: { "nodes": [ { "value": { - "address": "0xbbc2cee5f76e38917236d2524b3ef426edbbc25ef9ffbd6e9778dcffafe96f96", + "address": "0x103f1f568d076c169d121e62d70acd1898c08efea8d0e6506bdfe27a75174702", "version": 5, "contents": { "json": { - "id": "0xbbc2cee5f76e38917236d2524b3ef426edbbc25ef9ffbd6e9778dcffafe96f96", + "id": "0x103f1f568d076c169d121e62d70acd1898c08efea8d0e6506bdfe27a75174702", "count": "0" } }, @@ -86,11 +86,11 @@ Response: { "nodes": [ { "value": { - "address": "0xbbc2cee5f76e38917236d2524b3ef426edbbc25ef9ffbd6e9778dcffafe96f96", + "address": "0x103f1f568d076c169d121e62d70acd1898c08efea8d0e6506bdfe27a75174702", "version": 5, "contents": { "json": { - "id": "0xbbc2cee5f76e38917236d2524b3ef426edbbc25ef9ffbd6e9778dcffafe96f96", + "id": "0x103f1f568d076c169d121e62d70acd1898c08efea8d0e6506bdfe27a75174702", "count": "0" } }, @@ -98,11 +98,11 @@ Response: { "nodes": [ { "value": { - "address": "0x1981177a65ae90d094e5512584c97af55b294aef0b77794b1c6757b6ce2a5897", + "address": "0x9aca42c68d82ee924a8fdf7ccd813cc1e40d723b69e0c1c1b7e8dd04c6c3e0b5", "version": 6, "contents": { "json": { - "id": "0x1981177a65ae90d094e5512584c97af55b294aef0b77794b1c6757b6ce2a5897", + "id": "0x9aca42c68d82ee924a8fdf7ccd813cc1e40d723b69e0c1c1b7e8dd04c6c3e0b5", "count": "0" } } @@ -145,7 +145,7 @@ Response: { "object": { "owner": { "parent": { - "address": "0x261b91955dcf2f276c60d8f04a8c5bfcad92a423111b88925f9df1300715e318" + "address": "0x6c9c3e5963618ad872d20456745f8052d8cc2b06ff312bc41755be4c31c0d85a" } }, "dynamicFields": { @@ -175,11 +175,11 @@ Response: { "nodes": [ { "value": { - "address": "0x1981177a65ae90d094e5512584c97af55b294aef0b77794b1c6757b6ce2a5897", + "address": "0x9aca42c68d82ee924a8fdf7ccd813cc1e40d723b69e0c1c1b7e8dd04c6c3e0b5", "version": 6, "contents": { "json": { - "id": "0x1981177a65ae90d094e5512584c97af55b294aef0b77794b1c6757b6ce2a5897", + "id": "0x9aca42c68d82ee924a8fdf7ccd813cc1e40d723b69e0c1c1b7e8dd04c6c3e0b5", "count": "0" } } @@ -203,11 +203,11 @@ Response: { "nodes": [ { "value": { - "address": "0x1981177a65ae90d094e5512584c97af55b294aef0b77794b1c6757b6ce2a5897", + "address": "0x9aca42c68d82ee924a8fdf7ccd813cc1e40d723b69e0c1c1b7e8dd04c6c3e0b5", "version": 6, "contents": { "json": { - "id": "0x1981177a65ae90d094e5512584c97af55b294aef0b77794b1c6757b6ce2a5897", + "id": "0x9aca42c68d82ee924a8fdf7ccd813cc1e40d723b69e0c1c1b7e8dd04c6c3e0b5", "count": "0" } } diff --git a/crates/iota-graphql-e2e-tests/tests/consistency/dynamic_fields/immutable_dof.move b/crates/iota-graphql-e2e-tests/tests/consistency/dynamic_fields/immutable_dof.move index 54a7d4a289a..d5ccc2ee8ff 100644 --- a/crates/iota-graphql-e2e-tests/tests/consistency/dynamic_fields/immutable_dof.move +++ b/crates/iota-graphql-e2e-tests/tests/consistency/dynamic_fields/immutable_dof.move @@ -16,7 +16,7 @@ // Verify that Parent1 (6) -> Child1 (5) -> Child2 (6) -//# init --protocol-version 1 --addresses Test=0x0 --accounts A --simulator +//# init --protocol-version 3 --addresses Test=0x0 --accounts A --simulator //# publish module Test::M1 { diff --git a/crates/iota-graphql-e2e-tests/tests/consistency/dynamic_fields/mutated_df.exp b/crates/iota-graphql-e2e-tests/tests/consistency/dynamic_fields/mutated_df.exp index 6d506e4c4b5..6db279e5373 100644 --- a/crates/iota-graphql-e2e-tests/tests/consistency/dynamic_fields/mutated_df.exp +++ b/crates/iota-graphql-e2e-tests/tests/consistency/dynamic_fields/mutated_df.exp @@ -78,18 +78,18 @@ Response: { "dynamicFields": { "edges": [ { - "cursor": "IAbc6C6Kc64uFzGgwo7ZbNDAvqJCXM7FCORnt+FWoN4yAQAAAAAAAAA=", + "cursor": "IGfo1G9O2vQ5AUUfGCaMCW0qCfdIbThO1lc/YW2ZVNDHAQAAAAAAAAA=", "node": { "name": { - "bcs": "A2RmMQ==" + "bcs": "A2RmMw==" }, "value": { - "json": "df1" + "json": "df3" } } }, { - "cursor": "IFTGRZmDK4S0lztr3Y3wG1eww8SpX12G7JGr845f5P5sAQAAAAAAAAA=", + "cursor": "IHZ5crzZF1ky2W07ZM4hIIOlfv+idVFTxPgn4ropElLSAQAAAAAAAAA=", "node": { "name": { "bcs": "A2RmMg==" @@ -100,13 +100,13 @@ Response: { } }, { - "cursor": "IMknIBul3WNc9Xq/FWOan+uMZOaR67vleBT738wHRB1dAQAAAAAAAAA=", + "cursor": "IOP6Q1MMTGdwdYPL8ADKAldD+ZlqRKZmTH7qM3KP8ozIAQAAAAAAAAA=", "node": { "name": { - "bcs": "A2RmMw==" + "bcs": "A2RmMQ==" }, "value": { - "json": "df3" + "json": "df1" } } } @@ -154,7 +154,7 @@ Contents: Test::M1::Parent { task 11, line 114: //# run Test::M1::mutate_df1 --sender A --args object(2,0) -mutated: object(0,0), object(2,0), object(4,0) +mutated: object(0,0), object(2,0), object(4,2) gas summary: computation_cost: 1000000, computation_cost_burned: 1000000, storage_cost: 4461200, storage_rebate: 4400400, non_refundable_storage_fee: 0 task 12, line 116: @@ -201,18 +201,18 @@ Response: { "dynamicFields": { "edges": [ { - "cursor": "IAbc6C6Kc64uFzGgwo7ZbNDAvqJCXM7FCORnt+FWoN4yAgAAAAAAAAA=", + "cursor": "IGfo1G9O2vQ5AUUfGCaMCW0qCfdIbThO1lc/YW2ZVNDHAgAAAAAAAAA=", "node": { "name": { - "bcs": "A2RmMQ==" + "bcs": "A2RmMw==" }, "value": { - "json": "df1_mutated" + "json": "df3" } } }, { - "cursor": "IFTGRZmDK4S0lztr3Y3wG1eww8SpX12G7JGr845f5P5sAgAAAAAAAAA=", + "cursor": "IHZ5crzZF1ky2W07ZM4hIIOlfv+idVFTxPgn4ropElLSAgAAAAAAAAA=", "node": { "name": { "bcs": "A2RmMg==" @@ -223,13 +223,13 @@ Response: { } }, { - "cursor": "IMknIBul3WNc9Xq/FWOan+uMZOaR67vleBT738wHRB1dAgAAAAAAAAA=", + "cursor": "IOP6Q1MMTGdwdYPL8ADKAldD+ZlqRKZmTH7qM3KP8ozIAgAAAAAAAAA=", "node": { "name": { - "bcs": "A2RmMw==" + "bcs": "A2RmMQ==" }, "value": { - "json": "df3" + "json": "df1_mutated" } } } diff --git a/crates/iota-graphql-e2e-tests/tests/consistency/dynamic_fields/mutated_df.move b/crates/iota-graphql-e2e-tests/tests/consistency/dynamic_fields/mutated_df.move index d593c4151f4..e729eb10a6e 100644 --- a/crates/iota-graphql-e2e-tests/tests/consistency/dynamic_fields/mutated_df.move +++ b/crates/iota-graphql-e2e-tests/tests/consistency/dynamic_fields/mutated_df.move @@ -10,7 +10,7 @@ // 5 | mutated df1 // 6 | mutated parent again -//# init --protocol-version 1 --addresses Test=0x0 --accounts A --simulator +//# init --protocol-version 3 --addresses Test=0x0 --accounts A --simulator //# publish module Test::M1 { diff --git a/crates/iota-graphql-e2e-tests/tests/consistency/dynamic_fields/mutated_dof.exp b/crates/iota-graphql-e2e-tests/tests/consistency/dynamic_fields/mutated_dof.exp index 812f886b276..c939c4f05a0 100644 --- a/crates/iota-graphql-e2e-tests/tests/consistency/dynamic_fields/mutated_dof.exp +++ b/crates/iota-graphql-e2e-tests/tests/consistency/dynamic_fields/mutated_dof.exp @@ -41,7 +41,7 @@ Response: { "dynamicFields": { "edges": [ { - "cursor": "IE3qhyyw5Ukl1PAavIndl4WVL8BugBR44AsX6MD2XkhfAQAAAAAAAAA=", + "cursor": "ILQtpw3tzVt6lpL15VIqBp3YsW2t1MxgQsR5fGSghVHUAQAAAAAAAAA=", "node": { "name": { "bcs": "KgAAAAAAAAA=" @@ -49,7 +49,7 @@ Response: { "value": { "contents": { "json": { - "id": "0x3df577f7f845c5a18148aac68a2dfc09c674ea1f848c6153ed08a96c46dc53e4", + "id": "0x12cfc028b1cf6c5827a1596b43c6b6e1e2f3695d5a17570ae973916ad5e6f14b", "count": "0" } } @@ -65,7 +65,7 @@ Response: { "value": { "contents": { "json": { - "id": "0x3df577f7f845c5a18148aac68a2dfc09c674ea1f848c6153ed08a96c46dc53e4", + "id": "0x12cfc028b1cf6c5827a1596b43c6b6e1e2f3695d5a17570ae973916ad5e6f14b", "count": "0" } } @@ -77,7 +77,7 @@ Response: { "dynamicFields": { "edges": [ { - "cursor": "IE3qhyyw5Ukl1PAavIndl4WVL8BugBR44AsX6MD2XkhfAQAAAAAAAAA=", + "cursor": "ILQtpw3tzVt6lpL15VIqBp3YsW2t1MxgQsR5fGSghVHUAQAAAAAAAAA=", "node": { "name": { "bcs": "KgAAAAAAAAA=" @@ -85,7 +85,7 @@ Response: { "value": { "contents": { "json": { - "id": "0x3df577f7f845c5a18148aac68a2dfc09c674ea1f848c6153ed08a96c46dc53e4", + "id": "0x12cfc028b1cf6c5827a1596b43c6b6e1e2f3695d5a17570ae973916ad5e6f14b", "count": "0" } } @@ -101,7 +101,7 @@ Response: { "value": { "contents": { "json": { - "id": "0x3df577f7f845c5a18148aac68a2dfc09c674ea1f848c6153ed08a96c46dc53e4", + "id": "0x12cfc028b1cf6c5827a1596b43c6b6e1e2f3695d5a17570ae973916ad5e6f14b", "count": "0" } } @@ -117,7 +117,7 @@ Response: { "value": { "contents": { "json": { - "id": "0x3df577f7f845c5a18148aac68a2dfc09c674ea1f848c6153ed08a96c46dc53e4", + "id": "0x12cfc028b1cf6c5827a1596b43c6b6e1e2f3695d5a17570ae973916ad5e6f14b", "count": "0" } } @@ -168,7 +168,7 @@ Response: { "value": { "contents": { "json": { - "id": "0x3df577f7f845c5a18148aac68a2dfc09c674ea1f848c6153ed08a96c46dc53e4", + "id": "0x12cfc028b1cf6c5827a1596b43c6b6e1e2f3695d5a17570ae973916ad5e6f14b", "count": "0" } } @@ -202,7 +202,7 @@ Response: { "dynamicFields": { "edges": [ { - "cursor": "IE3qhyyw5Ukl1PAavIndl4WVL8BugBR44AsX6MD2XkhfAwAAAAAAAAA=", + "cursor": "ILQtpw3tzVt6lpL15VIqBp3YsW2t1MxgQsR5fGSghVHUAwAAAAAAAAA=", "node": { "name": { "bcs": "KgAAAAAAAAA=" @@ -210,7 +210,7 @@ Response: { "value": { "contents": { "json": { - "id": "0x3df577f7f845c5a18148aac68a2dfc09c674ea1f848c6153ed08a96c46dc53e4", + "id": "0x12cfc028b1cf6c5827a1596b43c6b6e1e2f3695d5a17570ae973916ad5e6f14b", "count": "1" } } @@ -226,7 +226,7 @@ Response: { "value": { "contents": { "json": { - "id": "0x3df577f7f845c5a18148aac68a2dfc09c674ea1f848c6153ed08a96c46dc53e4", + "id": "0x12cfc028b1cf6c5827a1596b43c6b6e1e2f3695d5a17570ae973916ad5e6f14b", "count": "1" } } @@ -238,7 +238,7 @@ Response: { "dynamicFields": { "edges": [ { - "cursor": "IE3qhyyw5Ukl1PAavIndl4WVL8BugBR44AsX6MD2XkhfAwAAAAAAAAA=", + "cursor": "ILQtpw3tzVt6lpL15VIqBp3YsW2t1MxgQsR5fGSghVHUAwAAAAAAAAA=", "node": { "name": { "bcs": "KgAAAAAAAAA=" @@ -246,7 +246,7 @@ Response: { "value": { "contents": { "json": { - "id": "0x3df577f7f845c5a18148aac68a2dfc09c674ea1f848c6153ed08a96c46dc53e4", + "id": "0x12cfc028b1cf6c5827a1596b43c6b6e1e2f3695d5a17570ae973916ad5e6f14b", "count": "1" } } @@ -262,7 +262,7 @@ Response: { "value": { "contents": { "json": { - "id": "0x3df577f7f845c5a18148aac68a2dfc09c674ea1f848c6153ed08a96c46dc53e4", + "id": "0x12cfc028b1cf6c5827a1596b43c6b6e1e2f3695d5a17570ae973916ad5e6f14b", "count": "1" } } @@ -283,7 +283,7 @@ Response: { "value": { "contents": { "json": { - "id": "0x3df577f7f845c5a18148aac68a2dfc09c674ea1f848c6153ed08a96c46dc53e4", + "id": "0x12cfc028b1cf6c5827a1596b43c6b6e1e2f3695d5a17570ae973916ad5e6f14b", "count": "0" } } diff --git a/crates/iota-graphql-e2e-tests/tests/consistency/dynamic_fields/mutated_dof.move b/crates/iota-graphql-e2e-tests/tests/consistency/dynamic_fields/mutated_dof.move index d314ae5a709..be67c5402f3 100644 --- a/crates/iota-graphql-e2e-tests/tests/consistency/dynamic_fields/mutated_dof.move +++ b/crates/iota-graphql-e2e-tests/tests/consistency/dynamic_fields/mutated_dof.move @@ -11,7 +11,7 @@ // 5 | 6 | mutated child // 7 | 7 | add child back to parent -//# init --protocol-version 1 --addresses Test=0x0 --accounts A --simulator +//# init --protocol-version 3 --addresses Test=0x0 --accounts A --simulator //# publish module Test::M1 { diff --git a/crates/iota-graphql-e2e-tests/tests/consistency/dynamic_fields/nested_dof.exp b/crates/iota-graphql-e2e-tests/tests/consistency/dynamic_fields/nested_dof.exp index 8f0b5aedb4b..8c5ccbdb0ec 100644 --- a/crates/iota-graphql-e2e-tests/tests/consistency/dynamic_fields/nested_dof.exp +++ b/crates/iota-graphql-e2e-tests/tests/consistency/dynamic_fields/nested_dof.exp @@ -62,11 +62,11 @@ Response: { "nodes": [ { "value": { - "address": "0xc1e75c3f54d6c6bae388d42640d529f080b34becbaabc5c920293f6ab3b8fbfb", + "address": "0x5a9ff7a0b7bbe7fcaa815c5ae574cee72a67636a9672b4334a40bb65ccceac28", "version": 5, "contents": { "json": { - "id": "0xc1e75c3f54d6c6bae388d42640d529f080b34becbaabc5c920293f6ab3b8fbfb", + "id": "0x5a9ff7a0b7bbe7fcaa815c5ae574cee72a67636a9672b4334a40bb65ccceac28", "count": "0" } }, @@ -90,11 +90,11 @@ Response: { "nodes": [ { "value": { - "address": "0xc1e75c3f54d6c6bae388d42640d529f080b34becbaabc5c920293f6ab3b8fbfb", + "address": "0x5a9ff7a0b7bbe7fcaa815c5ae574cee72a67636a9672b4334a40bb65ccceac28", "version": 5, "contents": { "json": { - "id": "0xc1e75c3f54d6c6bae388d42640d529f080b34becbaabc5c920293f6ab3b8fbfb", + "id": "0x5a9ff7a0b7bbe7fcaa815c5ae574cee72a67636a9672b4334a40bb65ccceac28", "count": "0" } }, @@ -102,11 +102,11 @@ Response: { "nodes": [ { "value": { - "address": "0x7bc6cd7c621f45de49d28adf67705526d7455422bcdbf8111a7eb80a2a9a7c67", + "address": "0xc87c76c91ed902d02e6de92c4c5a7aea80f2c1123361775a1615e102e2f37d85", "version": 6, "contents": { "json": { - "id": "0x7bc6cd7c621f45de49d28adf67705526d7455422bcdbf8111a7eb80a2a9a7c67", + "id": "0xc87c76c91ed902d02e6de92c4c5a7aea80f2c1123361775a1615e102e2f37d85", "count": "0" } } @@ -131,11 +131,11 @@ Response: { "nodes": [ { "value": { - "address": "0xc1e75c3f54d6c6bae388d42640d529f080b34becbaabc5c920293f6ab3b8fbfb", + "address": "0x5a9ff7a0b7bbe7fcaa815c5ae574cee72a67636a9672b4334a40bb65ccceac28", "version": 7, "contents": { "json": { - "id": "0xc1e75c3f54d6c6bae388d42640d529f080b34becbaabc5c920293f6ab3b8fbfb", + "id": "0x5a9ff7a0b7bbe7fcaa815c5ae574cee72a67636a9672b4334a40bb65ccceac28", "count": "1" } }, @@ -143,11 +143,11 @@ Response: { "nodes": [ { "value": { - "address": "0x7bc6cd7c621f45de49d28adf67705526d7455422bcdbf8111a7eb80a2a9a7c67", + "address": "0xc87c76c91ed902d02e6de92c4c5a7aea80f2c1123361775a1615e102e2f37d85", "version": 6, "contents": { "json": { - "id": "0x7bc6cd7c621f45de49d28adf67705526d7455422bcdbf8111a7eb80a2a9a7c67", + "id": "0xc87c76c91ed902d02e6de92c4c5a7aea80f2c1123361775a1615e102e2f37d85", "count": "0" } } @@ -172,11 +172,11 @@ Response: { "nodes": [ { "value": { - "address": "0xc1e75c3f54d6c6bae388d42640d529f080b34becbaabc5c920293f6ab3b8fbfb", + "address": "0x5a9ff7a0b7bbe7fcaa815c5ae574cee72a67636a9672b4334a40bb65ccceac28", "version": 7, "contents": { "json": { - "id": "0xc1e75c3f54d6c6bae388d42640d529f080b34becbaabc5c920293f6ab3b8fbfb", + "id": "0x5a9ff7a0b7bbe7fcaa815c5ae574cee72a67636a9672b4334a40bb65ccceac28", "count": "1" } }, @@ -184,11 +184,11 @@ Response: { "nodes": [ { "value": { - "address": "0x7bc6cd7c621f45de49d28adf67705526d7455422bcdbf8111a7eb80a2a9a7c67", + "address": "0xc87c76c91ed902d02e6de92c4c5a7aea80f2c1123361775a1615e102e2f37d85", "version": 8, "contents": { "json": { - "id": "0x7bc6cd7c621f45de49d28adf67705526d7455422bcdbf8111a7eb80a2a9a7c67", + "id": "0xc87c76c91ed902d02e6de92c4c5a7aea80f2c1123361775a1615e102e2f37d85", "count": "1" } } @@ -233,11 +233,11 @@ Response: { "nodes": [ { "value": { - "address": "0x7bc6cd7c621f45de49d28adf67705526d7455422bcdbf8111a7eb80a2a9a7c67", + "address": "0xc87c76c91ed902d02e6de92c4c5a7aea80f2c1123361775a1615e102e2f37d85", "version": 6, "contents": { "json": { - "id": "0x7bc6cd7c621f45de49d28adf67705526d7455422bcdbf8111a7eb80a2a9a7c67", + "id": "0xc87c76c91ed902d02e6de92c4c5a7aea80f2c1123361775a1615e102e2f37d85", "count": "0" } } diff --git a/crates/iota-graphql-e2e-tests/tests/consistency/dynamic_fields/nested_dof.move b/crates/iota-graphql-e2e-tests/tests/consistency/dynamic_fields/nested_dof.move index af604fe07ae..3625aaa457d 100644 --- a/crates/iota-graphql-e2e-tests/tests/consistency/dynamic_fields/nested_dof.move +++ b/crates/iota-graphql-e2e-tests/tests/consistency/dynamic_fields/nested_dof.move @@ -20,7 +20,7 @@ // Child1 (5) -> None // Child1 (7) -> Child2 (6) -//# init --protocol-version 1 --addresses Test=0x0 --accounts A --simulator +//# init --protocol-version 3 --addresses Test=0x0 --accounts A --simulator //# publish module Test::M1 { diff --git a/crates/iota-graphql-e2e-tests/tests/consistency/epochs/checkpoints.move b/crates/iota-graphql-e2e-tests/tests/consistency/epochs/checkpoints.move index d83379e9822..40d316a172b 100644 --- a/crates/iota-graphql-e2e-tests/tests/consistency/epochs/checkpoints.move +++ b/crates/iota-graphql-e2e-tests/tests/consistency/epochs/checkpoints.move @@ -9,7 +9,7 @@ // 2 | 2 // An additional checkpoint is created at the end. -//# init --protocol-version 1 --addresses Test=0x0 --accounts A B --simulator +//# init --protocol-version 3 --addresses Test=0x0 --accounts A B --simulator //# create-checkpoint diff --git a/crates/iota-graphql-e2e-tests/tests/consistency/epochs/transaction_blocks.exp b/crates/iota-graphql-e2e-tests/tests/consistency/epochs/transaction_blocks.exp index b8ef5a023ea..6fd59e48abd 100644 --- a/crates/iota-graphql-e2e-tests/tests/consistency/epochs/transaction_blocks.exp +++ b/crates/iota-graphql-e2e-tests/tests/consistency/epochs/transaction_blocks.exp @@ -41,25 +41,25 @@ Response: { { "cursor": "eyJjIjozLCJ0IjowLCJpIjpmYWxzZX0", "node": { - "digest": "CmPeQ2JKFnEKeZsYz9cYU8q57Wb1fgZxpDqYq9YinuQA" + "digest": "5XJr4MXW36JcHWpqf2PF2oAD2cfWg4bk1jQWVp6Josvj" } }, { "cursor": "eyJjIjozLCJ0IjoxLCJpIjpmYWxzZX0", "node": { - "digest": "Hm38QqFQFCkzedsHCXsxJt7j5VCo9KUn5ZL9zSAZVKWh" + "digest": "DU5Lhorja2vD4cPn5Eqv6HvKA1ZY8mfGC3SHhGccQ9qF" } }, { "cursor": "eyJjIjozLCJ0IjoyLCJpIjpmYWxzZX0", "node": { - "digest": "ywf9ak8rV9kDDx73zGH5vtTJkHmfxXHvLbSGhwAyxdM" + "digest": "7BPdUc3LpRmchBjPiSZ5Uju5yDZMbVhTQNYjDjmTXP5D" } }, { "cursor": "eyJjIjozLCJ0IjozLCJpIjpmYWxzZX0", "node": { - "digest": "Fsv6DwsUEPUqRyFP7wkd7mMDq93PXMmSXqQAgrrnsKb3" + "digest": "6ox6bgoqFRZbKftfQPM29MNpo876eW6PdsHxaNLEYiDj" } } ] @@ -154,25 +154,25 @@ Response: { { "cursor": "eyJjIjoxMiwidCI6MCwiaSI6ZmFsc2V9", "node": { - "digest": "CmPeQ2JKFnEKeZsYz9cYU8q57Wb1fgZxpDqYq9YinuQA" + "digest": "5XJr4MXW36JcHWpqf2PF2oAD2cfWg4bk1jQWVp6Josvj" } }, { "cursor": "eyJjIjoxMiwidCI6MSwiaSI6ZmFsc2V9", "node": { - "digest": "Hm38QqFQFCkzedsHCXsxJt7j5VCo9KUn5ZL9zSAZVKWh" + "digest": "DU5Lhorja2vD4cPn5Eqv6HvKA1ZY8mfGC3SHhGccQ9qF" } }, { "cursor": "eyJjIjoxMiwidCI6MiwiaSI6ZmFsc2V9", "node": { - "digest": "ywf9ak8rV9kDDx73zGH5vtTJkHmfxXHvLbSGhwAyxdM" + "digest": "7BPdUc3LpRmchBjPiSZ5Uju5yDZMbVhTQNYjDjmTXP5D" } }, { "cursor": "eyJjIjoxMiwidCI6MywiaSI6ZmFsc2V9", "node": { - "digest": "Fsv6DwsUEPUqRyFP7wkd7mMDq93PXMmSXqQAgrrnsKb3" + "digest": "6ox6bgoqFRZbKftfQPM29MNpo876eW6PdsHxaNLEYiDj" } } ] @@ -183,19 +183,19 @@ Response: { { "cursor": "eyJjIjo0LCJ0IjowLCJpIjpmYWxzZX0", "node": { - "digest": "CmPeQ2JKFnEKeZsYz9cYU8q57Wb1fgZxpDqYq9YinuQA" + "digest": "5XJr4MXW36JcHWpqf2PF2oAD2cfWg4bk1jQWVp6Josvj" } }, { "cursor": "eyJjIjo0LCJ0IjoxLCJpIjpmYWxzZX0", "node": { - "digest": "Hm38QqFQFCkzedsHCXsxJt7j5VCo9KUn5ZL9zSAZVKWh" + "digest": "DU5Lhorja2vD4cPn5Eqv6HvKA1ZY8mfGC3SHhGccQ9qF" } }, { "cursor": "eyJjIjo0LCJ0IjoyLCJpIjpmYWxzZX0", "node": { - "digest": "ywf9ak8rV9kDDx73zGH5vtTJkHmfxXHvLbSGhwAyxdM" + "digest": "7BPdUc3LpRmchBjPiSZ5Uju5yDZMbVhTQNYjDjmTXP5D" } } ] @@ -207,25 +207,25 @@ Response: { { "cursor": "eyJjIjoxMiwidCI6NCwiaSI6ZmFsc2V9", "node": { - "digest": "25MhkStEmB44afcLcmtdA426Qbo6a5z6sJrURSfn4wSM" + "digest": "3s48BKV1NGNPV5VRKFsAJKWiyUiWDLVxguSERpo8qRTV" } }, { "cursor": "eyJjIjoxMiwidCI6NSwiaSI6ZmFsc2V9", "node": { - "digest": "Hutiw6GLNGCuRwMTZhxFW2CrYF6PYt2DomNMwtN1hLUo" + "digest": "6adEehTM2gxGKdumJXeKFwcaYhSB6RwGHbqg7Fv7JBmk" } }, { "cursor": "eyJjIjoxMiwidCI6NiwiaSI6ZmFsc2V9", "node": { - "digest": "4YeKsZh5nDLNfbNVT2GRwenv1gvaVdDde9BASgiBqkv8" + "digest": "E4Lt2ME1UNXjXnuVzF9CMyrHnhdQWbWRXj3myqpzZMrP" } }, { "cursor": "eyJjIjoxMiwidCI6NywiaSI6ZmFsc2V9", "node": { - "digest": "3K4FAYTRRVNDcR16Z3ScNDP5W4dgvAdMorFux1xnGVvd" + "digest": "HCaSSfE7rxz2tEA5uEiZ4KDozVm1uSKJGsv8nqwi9YDv" } } ] @@ -236,43 +236,43 @@ Response: { { "cursor": "eyJjIjo4LCJ0IjowLCJpIjpmYWxzZX0", "node": { - "digest": "CmPeQ2JKFnEKeZsYz9cYU8q57Wb1fgZxpDqYq9YinuQA" + "digest": "5XJr4MXW36JcHWpqf2PF2oAD2cfWg4bk1jQWVp6Josvj" } }, { "cursor": "eyJjIjo4LCJ0IjoxLCJpIjpmYWxzZX0", "node": { - "digest": "Hm38QqFQFCkzedsHCXsxJt7j5VCo9KUn5ZL9zSAZVKWh" + "digest": "DU5Lhorja2vD4cPn5Eqv6HvKA1ZY8mfGC3SHhGccQ9qF" } }, { "cursor": "eyJjIjo4LCJ0IjoyLCJpIjpmYWxzZX0", "node": { - "digest": "ywf9ak8rV9kDDx73zGH5vtTJkHmfxXHvLbSGhwAyxdM" + "digest": "7BPdUc3LpRmchBjPiSZ5Uju5yDZMbVhTQNYjDjmTXP5D" } }, { "cursor": "eyJjIjo4LCJ0IjozLCJpIjpmYWxzZX0", "node": { - "digest": "Fsv6DwsUEPUqRyFP7wkd7mMDq93PXMmSXqQAgrrnsKb3" + "digest": "6ox6bgoqFRZbKftfQPM29MNpo876eW6PdsHxaNLEYiDj" } }, { "cursor": "eyJjIjo4LCJ0Ijo0LCJpIjpmYWxzZX0", "node": { - "digest": "25MhkStEmB44afcLcmtdA426Qbo6a5z6sJrURSfn4wSM" + "digest": "3s48BKV1NGNPV5VRKFsAJKWiyUiWDLVxguSERpo8qRTV" } }, { "cursor": "eyJjIjo4LCJ0Ijo1LCJpIjpmYWxzZX0", "node": { - "digest": "Hutiw6GLNGCuRwMTZhxFW2CrYF6PYt2DomNMwtN1hLUo" + "digest": "6adEehTM2gxGKdumJXeKFwcaYhSB6RwGHbqg7Fv7JBmk" } }, { "cursor": "eyJjIjo4LCJ0Ijo2LCJpIjpmYWxzZX0", "node": { - "digest": "4YeKsZh5nDLNfbNVT2GRwenv1gvaVdDde9BASgiBqkv8" + "digest": "E4Lt2ME1UNXjXnuVzF9CMyrHnhdQWbWRXj3myqpzZMrP" } } ] @@ -284,25 +284,25 @@ Response: { { "cursor": "eyJjIjoxMiwidCI6OCwiaSI6ZmFsc2V9", "node": { - "digest": "EnghHbuhpcGuNpC1L2iqikieXAyHJUnanzg5urDmwgdz" + "digest": "DEYu7BBRqZyroncK1on7suMYzHy7GLJMoSsC6K8d14BR" } }, { "cursor": "eyJjIjoxMiwidCI6OSwiaSI6ZmFsc2V9", "node": { - "digest": "9G4gNmS2XYetMxBty65fKfx9iDRBetdpdNZuyK7oRd6c" + "digest": "32S1CoAgaGv7diFo2Bs7StnPB7Aakoma1JUT4k4cUpA7" } }, { "cursor": "eyJjIjoxMiwidCI6MTAsImkiOmZhbHNlfQ", "node": { - "digest": "3ivB1ebWRpc4Si1vd8tsSY7XwaY7DrumxdS3KdXyZLVr" + "digest": "3gEc6E6ypnwUqRtVBcF3ZwXPEQJaisXDDaK21p4sZyM8" } }, { "cursor": "eyJjIjoxMiwidCI6MTEsImkiOmZhbHNlfQ", "node": { - "digest": "CpC1zrGsmDThe1sPdhRPmfQCpaaTYJanFTtyr5BBNNNZ" + "digest": "3r7RAxvcfWTz7vCtCtExmfQkr5LdSvNF4V6F1JVzNzGW" } } ] @@ -313,67 +313,67 @@ Response: { { "cursor": "eyJjIjoxMiwidCI6MCwiaSI6ZmFsc2V9", "node": { - "digest": "CmPeQ2JKFnEKeZsYz9cYU8q57Wb1fgZxpDqYq9YinuQA" + "digest": "5XJr4MXW36JcHWpqf2PF2oAD2cfWg4bk1jQWVp6Josvj" } }, { "cursor": "eyJjIjoxMiwidCI6MSwiaSI6ZmFsc2V9", "node": { - "digest": "Hm38QqFQFCkzedsHCXsxJt7j5VCo9KUn5ZL9zSAZVKWh" + "digest": "DU5Lhorja2vD4cPn5Eqv6HvKA1ZY8mfGC3SHhGccQ9qF" } }, { "cursor": "eyJjIjoxMiwidCI6MiwiaSI6ZmFsc2V9", "node": { - "digest": "ywf9ak8rV9kDDx73zGH5vtTJkHmfxXHvLbSGhwAyxdM" + "digest": "7BPdUc3LpRmchBjPiSZ5Uju5yDZMbVhTQNYjDjmTXP5D" } }, { "cursor": "eyJjIjoxMiwidCI6MywiaSI6ZmFsc2V9", "node": { - "digest": "Fsv6DwsUEPUqRyFP7wkd7mMDq93PXMmSXqQAgrrnsKb3" + "digest": "6ox6bgoqFRZbKftfQPM29MNpo876eW6PdsHxaNLEYiDj" } }, { "cursor": "eyJjIjoxMiwidCI6NCwiaSI6ZmFsc2V9", "node": { - "digest": "25MhkStEmB44afcLcmtdA426Qbo6a5z6sJrURSfn4wSM" + "digest": "3s48BKV1NGNPV5VRKFsAJKWiyUiWDLVxguSERpo8qRTV" } }, { "cursor": "eyJjIjoxMiwidCI6NSwiaSI6ZmFsc2V9", "node": { - "digest": "Hutiw6GLNGCuRwMTZhxFW2CrYF6PYt2DomNMwtN1hLUo" + "digest": "6adEehTM2gxGKdumJXeKFwcaYhSB6RwGHbqg7Fv7JBmk" } }, { "cursor": "eyJjIjoxMiwidCI6NiwiaSI6ZmFsc2V9", "node": { - "digest": "4YeKsZh5nDLNfbNVT2GRwenv1gvaVdDde9BASgiBqkv8" + "digest": "E4Lt2ME1UNXjXnuVzF9CMyrHnhdQWbWRXj3myqpzZMrP" } }, { "cursor": "eyJjIjoxMiwidCI6NywiaSI6ZmFsc2V9", "node": { - "digest": "3K4FAYTRRVNDcR16Z3ScNDP5W4dgvAdMorFux1xnGVvd" + "digest": "HCaSSfE7rxz2tEA5uEiZ4KDozVm1uSKJGsv8nqwi9YDv" } }, { "cursor": "eyJjIjoxMiwidCI6OCwiaSI6ZmFsc2V9", "node": { - "digest": "EnghHbuhpcGuNpC1L2iqikieXAyHJUnanzg5urDmwgdz" + "digest": "DEYu7BBRqZyroncK1on7suMYzHy7GLJMoSsC6K8d14BR" } }, { "cursor": "eyJjIjoxMiwidCI6OSwiaSI6ZmFsc2V9", "node": { - "digest": "9G4gNmS2XYetMxBty65fKfx9iDRBetdpdNZuyK7oRd6c" + "digest": "32S1CoAgaGv7diFo2Bs7StnPB7Aakoma1JUT4k4cUpA7" } }, { "cursor": "eyJjIjoxMiwidCI6MTAsImkiOmZhbHNlfQ", "node": { - "digest": "3ivB1ebWRpc4Si1vd8tsSY7XwaY7DrumxdS3KdXyZLVr" + "digest": "3gEc6E6ypnwUqRtVBcF3ZwXPEQJaisXDDaK21p4sZyM8" } } ] @@ -395,19 +395,19 @@ Response: { { "cursor": "eyJjIjo3LCJ0IjoxLCJpIjpmYWxzZX0", "node": { - "digest": "Hm38QqFQFCkzedsHCXsxJt7j5VCo9KUn5ZL9zSAZVKWh" + "digest": "DU5Lhorja2vD4cPn5Eqv6HvKA1ZY8mfGC3SHhGccQ9qF" } }, { "cursor": "eyJjIjo3LCJ0IjoyLCJpIjpmYWxzZX0", "node": { - "digest": "ywf9ak8rV9kDDx73zGH5vtTJkHmfxXHvLbSGhwAyxdM" + "digest": "7BPdUc3LpRmchBjPiSZ5Uju5yDZMbVhTQNYjDjmTXP5D" } }, { "cursor": "eyJjIjo3LCJ0IjozLCJpIjpmYWxzZX0", "node": { - "digest": "Fsv6DwsUEPUqRyFP7wkd7mMDq93PXMmSXqQAgrrnsKb3" + "digest": "6ox6bgoqFRZbKftfQPM29MNpo876eW6PdsHxaNLEYiDj" } } ] @@ -420,19 +420,19 @@ Response: { { "cursor": "eyJjIjoxMSwidCI6NSwiaSI6ZmFsc2V9", "node": { - "digest": "Hutiw6GLNGCuRwMTZhxFW2CrYF6PYt2DomNMwtN1hLUo" + "digest": "6adEehTM2gxGKdumJXeKFwcaYhSB6RwGHbqg7Fv7JBmk" } }, { "cursor": "eyJjIjoxMSwidCI6NiwiaSI6ZmFsc2V9", "node": { - "digest": "4YeKsZh5nDLNfbNVT2GRwenv1gvaVdDde9BASgiBqkv8" + "digest": "E4Lt2ME1UNXjXnuVzF9CMyrHnhdQWbWRXj3myqpzZMrP" } }, { "cursor": "eyJjIjoxMSwidCI6NywiaSI6ZmFsc2V9", "node": { - "digest": "3K4FAYTRRVNDcR16Z3ScNDP5W4dgvAdMorFux1xnGVvd" + "digest": "HCaSSfE7rxz2tEA5uEiZ4KDozVm1uSKJGsv8nqwi9YDv" } } ] @@ -445,19 +445,19 @@ Response: { { "cursor": "eyJjIjoxMiwidCI6OSwiaSI6ZmFsc2V9", "node": { - "digest": "9G4gNmS2XYetMxBty65fKfx9iDRBetdpdNZuyK7oRd6c" + "digest": "32S1CoAgaGv7diFo2Bs7StnPB7Aakoma1JUT4k4cUpA7" } }, { "cursor": "eyJjIjoxMiwidCI6MTAsImkiOmZhbHNlfQ", "node": { - "digest": "3ivB1ebWRpc4Si1vd8tsSY7XwaY7DrumxdS3KdXyZLVr" + "digest": "3gEc6E6ypnwUqRtVBcF3ZwXPEQJaisXDDaK21p4sZyM8" } }, { "cursor": "eyJjIjoxMiwidCI6MTEsImkiOmZhbHNlfQ", "node": { - "digest": "CpC1zrGsmDThe1sPdhRPmfQCpaaTYJanFTtyr5BBNNNZ" + "digest": "3r7RAxvcfWTz7vCtCtExmfQkr5LdSvNF4V6F1JVzNzGW" } } ] @@ -480,7 +480,7 @@ Response: { { "cursor": "eyJjIjoyLCJ0IjoyLCJpIjpmYWxzZX0", "node": { - "digest": "ywf9ak8rV9kDDx73zGH5vtTJkHmfxXHvLbSGhwAyxdM" + "digest": "7BPdUc3LpRmchBjPiSZ5Uju5yDZMbVhTQNYjDjmTXP5D" } } ] @@ -493,7 +493,7 @@ Response: { { "cursor": "eyJjIjo2LCJ0Ijo2LCJpIjpmYWxzZX0", "node": { - "digest": "4YeKsZh5nDLNfbNVT2GRwenv1gvaVdDde9BASgiBqkv8" + "digest": "E4Lt2ME1UNXjXnuVzF9CMyrHnhdQWbWRXj3myqpzZMrP" } } ] @@ -506,7 +506,7 @@ Response: { { "cursor": "eyJjIjoxMCwidCI6MTAsImkiOmZhbHNlfQ", "node": { - "digest": "3ivB1ebWRpc4Si1vd8tsSY7XwaY7DrumxdS3KdXyZLVr" + "digest": "3gEc6E6ypnwUqRtVBcF3ZwXPEQJaisXDDaK21p4sZyM8" } } ] @@ -527,24 +527,24 @@ Response: { { "cursor": "eyJjIjo2LCJ0Ijo2LCJpIjpmYWxzZX0", "node": { - "digest": "4YeKsZh5nDLNfbNVT2GRwenv1gvaVdDde9BASgiBqkv8", + "digest": "E4Lt2ME1UNXjXnuVzF9CMyrHnhdQWbWRXj3myqpzZMrP", "sender": { "objects": { "edges": [ { - "cursor": "IAxPzPNh6DBZ+lqchUWSL6NuS4y4vgz6pHjStN6JWpF/BgAAAAAAAAA=" + "cursor": "IAliWgwcr8n37dkM7mZzjkkSDkpfTgEPI6/C9SsEvD4wBgAAAAAAAAA=" }, { - "cursor": "IBH2WwM6ABxADOrEJ86TGtH880uA4Ce8kx9mXnSZj2DYBgAAAAAAAAA=" + "cursor": "IBGzpWsWAJqwTtHNtSzMlcNw/lp0Q7mxGubPXWYv7SVDBgAAAAAAAAA=" }, { - "cursor": "IBpSURhn9I1wJERwRFANEXqI98bagpRsksYuuwsrFFtQBgAAAAAAAAA=" + "cursor": "IBOIPAp4MKzHgkh72/O/iMqkg160NT2TOG5zk0R8EOecBgAAAAAAAAA=" }, { - "cursor": "IElmtyPGm1GRSMWeyj+lZFiOkrmPZ2oKnWeSNwmsAXf/BgAAAAAAAAA=" + "cursor": "IJ9s1BXAi+CbOC283CRx1p7dE11yaTraKXAGeCk6JJ22BgAAAAAAAAA=" }, { - "cursor": "IH3CTzQfYFptQFnBjnyGfpphmbw0uuCt4JTcq1tQsIZRBgAAAAAAAAA=" + "cursor": "IMQLpfEhnQHF4QCZEHo91G+rv+6yBXtQFiTVqRnjt4bFBgAAAAAAAAA=" } ] } @@ -558,33 +558,33 @@ Response: { { "cursor": "eyJjIjoxMiwidCI6MiwiaSI6ZmFsc2V9", "node": { - "digest": "ywf9ak8rV9kDDx73zGH5vtTJkHmfxXHvLbSGhwAyxdM", + "digest": "7BPdUc3LpRmchBjPiSZ5Uju5yDZMbVhTQNYjDjmTXP5D", "sender": { "objects": { "edges": [ { - "cursor": "IAxPzPNh6DBZ+lqchUWSL6NuS4y4vgz6pHjStN6JWpF/DAAAAAAAAAA=" + "cursor": "IAliWgwcr8n37dkM7mZzjkkSDkpfTgEPI6/C9SsEvD4wDAAAAAAAAAA=" }, { - "cursor": "IBH2WwM6ABxADOrEJ86TGtH880uA4Ce8kx9mXnSZj2DYDAAAAAAAAAA=" + "cursor": "IBGzpWsWAJqwTtHNtSzMlcNw/lp0Q7mxGubPXWYv7SVDDAAAAAAAAAA=" }, { - "cursor": "IBoQDKT5WktB7OuMUXNBKsoqg3oDa0b1Dc7AIuqcPPDDDAAAAAAAAAA=" + "cursor": "IBOIPAp4MKzHgkh72/O/iMqkg160NT2TOG5zk0R8EOecDAAAAAAAAAA=" }, { - "cursor": "IBpSURhn9I1wJERwRFANEXqI98bagpRsksYuuwsrFFtQDAAAAAAAAAA=" + "cursor": "IH3dM0/kdjLFfKxIeE26rvsOqbgLFXHoXv2N1Adx93zqDAAAAAAAAAA=" }, { - "cursor": "IElmtyPGm1GRSMWeyj+lZFiOkrmPZ2oKnWeSNwmsAXf/DAAAAAAAAAA=" + "cursor": "IJwgTtRy13vdcto1Li65De5RV6AKz5dX/YGwgyYOZeC2DAAAAAAAAAA=" }, { - "cursor": "IGjIsZmGLOFhLkGROat6+WyaYp65xLf0mDp34jCyG3KsDAAAAAAAAAA=" + "cursor": "IJ9s1BXAi+CbOC283CRx1p7dE11yaTraKXAGeCk6JJ22DAAAAAAAAAA=" }, { - "cursor": "IH3CTzQfYFptQFnBjnyGfpphmbw0uuCt4JTcq1tQsIZRDAAAAAAAAAA=" + "cursor": "IMQLpfEhnQHF4QCZEHo91G+rv+6yBXtQFiTVqRnjt4bFDAAAAAAAAAA=" }, { - "cursor": "IOZ8ocIl02ZSSkdsdSrpt8BzDKmSCK2CZJpYvoPS+ilADAAAAAAAAAA=" + "cursor": "IOgqlyHReHTY5weyEZOqIFQo+bdy3dX6B6ZXq8EnpHkGDAAAAAAAAAA=" } ] } @@ -594,33 +594,33 @@ Response: { { "cursor": "eyJjIjoxMiwidCI6NCwiaSI6ZmFsc2V9", "node": { - "digest": "25MhkStEmB44afcLcmtdA426Qbo6a5z6sJrURSfn4wSM", + "digest": "3s48BKV1NGNPV5VRKFsAJKWiyUiWDLVxguSERpo8qRTV", "sender": { "objects": { "edges": [ { - "cursor": "IAxPzPNh6DBZ+lqchUWSL6NuS4y4vgz6pHjStN6JWpF/DAAAAAAAAAA=" + "cursor": "IAliWgwcr8n37dkM7mZzjkkSDkpfTgEPI6/C9SsEvD4wDAAAAAAAAAA=" }, { - "cursor": "IBH2WwM6ABxADOrEJ86TGtH880uA4Ce8kx9mXnSZj2DYDAAAAAAAAAA=" + "cursor": "IBGzpWsWAJqwTtHNtSzMlcNw/lp0Q7mxGubPXWYv7SVDDAAAAAAAAAA=" }, { - "cursor": "IBoQDKT5WktB7OuMUXNBKsoqg3oDa0b1Dc7AIuqcPPDDDAAAAAAAAAA=" + "cursor": "IBOIPAp4MKzHgkh72/O/iMqkg160NT2TOG5zk0R8EOecDAAAAAAAAAA=" }, { - "cursor": "IBpSURhn9I1wJERwRFANEXqI98bagpRsksYuuwsrFFtQDAAAAAAAAAA=" + "cursor": "IH3dM0/kdjLFfKxIeE26rvsOqbgLFXHoXv2N1Adx93zqDAAAAAAAAAA=" }, { - "cursor": "IElmtyPGm1GRSMWeyj+lZFiOkrmPZ2oKnWeSNwmsAXf/DAAAAAAAAAA=" + "cursor": "IJwgTtRy13vdcto1Li65De5RV6AKz5dX/YGwgyYOZeC2DAAAAAAAAAA=" }, { - "cursor": "IGjIsZmGLOFhLkGROat6+WyaYp65xLf0mDp34jCyG3KsDAAAAAAAAAA=" + "cursor": "IJ9s1BXAi+CbOC283CRx1p7dE11yaTraKXAGeCk6JJ22DAAAAAAAAAA=" }, { - "cursor": "IH3CTzQfYFptQFnBjnyGfpphmbw0uuCt4JTcq1tQsIZRDAAAAAAAAAA=" + "cursor": "IMQLpfEhnQHF4QCZEHo91G+rv+6yBXtQFiTVqRnjt4bFDAAAAAAAAAA=" }, { - "cursor": "IOZ8ocIl02ZSSkdsdSrpt8BzDKmSCK2CZJpYvoPS+ilADAAAAAAAAAA=" + "cursor": "IOgqlyHReHTY5weyEZOqIFQo+bdy3dX6B6ZXq8EnpHkGDAAAAAAAAAA=" } ] } @@ -630,33 +630,33 @@ Response: { { "cursor": "eyJjIjoxMiwidCI6NSwiaSI6ZmFsc2V9", "node": { - "digest": "Hutiw6GLNGCuRwMTZhxFW2CrYF6PYt2DomNMwtN1hLUo", + "digest": "6adEehTM2gxGKdumJXeKFwcaYhSB6RwGHbqg7Fv7JBmk", "sender": { "objects": { "edges": [ { - "cursor": "IAxPzPNh6DBZ+lqchUWSL6NuS4y4vgz6pHjStN6JWpF/DAAAAAAAAAA=" + "cursor": "IAliWgwcr8n37dkM7mZzjkkSDkpfTgEPI6/C9SsEvD4wDAAAAAAAAAA=" }, { - "cursor": "IBH2WwM6ABxADOrEJ86TGtH880uA4Ce8kx9mXnSZj2DYDAAAAAAAAAA=" + "cursor": "IBGzpWsWAJqwTtHNtSzMlcNw/lp0Q7mxGubPXWYv7SVDDAAAAAAAAAA=" }, { - "cursor": "IBoQDKT5WktB7OuMUXNBKsoqg3oDa0b1Dc7AIuqcPPDDDAAAAAAAAAA=" + "cursor": "IBOIPAp4MKzHgkh72/O/iMqkg160NT2TOG5zk0R8EOecDAAAAAAAAAA=" }, { - "cursor": "IBpSURhn9I1wJERwRFANEXqI98bagpRsksYuuwsrFFtQDAAAAAAAAAA=" + "cursor": "IH3dM0/kdjLFfKxIeE26rvsOqbgLFXHoXv2N1Adx93zqDAAAAAAAAAA=" }, { - "cursor": "IElmtyPGm1GRSMWeyj+lZFiOkrmPZ2oKnWeSNwmsAXf/DAAAAAAAAAA=" + "cursor": "IJwgTtRy13vdcto1Li65De5RV6AKz5dX/YGwgyYOZeC2DAAAAAAAAAA=" }, { - "cursor": "IGjIsZmGLOFhLkGROat6+WyaYp65xLf0mDp34jCyG3KsDAAAAAAAAAA=" + "cursor": "IJ9s1BXAi+CbOC283CRx1p7dE11yaTraKXAGeCk6JJ22DAAAAAAAAAA=" }, { - "cursor": "IH3CTzQfYFptQFnBjnyGfpphmbw0uuCt4JTcq1tQsIZRDAAAAAAAAAA=" + "cursor": "IMQLpfEhnQHF4QCZEHo91G+rv+6yBXtQFiTVqRnjt4bFDAAAAAAAAAA=" }, { - "cursor": "IOZ8ocIl02ZSSkdsdSrpt8BzDKmSCK2CZJpYvoPS+ilADAAAAAAAAAA=" + "cursor": "IOgqlyHReHTY5weyEZOqIFQo+bdy3dX6B6ZXq8EnpHkGDAAAAAAAAAA=" } ] } @@ -666,33 +666,33 @@ Response: { { "cursor": "eyJjIjoxMiwidCI6NiwiaSI6ZmFsc2V9", "node": { - "digest": "4YeKsZh5nDLNfbNVT2GRwenv1gvaVdDde9BASgiBqkv8", + "digest": "E4Lt2ME1UNXjXnuVzF9CMyrHnhdQWbWRXj3myqpzZMrP", "sender": { "objects": { "edges": [ { - "cursor": "IAxPzPNh6DBZ+lqchUWSL6NuS4y4vgz6pHjStN6JWpF/DAAAAAAAAAA=" + "cursor": "IAliWgwcr8n37dkM7mZzjkkSDkpfTgEPI6/C9SsEvD4wDAAAAAAAAAA=" }, { - "cursor": "IBH2WwM6ABxADOrEJ86TGtH880uA4Ce8kx9mXnSZj2DYDAAAAAAAAAA=" + "cursor": "IBGzpWsWAJqwTtHNtSzMlcNw/lp0Q7mxGubPXWYv7SVDDAAAAAAAAAA=" }, { - "cursor": "IBoQDKT5WktB7OuMUXNBKsoqg3oDa0b1Dc7AIuqcPPDDDAAAAAAAAAA=" + "cursor": "IBOIPAp4MKzHgkh72/O/iMqkg160NT2TOG5zk0R8EOecDAAAAAAAAAA=" }, { - "cursor": "IBpSURhn9I1wJERwRFANEXqI98bagpRsksYuuwsrFFtQDAAAAAAAAAA=" + "cursor": "IH3dM0/kdjLFfKxIeE26rvsOqbgLFXHoXv2N1Adx93zqDAAAAAAAAAA=" }, { - "cursor": "IElmtyPGm1GRSMWeyj+lZFiOkrmPZ2oKnWeSNwmsAXf/DAAAAAAAAAA=" + "cursor": "IJwgTtRy13vdcto1Li65De5RV6AKz5dX/YGwgyYOZeC2DAAAAAAAAAA=" }, { - "cursor": "IGjIsZmGLOFhLkGROat6+WyaYp65xLf0mDp34jCyG3KsDAAAAAAAAAA=" + "cursor": "IJ9s1BXAi+CbOC283CRx1p7dE11yaTraKXAGeCk6JJ22DAAAAAAAAAA=" }, { - "cursor": "IH3CTzQfYFptQFnBjnyGfpphmbw0uuCt4JTcq1tQsIZRDAAAAAAAAAA=" + "cursor": "IMQLpfEhnQHF4QCZEHo91G+rv+6yBXtQFiTVqRnjt4bFDAAAAAAAAAA=" }, { - "cursor": "IOZ8ocIl02ZSSkdsdSrpt8BzDKmSCK2CZJpYvoPS+ilADAAAAAAAAAA=" + "cursor": "IOgqlyHReHTY5weyEZOqIFQo+bdy3dX6B6ZXq8EnpHkGDAAAAAAAAAA=" } ] } @@ -702,33 +702,33 @@ Response: { { "cursor": "eyJjIjoxMiwidCI6OCwiaSI6ZmFsc2V9", "node": { - "digest": "EnghHbuhpcGuNpC1L2iqikieXAyHJUnanzg5urDmwgdz", + "digest": "DEYu7BBRqZyroncK1on7suMYzHy7GLJMoSsC6K8d14BR", "sender": { "objects": { "edges": [ { - "cursor": "IAxPzPNh6DBZ+lqchUWSL6NuS4y4vgz6pHjStN6JWpF/DAAAAAAAAAA=" + "cursor": "IAliWgwcr8n37dkM7mZzjkkSDkpfTgEPI6/C9SsEvD4wDAAAAAAAAAA=" }, { - "cursor": "IBH2WwM6ABxADOrEJ86TGtH880uA4Ce8kx9mXnSZj2DYDAAAAAAAAAA=" + "cursor": "IBGzpWsWAJqwTtHNtSzMlcNw/lp0Q7mxGubPXWYv7SVDDAAAAAAAAAA=" }, { - "cursor": "IBoQDKT5WktB7OuMUXNBKsoqg3oDa0b1Dc7AIuqcPPDDDAAAAAAAAAA=" + "cursor": "IBOIPAp4MKzHgkh72/O/iMqkg160NT2TOG5zk0R8EOecDAAAAAAAAAA=" }, { - "cursor": "IBpSURhn9I1wJERwRFANEXqI98bagpRsksYuuwsrFFtQDAAAAAAAAAA=" + "cursor": "IH3dM0/kdjLFfKxIeE26rvsOqbgLFXHoXv2N1Adx93zqDAAAAAAAAAA=" }, { - "cursor": "IElmtyPGm1GRSMWeyj+lZFiOkrmPZ2oKnWeSNwmsAXf/DAAAAAAAAAA=" + "cursor": "IJwgTtRy13vdcto1Li65De5RV6AKz5dX/YGwgyYOZeC2DAAAAAAAAAA=" }, { - "cursor": "IGjIsZmGLOFhLkGROat6+WyaYp65xLf0mDp34jCyG3KsDAAAAAAAAAA=" + "cursor": "IJ9s1BXAi+CbOC283CRx1p7dE11yaTraKXAGeCk6JJ22DAAAAAAAAAA=" }, { - "cursor": "IH3CTzQfYFptQFnBjnyGfpphmbw0uuCt4JTcq1tQsIZRDAAAAAAAAAA=" + "cursor": "IMQLpfEhnQHF4QCZEHo91G+rv+6yBXtQFiTVqRnjt4bFDAAAAAAAAAA=" }, { - "cursor": "IOZ8ocIl02ZSSkdsdSrpt8BzDKmSCK2CZJpYvoPS+ilADAAAAAAAAAA=" + "cursor": "IOgqlyHReHTY5weyEZOqIFQo+bdy3dX6B6ZXq8EnpHkGDAAAAAAAAAA=" } ] } @@ -738,33 +738,33 @@ Response: { { "cursor": "eyJjIjoxMiwidCI6OSwiaSI6ZmFsc2V9", "node": { - "digest": "9G4gNmS2XYetMxBty65fKfx9iDRBetdpdNZuyK7oRd6c", + "digest": "32S1CoAgaGv7diFo2Bs7StnPB7Aakoma1JUT4k4cUpA7", "sender": { "objects": { "edges": [ { - "cursor": "IAxPzPNh6DBZ+lqchUWSL6NuS4y4vgz6pHjStN6JWpF/DAAAAAAAAAA=" + "cursor": "IAliWgwcr8n37dkM7mZzjkkSDkpfTgEPI6/C9SsEvD4wDAAAAAAAAAA=" }, { - "cursor": "IBH2WwM6ABxADOrEJ86TGtH880uA4Ce8kx9mXnSZj2DYDAAAAAAAAAA=" + "cursor": "IBGzpWsWAJqwTtHNtSzMlcNw/lp0Q7mxGubPXWYv7SVDDAAAAAAAAAA=" }, { - "cursor": "IBoQDKT5WktB7OuMUXNBKsoqg3oDa0b1Dc7AIuqcPPDDDAAAAAAAAAA=" + "cursor": "IBOIPAp4MKzHgkh72/O/iMqkg160NT2TOG5zk0R8EOecDAAAAAAAAAA=" }, { - "cursor": "IBpSURhn9I1wJERwRFANEXqI98bagpRsksYuuwsrFFtQDAAAAAAAAAA=" + "cursor": "IH3dM0/kdjLFfKxIeE26rvsOqbgLFXHoXv2N1Adx93zqDAAAAAAAAAA=" }, { - "cursor": "IElmtyPGm1GRSMWeyj+lZFiOkrmPZ2oKnWeSNwmsAXf/DAAAAAAAAAA=" + "cursor": "IJwgTtRy13vdcto1Li65De5RV6AKz5dX/YGwgyYOZeC2DAAAAAAAAAA=" }, { - "cursor": "IGjIsZmGLOFhLkGROat6+WyaYp65xLf0mDp34jCyG3KsDAAAAAAAAAA=" + "cursor": "IJ9s1BXAi+CbOC283CRx1p7dE11yaTraKXAGeCk6JJ22DAAAAAAAAAA=" }, { - "cursor": "IH3CTzQfYFptQFnBjnyGfpphmbw0uuCt4JTcq1tQsIZRDAAAAAAAAAA=" + "cursor": "IMQLpfEhnQHF4QCZEHo91G+rv+6yBXtQFiTVqRnjt4bFDAAAAAAAAAA=" }, { - "cursor": "IOZ8ocIl02ZSSkdsdSrpt8BzDKmSCK2CZJpYvoPS+ilADAAAAAAAAAA=" + "cursor": "IOgqlyHReHTY5weyEZOqIFQo+bdy3dX6B6ZXq8EnpHkGDAAAAAAAAAA=" } ] } @@ -774,33 +774,33 @@ Response: { { "cursor": "eyJjIjoxMiwidCI6MTAsImkiOmZhbHNlfQ", "node": { - "digest": "3ivB1ebWRpc4Si1vd8tsSY7XwaY7DrumxdS3KdXyZLVr", + "digest": "3gEc6E6ypnwUqRtVBcF3ZwXPEQJaisXDDaK21p4sZyM8", "sender": { "objects": { "edges": [ { - "cursor": "IAxPzPNh6DBZ+lqchUWSL6NuS4y4vgz6pHjStN6JWpF/DAAAAAAAAAA=" + "cursor": "IAliWgwcr8n37dkM7mZzjkkSDkpfTgEPI6/C9SsEvD4wDAAAAAAAAAA=" }, { - "cursor": "IBH2WwM6ABxADOrEJ86TGtH880uA4Ce8kx9mXnSZj2DYDAAAAAAAAAA=" + "cursor": "IBGzpWsWAJqwTtHNtSzMlcNw/lp0Q7mxGubPXWYv7SVDDAAAAAAAAAA=" }, { - "cursor": "IBoQDKT5WktB7OuMUXNBKsoqg3oDa0b1Dc7AIuqcPPDDDAAAAAAAAAA=" + "cursor": "IBOIPAp4MKzHgkh72/O/iMqkg160NT2TOG5zk0R8EOecDAAAAAAAAAA=" }, { - "cursor": "IBpSURhn9I1wJERwRFANEXqI98bagpRsksYuuwsrFFtQDAAAAAAAAAA=" + "cursor": "IH3dM0/kdjLFfKxIeE26rvsOqbgLFXHoXv2N1Adx93zqDAAAAAAAAAA=" }, { - "cursor": "IElmtyPGm1GRSMWeyj+lZFiOkrmPZ2oKnWeSNwmsAXf/DAAAAAAAAAA=" + "cursor": "IJwgTtRy13vdcto1Li65De5RV6AKz5dX/YGwgyYOZeC2DAAAAAAAAAA=" }, { - "cursor": "IGjIsZmGLOFhLkGROat6+WyaYp65xLf0mDp34jCyG3KsDAAAAAAAAAA=" + "cursor": "IJ9s1BXAi+CbOC283CRx1p7dE11yaTraKXAGeCk6JJ22DAAAAAAAAAA=" }, { - "cursor": "IH3CTzQfYFptQFnBjnyGfpphmbw0uuCt4JTcq1tQsIZRDAAAAAAAAAA=" + "cursor": "IMQLpfEhnQHF4QCZEHo91G+rv+6yBXtQFiTVqRnjt4bFDAAAAAAAAAA=" }, { - "cursor": "IOZ8ocIl02ZSSkdsdSrpt8BzDKmSCK2CZJpYvoPS+ilADAAAAAAAAAA=" + "cursor": "IOgqlyHReHTY5weyEZOqIFQo+bdy3dX6B6ZXq8EnpHkGDAAAAAAAAAA=" } ] } diff --git a/crates/iota-graphql-e2e-tests/tests/consistency/epochs/transaction_blocks.move b/crates/iota-graphql-e2e-tests/tests/consistency/epochs/transaction_blocks.move index c380d3c57d7..630fc53f989 100644 --- a/crates/iota-graphql-e2e-tests/tests/consistency/epochs/transaction_blocks.move +++ b/crates/iota-graphql-e2e-tests/tests/consistency/epochs/transaction_blocks.move @@ -18,7 +18,7 @@ // 11 | epoch | 11 | 2 // 12 | epoch | 12 | 3 -//# init --protocol-version 1 --addresses Test=0x0 --accounts A B --simulator +//# init --protocol-version 3 --addresses Test=0x0 --accounts A B --simulator //# publish module Test::M1 { diff --git a/crates/iota-graphql-e2e-tests/tests/consistency/object_at_version.exp b/crates/iota-graphql-e2e-tests/tests/consistency/object_at_version.exp index 6e02483be2f..36ce838def2 100644 --- a/crates/iota-graphql-e2e-tests/tests/consistency/object_at_version.exp +++ b/crates/iota-graphql-e2e-tests/tests/consistency/object_at_version.exp @@ -29,7 +29,7 @@ Response: { "asMoveObject": { "contents": { "json": { - "id": "0xc9cc2d86cf85f0448da63718fd5e7d0e47f4a707561d2f1ddcb46eabc0dcf382", + "id": "0xf10a93d3a78211ff333d9be01524d9c2275cba2d6b6334d94a6a7505e0e95a9e", "value": "0" } } @@ -57,7 +57,7 @@ Response: { "asMoveObject": { "contents": { "json": { - "id": "0xc9cc2d86cf85f0448da63718fd5e7d0e47f4a707561d2f1ddcb46eabc0dcf382", + "id": "0xf10a93d3a78211ff333d9be01524d9c2275cba2d6b6334d94a6a7505e0e95a9e", "value": "1" } } @@ -69,7 +69,7 @@ Response: { "asMoveObject": { "contents": { "json": { - "id": "0xc9cc2d86cf85f0448da63718fd5e7d0e47f4a707561d2f1ddcb46eabc0dcf382", + "id": "0xf10a93d3a78211ff333d9be01524d9c2275cba2d6b6334d94a6a7505e0e95a9e", "value": "0" } } @@ -104,7 +104,7 @@ Response: { "asMoveObject": { "contents": { "json": { - "id": "0xc9cc2d86cf85f0448da63718fd5e7d0e47f4a707561d2f1ddcb46eabc0dcf382", + "id": "0xf10a93d3a78211ff333d9be01524d9c2275cba2d6b6334d94a6a7505e0e95a9e", "value": "1" } } @@ -134,7 +134,7 @@ Response: { "asMoveObject": { "contents": { "json": { - "id": "0xc9cc2d86cf85f0448da63718fd5e7d0e47f4a707561d2f1ddcb46eabc0dcf382", + "id": "0xf10a93d3a78211ff333d9be01524d9c2275cba2d6b6334d94a6a7505e0e95a9e", "value": "1" } } @@ -151,7 +151,7 @@ Response: { "asMoveObject": { "contents": { "json": { - "id": "0xc9cc2d86cf85f0448da63718fd5e7d0e47f4a707561d2f1ddcb46eabc0dcf382", + "id": "0xf10a93d3a78211ff333d9be01524d9c2275cba2d6b6334d94a6a7505e0e95a9e", "value": "0" } } @@ -205,7 +205,7 @@ Response: { "asMoveObject": { "contents": { "json": { - "id": "0xc9cc2d86cf85f0448da63718fd5e7d0e47f4a707561d2f1ddcb46eabc0dcf382", + "id": "0xf10a93d3a78211ff333d9be01524d9c2275cba2d6b6334d94a6a7505e0e95a9e", "value": "1" } } @@ -222,7 +222,7 @@ Response: { "asMoveObject": { "contents": { "json": { - "id": "0xc9cc2d86cf85f0448da63718fd5e7d0e47f4a707561d2f1ddcb46eabc0dcf382", + "id": "0xf10a93d3a78211ff333d9be01524d9c2275cba2d6b6334d94a6a7505e0e95a9e", "value": "0" } } diff --git a/crates/iota-graphql-e2e-tests/tests/consistency/object_at_version.move b/crates/iota-graphql-e2e-tests/tests/consistency/object_at_version.move index a41d3e6364b..6094a6d0c4e 100644 --- a/crates/iota-graphql-e2e-tests/tests/consistency/object_at_version.move +++ b/crates/iota-graphql-e2e-tests/tests/consistency/object_at_version.move @@ -15,7 +15,7 @@ // checkpoint 4. The object would only be visible at version 6 from objects_snapshot, and at version // 7 from objects_history. -//# init --protocol-version 1 --addresses Test=0x0 --accounts A --simulator +//# init --protocol-version 3 --addresses Test=0x0 --accounts A --simulator //# publish module Test::M1 { diff --git a/crates/iota-graphql-e2e-tests/tests/consistency/objects_pagination.exp b/crates/iota-graphql-e2e-tests/tests/consistency/objects_pagination.exp index 0de0dc4a041..016b20d8dab 100644 --- a/crates/iota-graphql-e2e-tests/tests/consistency/objects_pagination.exp +++ b/crates/iota-graphql-e2e-tests/tests/consistency/objects_pagination.exp @@ -36,10 +36,10 @@ Response: { "version": 4, "contents": { "type": { - "repr": "0xf497316682c0ad2d0b757399e9db83e3ed3bceadaedbaad12029111c331445d4::M1::Object" + "repr": "0x6b62cc078a121fab1252edd6ab185f82952cc9fbb4d48995701f1967395137b7::M1::Object" }, "json": { - "id": "0x99897a446d53989defb6e160415609c939386acbbf3a5064839e13bdc9910da7", + "id": "0xf8a39541f76820d0a241fad3ce1ad92b9e0aaba58725c8f656fc2bd76e94ba55", "value": "1" } } @@ -80,10 +80,10 @@ Response: { "version": 4, "contents": { "type": { - "repr": "0xf497316682c0ad2d0b757399e9db83e3ed3bceadaedbaad12029111c331445d4::M1::Object" + "repr": "0x6b62cc078a121fab1252edd6ab185f82952cc9fbb4d48995701f1967395137b7::M1::Object" }, "json": { - "id": "0x99897a446d53989defb6e160415609c939386acbbf3a5064839e13bdc9910da7", + "id": "0xf8a39541f76820d0a241fad3ce1ad92b9e0aaba58725c8f656fc2bd76e94ba55", "value": "1" } } @@ -108,10 +108,10 @@ Response: { "version": 3, "contents": { "type": { - "repr": "0xf497316682c0ad2d0b757399e9db83e3ed3bceadaedbaad12029111c331445d4::M1::Object" + "repr": "0x6b62cc078a121fab1252edd6ab185f82952cc9fbb4d48995701f1967395137b7::M1::Object" }, "json": { - "id": "0x0196134211788ab305d30e0f558ba451f6c65681c965e4ae1d1fbf4ce138aafa", + "id": "0x6f0747e131cf59b36487d82b0c890fd1075e09966a2befda7c37131cb12db6c1", "value": "0" } } @@ -120,35 +120,35 @@ Response: { "version": 5, "contents": { "type": { - "repr": "0xf497316682c0ad2d0b757399e9db83e3ed3bceadaedbaad12029111c331445d4::M1::Object" + "repr": "0x6b62cc078a121fab1252edd6ab185f82952cc9fbb4d48995701f1967395137b7::M1::Object" }, "json": { - "id": "0x594943312691aa8916bbfc715d0c40044122de94f608d2a1cbb0c6dc49486075", + "id": "0x7c56aa41384c3229d05ac087c1434fbcbe2885285e8a3e167a71f65fff383377", "value": "2" } } }, { - "version": 4, + "version": 6, "contents": { "type": { - "repr": "0xf497316682c0ad2d0b757399e9db83e3ed3bceadaedbaad12029111c331445d4::M1::Object" + "repr": "0x6b62cc078a121fab1252edd6ab185f82952cc9fbb4d48995701f1967395137b7::M1::Object" }, "json": { - "id": "0x99897a446d53989defb6e160415609c939386acbbf3a5064839e13bdc9910da7", - "value": "1" + "id": "0x940bb12ed38c05a8a88d940203d0986bedb550f050dfe610fadebd8446e96409", + "value": "3" } } }, { - "version": 6, + "version": 4, "contents": { "type": { - "repr": "0xf497316682c0ad2d0b757399e9db83e3ed3bceadaedbaad12029111c331445d4::M1::Object" + "repr": "0x6b62cc078a121fab1252edd6ab185f82952cc9fbb4d48995701f1967395137b7::M1::Object" }, "json": { - "id": "0xc41ad14789a46af2b7dd52aa001acfca2193147e06751a9d324c9aec011f5b54", - "value": "3" + "id": "0xf8a39541f76820d0a241fad3ce1ad92b9e0aaba58725c8f656fc2bd76e94ba55", + "value": "1" } } } @@ -169,10 +169,10 @@ Response: { "version": 3, "contents": { "type": { - "repr": "0xf497316682c0ad2d0b757399e9db83e3ed3bceadaedbaad12029111c331445d4::M1::Object" + "repr": "0x6b62cc078a121fab1252edd6ab185f82952cc9fbb4d48995701f1967395137b7::M1::Object" }, "json": { - "id": "0x0196134211788ab305d30e0f558ba451f6c65681c965e4ae1d1fbf4ce138aafa", + "id": "0x6f0747e131cf59b36487d82b0c890fd1075e09966a2befda7c37131cb12db6c1", "value": "0" } } @@ -181,35 +181,35 @@ Response: { "version": 5, "contents": { "type": { - "repr": "0xf497316682c0ad2d0b757399e9db83e3ed3bceadaedbaad12029111c331445d4::M1::Object" + "repr": "0x6b62cc078a121fab1252edd6ab185f82952cc9fbb4d48995701f1967395137b7::M1::Object" }, "json": { - "id": "0x594943312691aa8916bbfc715d0c40044122de94f608d2a1cbb0c6dc49486075", + "id": "0x7c56aa41384c3229d05ac087c1434fbcbe2885285e8a3e167a71f65fff383377", "value": "2" } } }, { - "version": 4, + "version": 6, "contents": { "type": { - "repr": "0xf497316682c0ad2d0b757399e9db83e3ed3bceadaedbaad12029111c331445d4::M1::Object" + "repr": "0x6b62cc078a121fab1252edd6ab185f82952cc9fbb4d48995701f1967395137b7::M1::Object" }, "json": { - "id": "0x99897a446d53989defb6e160415609c939386acbbf3a5064839e13bdc9910da7", - "value": "1" + "id": "0x940bb12ed38c05a8a88d940203d0986bedb550f050dfe610fadebd8446e96409", + "value": "3" } } }, { - "version": 6, + "version": 4, "contents": { "type": { - "repr": "0xf497316682c0ad2d0b757399e9db83e3ed3bceadaedbaad12029111c331445d4::M1::Object" + "repr": "0x6b62cc078a121fab1252edd6ab185f82952cc9fbb4d48995701f1967395137b7::M1::Object" }, "json": { - "id": "0xc41ad14789a46af2b7dd52aa001acfca2193147e06751a9d324c9aec011f5b54", - "value": "3" + "id": "0xf8a39541f76820d0a241fad3ce1ad92b9e0aaba58725c8f656fc2bd76e94ba55", + "value": "1" } } } @@ -237,14 +237,14 @@ Response: { "objects": { "nodes": [ { - "version": 4, + "version": 6, "contents": { "type": { - "repr": "0xf497316682c0ad2d0b757399e9db83e3ed3bceadaedbaad12029111c331445d4::M1::Object" + "repr": "0x6b62cc078a121fab1252edd6ab185f82952cc9fbb4d48995701f1967395137b7::M1::Object" }, "json": { - "id": "0x99897a446d53989defb6e160415609c939386acbbf3a5064839e13bdc9910da7", - "value": "1" + "id": "0x940bb12ed38c05a8a88d940203d0986bedb550f050dfe610fadebd8446e96409", + "value": "3" } }, "owner_at_latest_state_has_iota_only": { @@ -255,61 +255,61 @@ Response: { "version": 3, "contents": { "type": { - "repr": "0xf497316682c0ad2d0b757399e9db83e3ed3bceadaedbaad12029111c331445d4::M1::Object" + "repr": "0x6b62cc078a121fab1252edd6ab185f82952cc9fbb4d48995701f1967395137b7::M1::Object" }, "json": { - "id": "0x0196134211788ab305d30e0f558ba451f6c65681c965e4ae1d1fbf4ce138aafa", + "id": "0x6f0747e131cf59b36487d82b0c890fd1075e09966a2befda7c37131cb12db6c1", "value": "0" } } }, { - "version": 1, + "version": 5, "contents": { "type": { - "repr": "0x0000000000000000000000000000000000000000000000000000000000000002::coin::Coin<0x0000000000000000000000000000000000000000000000000000000000000002::iota::IOTA>" + "repr": "0x6b62cc078a121fab1252edd6ab185f82952cc9fbb4d48995701f1967395137b7::M1::Object" }, "json": { - "id": "0x1a52511867f48d7024447044500d117a88f7c6da82946c92c62ebb0b2b145b50", - "balance": { - "value": "300000000000000" - } + "id": "0x7c56aa41384c3229d05ac087c1434fbcbe2885285e8a3e167a71f65fff383377", + "value": "2" } } }, { - "version": 5, + "version": 6, "contents": { "type": { - "repr": "0xf497316682c0ad2d0b757399e9db83e3ed3bceadaedbaad12029111c331445d4::M1::Object" + "repr": "0x6b62cc078a121fab1252edd6ab185f82952cc9fbb4d48995701f1967395137b7::M1::Object" }, "json": { - "id": "0x594943312691aa8916bbfc715d0c40044122de94f608d2a1cbb0c6dc49486075", - "value": "2" + "id": "0x940bb12ed38c05a8a88d940203d0986bedb550f050dfe610fadebd8446e96409", + "value": "3" } } }, { - "version": 4, + "version": 1, "contents": { "type": { - "repr": "0xf497316682c0ad2d0b757399e9db83e3ed3bceadaedbaad12029111c331445d4::M1::Object" + "repr": "0x0000000000000000000000000000000000000000000000000000000000000002::coin::Coin<0x0000000000000000000000000000000000000000000000000000000000000002::iota::IOTA>" }, "json": { - "id": "0x99897a446d53989defb6e160415609c939386acbbf3a5064839e13bdc9910da7", - "value": "1" + "id": "0x9f6cd415c08be09b382dbcdc2471d69edd135d72693ada29700678293a249db6", + "balance": { + "value": "300000000000000" + } } } }, { - "version": 6, + "version": 4, "contents": { "type": { - "repr": "0xf497316682c0ad2d0b757399e9db83e3ed3bceadaedbaad12029111c331445d4::M1::Object" + "repr": "0x6b62cc078a121fab1252edd6ab185f82952cc9fbb4d48995701f1967395137b7::M1::Object" }, "json": { - "id": "0xc41ad14789a46af2b7dd52aa001acfca2193147e06751a9d324c9aec011f5b54", - "value": "3" + "id": "0xf8a39541f76820d0a241fad3ce1ad92b9e0aaba58725c8f656fc2bd76e94ba55", + "value": "1" } } } @@ -319,14 +319,14 @@ Response: { } }, { - "version": 6, + "version": 4, "contents": { "type": { - "repr": "0xf497316682c0ad2d0b757399e9db83e3ed3bceadaedbaad12029111c331445d4::M1::Object" + "repr": "0x6b62cc078a121fab1252edd6ab185f82952cc9fbb4d48995701f1967395137b7::M1::Object" }, "json": { - "id": "0xc41ad14789a46af2b7dd52aa001acfca2193147e06751a9d324c9aec011f5b54", - "value": "3" + "id": "0xf8a39541f76820d0a241fad3ce1ad92b9e0aaba58725c8f656fc2bd76e94ba55", + "value": "1" } }, "owner_at_latest_state_has_iota_only": { @@ -337,61 +337,61 @@ Response: { "version": 3, "contents": { "type": { - "repr": "0xf497316682c0ad2d0b757399e9db83e3ed3bceadaedbaad12029111c331445d4::M1::Object" + "repr": "0x6b62cc078a121fab1252edd6ab185f82952cc9fbb4d48995701f1967395137b7::M1::Object" }, "json": { - "id": "0x0196134211788ab305d30e0f558ba451f6c65681c965e4ae1d1fbf4ce138aafa", + "id": "0x6f0747e131cf59b36487d82b0c890fd1075e09966a2befda7c37131cb12db6c1", "value": "0" } } }, { - "version": 1, + "version": 5, "contents": { "type": { - "repr": "0x0000000000000000000000000000000000000000000000000000000000000002::coin::Coin<0x0000000000000000000000000000000000000000000000000000000000000002::iota::IOTA>" + "repr": "0x6b62cc078a121fab1252edd6ab185f82952cc9fbb4d48995701f1967395137b7::M1::Object" }, "json": { - "id": "0x1a52511867f48d7024447044500d117a88f7c6da82946c92c62ebb0b2b145b50", - "balance": { - "value": "300000000000000" - } + "id": "0x7c56aa41384c3229d05ac087c1434fbcbe2885285e8a3e167a71f65fff383377", + "value": "2" } } }, { - "version": 5, + "version": 6, "contents": { "type": { - "repr": "0xf497316682c0ad2d0b757399e9db83e3ed3bceadaedbaad12029111c331445d4::M1::Object" + "repr": "0x6b62cc078a121fab1252edd6ab185f82952cc9fbb4d48995701f1967395137b7::M1::Object" }, "json": { - "id": "0x594943312691aa8916bbfc715d0c40044122de94f608d2a1cbb0c6dc49486075", - "value": "2" + "id": "0x940bb12ed38c05a8a88d940203d0986bedb550f050dfe610fadebd8446e96409", + "value": "3" } } }, { - "version": 4, + "version": 1, "contents": { "type": { - "repr": "0xf497316682c0ad2d0b757399e9db83e3ed3bceadaedbaad12029111c331445d4::M1::Object" + "repr": "0x0000000000000000000000000000000000000000000000000000000000000002::coin::Coin<0x0000000000000000000000000000000000000000000000000000000000000002::iota::IOTA>" }, "json": { - "id": "0x99897a446d53989defb6e160415609c939386acbbf3a5064839e13bdc9910da7", - "value": "1" + "id": "0x9f6cd415c08be09b382dbcdc2471d69edd135d72693ada29700678293a249db6", + "balance": { + "value": "300000000000000" + } } } }, { - "version": 6, + "version": 4, "contents": { "type": { - "repr": "0xf497316682c0ad2d0b757399e9db83e3ed3bceadaedbaad12029111c331445d4::M1::Object" + "repr": "0x6b62cc078a121fab1252edd6ab185f82952cc9fbb4d48995701f1967395137b7::M1::Object" }, "json": { - "id": "0xc41ad14789a46af2b7dd52aa001acfca2193147e06751a9d324c9aec011f5b54", - "value": "3" + "id": "0xf8a39541f76820d0a241fad3ce1ad92b9e0aaba58725c8f656fc2bd76e94ba55", + "value": "1" } } } @@ -410,10 +410,10 @@ Response: { "asMoveObject": { "contents": { "type": { - "repr": "0xf497316682c0ad2d0b757399e9db83e3ed3bceadaedbaad12029111c331445d4::M1::Object" + "repr": "0x6b62cc078a121fab1252edd6ab185f82952cc9fbb4d48995701f1967395137b7::M1::Object" }, "json": { - "id": "0x0196134211788ab305d30e0f558ba451f6c65681c965e4ae1d1fbf4ce138aafa", + "id": "0x6f0747e131cf59b36487d82b0c890fd1075e09966a2befda7c37131cb12db6c1", "value": "0" } }, @@ -425,61 +425,61 @@ Response: { "version": 3, "contents": { "type": { - "repr": "0xf497316682c0ad2d0b757399e9db83e3ed3bceadaedbaad12029111c331445d4::M1::Object" + "repr": "0x6b62cc078a121fab1252edd6ab185f82952cc9fbb4d48995701f1967395137b7::M1::Object" }, "json": { - "id": "0x0196134211788ab305d30e0f558ba451f6c65681c965e4ae1d1fbf4ce138aafa", + "id": "0x6f0747e131cf59b36487d82b0c890fd1075e09966a2befda7c37131cb12db6c1", "value": "0" } } }, { - "version": 1, + "version": 5, "contents": { "type": { - "repr": "0x0000000000000000000000000000000000000000000000000000000000000002::coin::Coin<0x0000000000000000000000000000000000000000000000000000000000000002::iota::IOTA>" + "repr": "0x6b62cc078a121fab1252edd6ab185f82952cc9fbb4d48995701f1967395137b7::M1::Object" }, "json": { - "id": "0x1a52511867f48d7024447044500d117a88f7c6da82946c92c62ebb0b2b145b50", - "balance": { - "value": "300000000000000" - } + "id": "0x7c56aa41384c3229d05ac087c1434fbcbe2885285e8a3e167a71f65fff383377", + "value": "2" } } }, { - "version": 5, + "version": 6, "contents": { "type": { - "repr": "0xf497316682c0ad2d0b757399e9db83e3ed3bceadaedbaad12029111c331445d4::M1::Object" + "repr": "0x6b62cc078a121fab1252edd6ab185f82952cc9fbb4d48995701f1967395137b7::M1::Object" }, "json": { - "id": "0x594943312691aa8916bbfc715d0c40044122de94f608d2a1cbb0c6dc49486075", - "value": "2" + "id": "0x940bb12ed38c05a8a88d940203d0986bedb550f050dfe610fadebd8446e96409", + "value": "3" } } }, { - "version": 4, + "version": 1, "contents": { "type": { - "repr": "0xf497316682c0ad2d0b757399e9db83e3ed3bceadaedbaad12029111c331445d4::M1::Object" + "repr": "0x0000000000000000000000000000000000000000000000000000000000000002::coin::Coin<0x0000000000000000000000000000000000000000000000000000000000000002::iota::IOTA>" }, "json": { - "id": "0x99897a446d53989defb6e160415609c939386acbbf3a5064839e13bdc9910da7", - "value": "1" + "id": "0x9f6cd415c08be09b382dbcdc2471d69edd135d72693ada29700678293a249db6", + "balance": { + "value": "300000000000000" + } } } }, { - "version": 6, + "version": 4, "contents": { "type": { - "repr": "0xf497316682c0ad2d0b757399e9db83e3ed3bceadaedbaad12029111c331445d4::M1::Object" + "repr": "0x6b62cc078a121fab1252edd6ab185f82952cc9fbb4d48995701f1967395137b7::M1::Object" }, "json": { - "id": "0xc41ad14789a46af2b7dd52aa001acfca2193147e06751a9d324c9aec011f5b54", - "value": "3" + "id": "0xf8a39541f76820d0a241fad3ce1ad92b9e0aaba58725c8f656fc2bd76e94ba55", + "value": "1" } } } @@ -544,10 +544,10 @@ Response: { "version": 7, "contents": { "type": { - "repr": "0xf497316682c0ad2d0b757399e9db83e3ed3bceadaedbaad12029111c331445d4::M1::Object" + "repr": "0x6b62cc078a121fab1252edd6ab185f82952cc9fbb4d48995701f1967395137b7::M1::Object" }, "json": { - "id": "0x0196134211788ab305d30e0f558ba451f6c65681c965e4ae1d1fbf4ce138aafa", + "id": "0x6f0747e131cf59b36487d82b0c890fd1075e09966a2befda7c37131cb12db6c1", "value": "0" } } @@ -556,10 +556,10 @@ Response: { "version": 7, "contents": { "type": { - "repr": "0xf497316682c0ad2d0b757399e9db83e3ed3bceadaedbaad12029111c331445d4::M1::Object" + "repr": "0x6b62cc078a121fab1252edd6ab185f82952cc9fbb4d48995701f1967395137b7::M1::Object" }, "json": { - "id": "0x594943312691aa8916bbfc715d0c40044122de94f608d2a1cbb0c6dc49486075", + "id": "0x7c56aa41384c3229d05ac087c1434fbcbe2885285e8a3e167a71f65fff383377", "value": "2" } } @@ -568,11 +568,11 @@ Response: { "version": 7, "contents": { "type": { - "repr": "0xf497316682c0ad2d0b757399e9db83e3ed3bceadaedbaad12029111c331445d4::M1::Object" + "repr": "0x6b62cc078a121fab1252edd6ab185f82952cc9fbb4d48995701f1967395137b7::M1::Object" }, "json": { - "id": "0x99897a446d53989defb6e160415609c939386acbbf3a5064839e13bdc9910da7", - "value": "1" + "id": "0x940bb12ed38c05a8a88d940203d0986bedb550f050dfe610fadebd8446e96409", + "value": "3" } } }, @@ -580,11 +580,11 @@ Response: { "version": 7, "contents": { "type": { - "repr": "0xf497316682c0ad2d0b757399e9db83e3ed3bceadaedbaad12029111c331445d4::M1::Object" + "repr": "0x6b62cc078a121fab1252edd6ab185f82952cc9fbb4d48995701f1967395137b7::M1::Object" }, "json": { - "id": "0xc41ad14789a46af2b7dd52aa001acfca2193147e06751a9d324c9aec011f5b54", - "value": "3" + "id": "0xf8a39541f76820d0a241fad3ce1ad92b9e0aaba58725c8f656fc2bd76e94ba55", + "value": "1" } } } @@ -605,10 +605,10 @@ Response: { "version": 3, "contents": { "type": { - "repr": "0xf497316682c0ad2d0b757399e9db83e3ed3bceadaedbaad12029111c331445d4::M1::Object" + "repr": "0x6b62cc078a121fab1252edd6ab185f82952cc9fbb4d48995701f1967395137b7::M1::Object" }, "json": { - "id": "0x0196134211788ab305d30e0f558ba451f6c65681c965e4ae1d1fbf4ce138aafa", + "id": "0x6f0747e131cf59b36487d82b0c890fd1075e09966a2befda7c37131cb12db6c1", "value": "0" } } @@ -617,35 +617,35 @@ Response: { "version": 5, "contents": { "type": { - "repr": "0xf497316682c0ad2d0b757399e9db83e3ed3bceadaedbaad12029111c331445d4::M1::Object" + "repr": "0x6b62cc078a121fab1252edd6ab185f82952cc9fbb4d48995701f1967395137b7::M1::Object" }, "json": { - "id": "0x594943312691aa8916bbfc715d0c40044122de94f608d2a1cbb0c6dc49486075", + "id": "0x7c56aa41384c3229d05ac087c1434fbcbe2885285e8a3e167a71f65fff383377", "value": "2" } } }, { - "version": 4, + "version": 6, "contents": { "type": { - "repr": "0xf497316682c0ad2d0b757399e9db83e3ed3bceadaedbaad12029111c331445d4::M1::Object" + "repr": "0x6b62cc078a121fab1252edd6ab185f82952cc9fbb4d48995701f1967395137b7::M1::Object" }, "json": { - "id": "0x99897a446d53989defb6e160415609c939386acbbf3a5064839e13bdc9910da7", - "value": "1" + "id": "0x940bb12ed38c05a8a88d940203d0986bedb550f050dfe610fadebd8446e96409", + "value": "3" } } }, { - "version": 6, + "version": 4, "contents": { "type": { - "repr": "0xf497316682c0ad2d0b757399e9db83e3ed3bceadaedbaad12029111c331445d4::M1::Object" + "repr": "0x6b62cc078a121fab1252edd6ab185f82952cc9fbb4d48995701f1967395137b7::M1::Object" }, "json": { - "id": "0xc41ad14789a46af2b7dd52aa001acfca2193147e06751a9d324c9aec011f5b54", - "value": "3" + "id": "0xf8a39541f76820d0a241fad3ce1ad92b9e0aaba58725c8f656fc2bd76e94ba55", + "value": "1" } } } diff --git a/crates/iota-graphql-e2e-tests/tests/consistency/objects_pagination.move b/crates/iota-graphql-e2e-tests/tests/consistency/objects_pagination.move index 67c12677c4d..ada74bf5e32 100644 --- a/crates/iota-graphql-e2e-tests/tests/consistency/objects_pagination.move +++ b/crates/iota-graphql-e2e-tests/tests/consistency/objects_pagination.move @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -//# init --protocol-version 1 --addresses Test=0x0 --accounts A B --simulator +//# init --protocol-version 3 --addresses Test=0x0 --accounts A B --simulator // cp | object_id | owner diff --git a/crates/iota-graphql-e2e-tests/tests/consistency/objects_pagination_single.exp b/crates/iota-graphql-e2e-tests/tests/consistency/objects_pagination_single.exp index fef91b92f80..93b8cd65ec4 100644 --- a/crates/iota-graphql-e2e-tests/tests/consistency/objects_pagination_single.exp +++ b/crates/iota-graphql-e2e-tests/tests/consistency/objects_pagination_single.exp @@ -46,10 +46,10 @@ Response: { "version": 4, "contents": { "type": { - "repr": "0x8ba0645055ca9407f1fda27d9c5a12697215f596238dc5db7eaf434471bd1e0a::M1::Object" + "repr": "0x8bbe5284437551822da4df75dc89e391d31121c83485877f32b60fbeeeceaaa3::M1::Object" }, "json": { - "id": "0x0ba09e699b7a2c69fcf9e5c3b84610345a7f92bc8aad27d06a82aa10a94f0cf5", + "id": "0x1bb439946e688b4f5c76a5068b2183eed7ed771aaf63cb803cea55c2b67edfb7", "value": "100" } } @@ -85,10 +85,10 @@ Response: { "version": 4, "contents": { "type": { - "repr": "0x8ba0645055ca9407f1fda27d9c5a12697215f596238dc5db7eaf434471bd1e0a::M1::Object" + "repr": "0x8bbe5284437551822da4df75dc89e391d31121c83485877f32b60fbeeeceaaa3::M1::Object" }, "json": { - "id": "0x0ba09e699b7a2c69fcf9e5c3b84610345a7f92bc8aad27d06a82aa10a94f0cf5", + "id": "0x1bb439946e688b4f5c76a5068b2183eed7ed771aaf63cb803cea55c2b67edfb7", "value": "100" } } @@ -110,10 +110,10 @@ Response: { "version": 5, "contents": { "type": { - "repr": "0x8ba0645055ca9407f1fda27d9c5a12697215f596238dc5db7eaf434471bd1e0a::M1::Object" + "repr": "0x8bbe5284437551822da4df75dc89e391d31121c83485877f32b60fbeeeceaaa3::M1::Object" }, "json": { - "id": "0x0ba09e699b7a2c69fcf9e5c3b84610345a7f92bc8aad27d06a82aa10a94f0cf5", + "id": "0x1bb439946e688b4f5c76a5068b2183eed7ed771aaf63cb803cea55c2b67edfb7", "value": "200" } } @@ -122,10 +122,10 @@ Response: { "version": 4, "contents": { "type": { - "repr": "0x8ba0645055ca9407f1fda27d9c5a12697215f596238dc5db7eaf434471bd1e0a::M1::Object" + "repr": "0x8bbe5284437551822da4df75dc89e391d31121c83485877f32b60fbeeeceaaa3::M1::Object" }, "json": { - "id": "0x1064f0e2c1402df49da99967e53770ca27892458ce8a9ea983db9d1f13d8ce61", + "id": "0xedcb20ee342ef450d49808752f158a4fb8cc4d685f1f894f76c3f646f9755806", "value": "1" } } @@ -145,10 +145,10 @@ Response: { "version": 5, "contents": { "type": { - "repr": "0x8ba0645055ca9407f1fda27d9c5a12697215f596238dc5db7eaf434471bd1e0a::M1::Object" + "repr": "0x8bbe5284437551822da4df75dc89e391d31121c83485877f32b60fbeeeceaaa3::M1::Object" }, "json": { - "id": "0x0ba09e699b7a2c69fcf9e5c3b84610345a7f92bc8aad27d06a82aa10a94f0cf5", + "id": "0x1bb439946e688b4f5c76a5068b2183eed7ed771aaf63cb803cea55c2b67edfb7", "value": "200" } }, @@ -160,10 +160,10 @@ Response: { "version": 5, "contents": { "type": { - "repr": "0x8ba0645055ca9407f1fda27d9c5a12697215f596238dc5db7eaf434471bd1e0a::M1::Object" + "repr": "0x8bbe5284437551822da4df75dc89e391d31121c83485877f32b60fbeeeceaaa3::M1::Object" }, "json": { - "id": "0x0ba09e699b7a2c69fcf9e5c3b84610345a7f92bc8aad27d06a82aa10a94f0cf5", + "id": "0x1bb439946e688b4f5c76a5068b2183eed7ed771aaf63cb803cea55c2b67edfb7", "value": "200" } } @@ -172,10 +172,10 @@ Response: { "version": 4, "contents": { "type": { - "repr": "0x8ba0645055ca9407f1fda27d9c5a12697215f596238dc5db7eaf434471bd1e0a::M1::Object" + "repr": "0x8bbe5284437551822da4df75dc89e391d31121c83485877f32b60fbeeeceaaa3::M1::Object" }, "json": { - "id": "0x1064f0e2c1402df49da99967e53770ca27892458ce8a9ea983db9d1f13d8ce61", + "id": "0xedcb20ee342ef450d49808752f158a4fb8cc4d685f1f894f76c3f646f9755806", "value": "1" } } @@ -216,10 +216,10 @@ Response: { "version": 5, "contents": { "type": { - "repr": "0x8ba0645055ca9407f1fda27d9c5a12697215f596238dc5db7eaf434471bd1e0a::M1::Object" + "repr": "0x8bbe5284437551822da4df75dc89e391d31121c83485877f32b60fbeeeceaaa3::M1::Object" }, "json": { - "id": "0x0ba09e699b7a2c69fcf9e5c3b84610345a7f92bc8aad27d06a82aa10a94f0cf5", + "id": "0x1bb439946e688b4f5c76a5068b2183eed7ed771aaf63cb803cea55c2b67edfb7", "value": "200" } }, @@ -231,10 +231,10 @@ Response: { "version": 5, "contents": { "type": { - "repr": "0x8ba0645055ca9407f1fda27d9c5a12697215f596238dc5db7eaf434471bd1e0a::M1::Object" + "repr": "0x8bbe5284437551822da4df75dc89e391d31121c83485877f32b60fbeeeceaaa3::M1::Object" }, "json": { - "id": "0x0ba09e699b7a2c69fcf9e5c3b84610345a7f92bc8aad27d06a82aa10a94f0cf5", + "id": "0x1bb439946e688b4f5c76a5068b2183eed7ed771aaf63cb803cea55c2b67edfb7", "value": "200" } } @@ -243,10 +243,10 @@ Response: { "version": 4, "contents": { "type": { - "repr": "0x8ba0645055ca9407f1fda27d9c5a12697215f596238dc5db7eaf434471bd1e0a::M1::Object" + "repr": "0x8bbe5284437551822da4df75dc89e391d31121c83485877f32b60fbeeeceaaa3::M1::Object" }, "json": { - "id": "0x1064f0e2c1402df49da99967e53770ca27892458ce8a9ea983db9d1f13d8ce61", + "id": "0xedcb20ee342ef450d49808752f158a4fb8cc4d685f1f894f76c3f646f9755806", "value": "1" } } @@ -273,10 +273,10 @@ Response: { "version": 5, "contents": { "type": { - "repr": "0x8ba0645055ca9407f1fda27d9c5a12697215f596238dc5db7eaf434471bd1e0a::M1::Object" + "repr": "0x8bbe5284437551822da4df75dc89e391d31121c83485877f32b60fbeeeceaaa3::M1::Object" }, "json": { - "id": "0x0ba09e699b7a2c69fcf9e5c3b84610345a7f92bc8aad27d06a82aa10a94f0cf5", + "id": "0x1bb439946e688b4f5c76a5068b2183eed7ed771aaf63cb803cea55c2b67edfb7", "value": "200" } } @@ -285,10 +285,10 @@ Response: { "version": 6, "contents": { "type": { - "repr": "0x8ba0645055ca9407f1fda27d9c5a12697215f596238dc5db7eaf434471bd1e0a::M1::Object" + "repr": "0x8bbe5284437551822da4df75dc89e391d31121c83485877f32b60fbeeeceaaa3::M1::Object" }, "json": { - "id": "0x1064f0e2c1402df49da99967e53770ca27892458ce8a9ea983db9d1f13d8ce61", + "id": "0xedcb20ee342ef450d49808752f158a4fb8cc4d685f1f894f76c3f646f9755806", "value": "300" } } @@ -308,10 +308,10 @@ Response: { "version": 5, "contents": { "type": { - "repr": "0x8ba0645055ca9407f1fda27d9c5a12697215f596238dc5db7eaf434471bd1e0a::M1::Object" + "repr": "0x8bbe5284437551822da4df75dc89e391d31121c83485877f32b60fbeeeceaaa3::M1::Object" }, "json": { - "id": "0x0ba09e699b7a2c69fcf9e5c3b84610345a7f92bc8aad27d06a82aa10a94f0cf5", + "id": "0x1bb439946e688b4f5c76a5068b2183eed7ed771aaf63cb803cea55c2b67edfb7", "value": "200" } }, @@ -323,10 +323,10 @@ Response: { "version": 5, "contents": { "type": { - "repr": "0x8ba0645055ca9407f1fda27d9c5a12697215f596238dc5db7eaf434471bd1e0a::M1::Object" + "repr": "0x8bbe5284437551822da4df75dc89e391d31121c83485877f32b60fbeeeceaaa3::M1::Object" }, "json": { - "id": "0x0ba09e699b7a2c69fcf9e5c3b84610345a7f92bc8aad27d06a82aa10a94f0cf5", + "id": "0x1bb439946e688b4f5c76a5068b2183eed7ed771aaf63cb803cea55c2b67edfb7", "value": "200" } } @@ -335,10 +335,10 @@ Response: { "version": 6, "contents": { "type": { - "repr": "0x8ba0645055ca9407f1fda27d9c5a12697215f596238dc5db7eaf434471bd1e0a::M1::Object" + "repr": "0x8bbe5284437551822da4df75dc89e391d31121c83485877f32b60fbeeeceaaa3::M1::Object" }, "json": { - "id": "0x1064f0e2c1402df49da99967e53770ca27892458ce8a9ea983db9d1f13d8ce61", + "id": "0xedcb20ee342ef450d49808752f158a4fb8cc4d685f1f894f76c3f646f9755806", "value": "300" } } diff --git a/crates/iota-graphql-e2e-tests/tests/consistency/objects_pagination_single.move b/crates/iota-graphql-e2e-tests/tests/consistency/objects_pagination_single.move index dff516f9251..2c83462732e 100644 --- a/crates/iota-graphql-e2e-tests/tests/consistency/objects_pagination_single.move +++ b/crates/iota-graphql-e2e-tests/tests/consistency/objects_pagination_single.move @@ -6,7 +6,7 @@ // one object as a cursor to view the other object that gets mutated per checkpoint. The ordering is // consistent even if the cursor object is mutated. -//# init --protocol-version 1 --addresses Test=0x0 --accounts A B --simulator +//# init --protocol-version 3 --addresses Test=0x0 --accounts A B --simulator //# publish module Test::M1 { diff --git a/crates/iota-graphql-e2e-tests/tests/consistency/performance/many_objects.exp b/crates/iota-graphql-e2e-tests/tests/consistency/performance/many_objects.exp index 51eaea008d6..1f34b961a62 100644 --- a/crates/iota-graphql-e2e-tests/tests/consistency/performance/many_objects.exp +++ b/crates/iota-graphql-e2e-tests/tests/consistency/performance/many_objects.exp @@ -35,11 +35,11 @@ Response: { }, "contents": { "json": { - "id": "0xfdfdbe2471965f393fb0f1e2a849804c2951742cef2833aa5630a982927e65e5", - "value": "459" + "id": "0xfd8751b345372f858c4f0934135b80b285926005c0cf4fad0509ca05ab7a3d89", + "value": "149" }, "type": { - "repr": "0x7a9f66657f48f8cac66483bb31b0e47a4ad4331237664b0250794d720bff607c::M1::Object" + "repr": "0xa139341a6424399931eacdae9e94c01156651410c82be788100eea2d15f5a71c::M1::Object" } } } @@ -54,11 +54,11 @@ Response: { }, "contents": { "json": { - "id": "0xff793ecbad3b0cb648a7f8a676d41abf9479e51e8a70f661fd8a01f1053fb117", - "value": "338" + "id": "0xff549f934fc6cc753ee00f3b02aec8c28ec21a0ec4f96028088425ab58e55fd3", + "value": "32" }, "type": { - "repr": "0x7a9f66657f48f8cac66483bb31b0e47a4ad4331237664b0250794d720bff607c::M1::Object" + "repr": "0xa139341a6424399931eacdae9e94c01156651410c82be788100eea2d15f5a71c::M1::Object" } } } @@ -76,11 +76,11 @@ Response: { }, "contents": { "json": { - "id": "0xfc58a4a75f805dda8348e39cbabdfd88a9358a37207dc08086618c8539f2c863", - "value": "314" + "id": "0xfd1c5ba117f89c7a1505ad527c0dbcd53e4c84b9799ef138ee609a51a462302d", + "value": "475" }, "type": { - "repr": "0x7a9f66657f48f8cac66483bb31b0e47a4ad4331237664b0250794d720bff607c::M1::Object" + "repr": "0xa139341a6424399931eacdae9e94c01156651410c82be788100eea2d15f5a71c::M1::Object" } } }, @@ -92,11 +92,11 @@ Response: { }, "contents": { "json": { - "id": "0xfca8a7528a05b7a8386c8a976be57d6ddcc1a4e9697aa4c207d3853e1f7a42d8", - "value": "296" + "id": "0xfd66a0ccbb382e17d62697b438f4a1d782775fae030dadffd30f7e0a20e807e9", + "value": "379" }, "type": { - "repr": "0x7a9f66657f48f8cac66483bb31b0e47a4ad4331237664b0250794d720bff607c::M1::Object" + "repr": "0xa139341a6424399931eacdae9e94c01156651410c82be788100eea2d15f5a71c::M1::Object" } } }, @@ -108,11 +108,11 @@ Response: { }, "contents": { "json": { - "id": "0xfdfdbe2471965f393fb0f1e2a849804c2951742cef2833aa5630a982927e65e5", - "value": "459" + "id": "0xfd8751b345372f858c4f0934135b80b285926005c0cf4fad0509ca05ab7a3d89", + "value": "149" }, "type": { - "repr": "0x7a9f66657f48f8cac66483bb31b0e47a4ad4331237664b0250794d720bff607c::M1::Object" + "repr": "0xa139341a6424399931eacdae9e94c01156651410c82be788100eea2d15f5a71c::M1::Object" } } }, @@ -124,11 +124,11 @@ Response: { }, "contents": { "json": { - "id": "0xff793ecbad3b0cb648a7f8a676d41abf9479e51e8a70f661fd8a01f1053fb117", - "value": "338" + "id": "0xff549f934fc6cc753ee00f3b02aec8c28ec21a0ec4f96028088425ab58e55fd3", + "value": "32" }, "type": { - "repr": "0x7a9f66657f48f8cac66483bb31b0e47a4ad4331237664b0250794d720bff607c::M1::Object" + "repr": "0xa139341a6424399931eacdae9e94c01156651410c82be788100eea2d15f5a71c::M1::Object" } } } @@ -163,7 +163,7 @@ Contents: Test::M1::Object { bytes: fake(2,498), }, }, - value: 459u64, + value: 149u64, } task 9, line 93: @@ -176,7 +176,7 @@ Contents: Test::M1::Object { bytes: fake(2,497), }, }, - value: 296u64, + value: 379u64, } task 10, line 95: @@ -199,11 +199,11 @@ Response: { }, "contents": { "json": { - "id": "0xfca8a7528a05b7a8386c8a976be57d6ddcc1a4e9697aa4c207d3853e1f7a42d8", - "value": "296" + "id": "0xfd66a0ccbb382e17d62697b438f4a1d782775fae030dadffd30f7e0a20e807e9", + "value": "379" }, "type": { - "repr": "0x7a9f66657f48f8cac66483bb31b0e47a4ad4331237664b0250794d720bff607c::M1::Object" + "repr": "0xa139341a6424399931eacdae9e94c01156651410c82be788100eea2d15f5a71c::M1::Object" } } } @@ -218,11 +218,11 @@ Response: { }, "contents": { "json": { - "id": "0xfdfdbe2471965f393fb0f1e2a849804c2951742cef2833aa5630a982927e65e5", - "value": "459" + "id": "0xfd8751b345372f858c4f0934135b80b285926005c0cf4fad0509ca05ab7a3d89", + "value": "149" }, "type": { - "repr": "0x7a9f66657f48f8cac66483bb31b0e47a4ad4331237664b0250794d720bff607c::M1::Object" + "repr": "0xa139341a6424399931eacdae9e94c01156651410c82be788100eea2d15f5a71c::M1::Object" } } } @@ -237,11 +237,11 @@ Response: { }, "contents": { "json": { - "id": "0xff793ecbad3b0cb648a7f8a676d41abf9479e51e8a70f661fd8a01f1053fb117", - "value": "338" + "id": "0xff549f934fc6cc753ee00f3b02aec8c28ec21a0ec4f96028088425ab58e55fd3", + "value": "32" }, "type": { - "repr": "0x7a9f66657f48f8cac66483bb31b0e47a4ad4331237664b0250794d720bff607c::M1::Object" + "repr": "0xa139341a6424399931eacdae9e94c01156651410c82be788100eea2d15f5a71c::M1::Object" } } } @@ -260,11 +260,11 @@ Response: { }, "contents": { "json": { - "id": "0xfc58a4a75f805dda8348e39cbabdfd88a9358a37207dc08086618c8539f2c863", - "value": "314" + "id": "0xfd1c5ba117f89c7a1505ad527c0dbcd53e4c84b9799ef138ee609a51a462302d", + "value": "475" }, "type": { - "repr": "0x7a9f66657f48f8cac66483bb31b0e47a4ad4331237664b0250794d720bff607c::M1::Object" + "repr": "0xa139341a6424399931eacdae9e94c01156651410c82be788100eea2d15f5a71c::M1::Object" } } } @@ -287,11 +287,11 @@ Response: { }, "contents": { "json": { - "id": "0xff793ecbad3b0cb648a7f8a676d41abf9479e51e8a70f661fd8a01f1053fb117", - "value": "338" + "id": "0xff549f934fc6cc753ee00f3b02aec8c28ec21a0ec4f96028088425ab58e55fd3", + "value": "32" }, "type": { - "repr": "0x7a9f66657f48f8cac66483bb31b0e47a4ad4331237664b0250794d720bff607c::M1::Object" + "repr": "0xa139341a6424399931eacdae9e94c01156651410c82be788100eea2d15f5a71c::M1::Object" } } } @@ -305,11 +305,11 @@ Response: { }, "contents": { "json": { - "id": "0xff793ecbad3b0cb648a7f8a676d41abf9479e51e8a70f661fd8a01f1053fb117", - "value": "338" + "id": "0xff549f934fc6cc753ee00f3b02aec8c28ec21a0ec4f96028088425ab58e55fd3", + "value": "32" }, "type": { - "repr": "0x7a9f66657f48f8cac66483bb31b0e47a4ad4331237664b0250794d720bff607c::M1::Object" + "repr": "0xa139341a6424399931eacdae9e94c01156651410c82be788100eea2d15f5a71c::M1::Object" } } } @@ -325,11 +325,11 @@ Response: { }, "contents": { "json": { - "id": "0xfca8a7528a05b7a8386c8a976be57d6ddcc1a4e9697aa4c207d3853e1f7a42d8", - "value": "296" + "id": "0xfd66a0ccbb382e17d62697b438f4a1d782775fae030dadffd30f7e0a20e807e9", + "value": "379" }, "type": { - "repr": "0x7a9f66657f48f8cac66483bb31b0e47a4ad4331237664b0250794d720bff607c::M1::Object" + "repr": "0xa139341a6424399931eacdae9e94c01156651410c82be788100eea2d15f5a71c::M1::Object" } } } @@ -343,11 +343,11 @@ Response: { }, "contents": { "json": { - "id": "0xfdfdbe2471965f393fb0f1e2a849804c2951742cef2833aa5630a982927e65e5", - "value": "459" + "id": "0xfd8751b345372f858c4f0934135b80b285926005c0cf4fad0509ca05ab7a3d89", + "value": "149" }, "type": { - "repr": "0x7a9f66657f48f8cac66483bb31b0e47a4ad4331237664b0250794d720bff607c::M1::Object" + "repr": "0xa139341a6424399931eacdae9e94c01156651410c82be788100eea2d15f5a71c::M1::Object" } } } @@ -361,11 +361,11 @@ Response: { }, "contents": { "json": { - "id": "0xff793ecbad3b0cb648a7f8a676d41abf9479e51e8a70f661fd8a01f1053fb117", - "value": "338" + "id": "0xff549f934fc6cc753ee00f3b02aec8c28ec21a0ec4f96028088425ab58e55fd3", + "value": "32" }, "type": { - "repr": "0x7a9f66657f48f8cac66483bb31b0e47a4ad4331237664b0250794d720bff607c::M1::Object" + "repr": "0xa139341a6424399931eacdae9e94c01156651410c82be788100eea2d15f5a71c::M1::Object" } } } @@ -383,11 +383,11 @@ Response: { }, "contents": { "json": { - "id": "0xfca8a7528a05b7a8386c8a976be57d6ddcc1a4e9697aa4c207d3853e1f7a42d8", - "value": "296" + "id": "0xfd66a0ccbb382e17d62697b438f4a1d782775fae030dadffd30f7e0a20e807e9", + "value": "379" }, "type": { - "repr": "0x7a9f66657f48f8cac66483bb31b0e47a4ad4331237664b0250794d720bff607c::M1::Object" + "repr": "0xa139341a6424399931eacdae9e94c01156651410c82be788100eea2d15f5a71c::M1::Object" } } } @@ -401,11 +401,11 @@ Response: { }, "contents": { "json": { - "id": "0xfdfdbe2471965f393fb0f1e2a849804c2951742cef2833aa5630a982927e65e5", - "value": "459" + "id": "0xfd8751b345372f858c4f0934135b80b285926005c0cf4fad0509ca05ab7a3d89", + "value": "149" }, "type": { - "repr": "0x7a9f66657f48f8cac66483bb31b0e47a4ad4331237664b0250794d720bff607c::M1::Object" + "repr": "0xa139341a6424399931eacdae9e94c01156651410c82be788100eea2d15f5a71c::M1::Object" } } } @@ -419,11 +419,11 @@ Response: { }, "contents": { "json": { - "id": "0xff793ecbad3b0cb648a7f8a676d41abf9479e51e8a70f661fd8a01f1053fb117", - "value": "338" + "id": "0xff549f934fc6cc753ee00f3b02aec8c28ec21a0ec4f96028088425ab58e55fd3", + "value": "32" }, "type": { - "repr": "0x7a9f66657f48f8cac66483bb31b0e47a4ad4331237664b0250794d720bff607c::M1::Object" + "repr": "0xa139341a6424399931eacdae9e94c01156651410c82be788100eea2d15f5a71c::M1::Object" } } } @@ -442,7 +442,7 @@ Response: { }, "contents": { "json": { - "id": "0xd1bed9d8032538f51c93732600d7002478b40e2036b90c576fb76d589c03693d", + "id": "0xf9c7908a3d09a86f7bddc51e15266a9d8fa570b98b2bc57179cee2410b2f9576", "balance": { "value": "300000000000000" } @@ -461,11 +461,11 @@ Response: { }, "contents": { "json": { - "id": "0xfca8a7528a05b7a8386c8a976be57d6ddcc1a4e9697aa4c207d3853e1f7a42d8", - "value": "296" + "id": "0xfd66a0ccbb382e17d62697b438f4a1d782775fae030dadffd30f7e0a20e807e9", + "value": "379" }, "type": { - "repr": "0x7a9f66657f48f8cac66483bb31b0e47a4ad4331237664b0250794d720bff607c::M1::Object" + "repr": "0xa139341a6424399931eacdae9e94c01156651410c82be788100eea2d15f5a71c::M1::Object" } } }, @@ -478,11 +478,11 @@ Response: { }, "contents": { "json": { - "id": "0xfdfdbe2471965f393fb0f1e2a849804c2951742cef2833aa5630a982927e65e5", - "value": "459" + "id": "0xfd8751b345372f858c4f0934135b80b285926005c0cf4fad0509ca05ab7a3d89", + "value": "149" }, "type": { - "repr": "0x7a9f66657f48f8cac66483bb31b0e47a4ad4331237664b0250794d720bff607c::M1::Object" + "repr": "0xa139341a6424399931eacdae9e94c01156651410c82be788100eea2d15f5a71c::M1::Object" } } }, @@ -495,11 +495,11 @@ Response: { }, "contents": { "json": { - "id": "0xff793ecbad3b0cb648a7f8a676d41abf9479e51e8a70f661fd8a01f1053fb117", - "value": "338" + "id": "0xff549f934fc6cc753ee00f3b02aec8c28ec21a0ec4f96028088425ab58e55fd3", + "value": "32" }, "type": { - "repr": "0x7a9f66657f48f8cac66483bb31b0e47a4ad4331237664b0250794d720bff607c::M1::Object" + "repr": "0xa139341a6424399931eacdae9e94c01156651410c82be788100eea2d15f5a71c::M1::Object" } } } diff --git a/crates/iota-graphql-e2e-tests/tests/consistency/performance/many_objects.move b/crates/iota-graphql-e2e-tests/tests/consistency/performance/many_objects.move index 75146a0c888..6f8bef7f758 100644 --- a/crates/iota-graphql-e2e-tests/tests/consistency/performance/many_objects.move +++ b/crates/iota-graphql-e2e-tests/tests/consistency/performance/many_objects.move @@ -8,7 +8,7 @@ // criteria are then invalidated by a newer version of the matched object. We set `last: 1` but // transfer the last 3 objects because we increase the limit by 2 behind the scenes. -//# init --protocol-version 1 --addresses Test=0x0 --accounts A B --simulator +//# init --protocol-version 3 --addresses Test=0x0 --accounts A B --simulator //# publish module Test::M1 { diff --git a/crates/iota-graphql-e2e-tests/tests/consistency/staked_iota.exp b/crates/iota-graphql-e2e-tests/tests/consistency/staked_iota.exp index ad831cbb06f..69dc8c0b26a 100644 --- a/crates/iota-graphql-e2e-tests/tests/consistency/staked_iota.exp +++ b/crates/iota-graphql-e2e-tests/tests/consistency/staked_iota.exp @@ -25,7 +25,7 @@ gas summary: computation_cost: 1000000, computation_cost_burned: 1000000, storag task 3, line 25: //# run 0x3::iota_system::request_add_stake --args object(0x5) object(2,0) @validator_0 --sender C -events: Event { package_id: iota_system, transaction_module: Identifier("iota_system"), sender: C, type_: StructTag { address: iota_system, module: Identifier("validator"), name: Identifier("StakingRequestEvent"), type_params: [] }, contents: [145, 201, 73, 32, 135, 23, 121, 37, 7, 101, 40, 103, 216, 99, 155, 51, 118, 111, 115, 220, 44, 253, 144, 143, 80, 103, 133, 240, 58, 235, 137, 202, 175, 163, 158, 79, 0, 218, 226, 120, 249, 119, 199, 198, 147, 10, 94, 44, 118, 232, 93, 23, 165, 38, 215, 36, 187, 206, 15, 184, 31, 176, 125, 76, 140, 202, 78, 28, 224, 186, 89, 4, 206, 166, 29, 249, 36, 45, 162, 247, 210, 158, 62, 243, 40, 251, 126, 192, 124, 8, 107, 59, 244, 124, 166, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 11, 84, 2, 0, 0, 0] } +events: Event { package_id: iota_system, transaction_module: Identifier("iota_system"), sender: C, type_: StructTag { address: iota_system, module: Identifier("validator"), name: Identifier("StakingRequestEvent"), type_params: [] }, contents: [217, 25, 175, 239, 57, 244, 176, 32, 209, 232, 109, 171, 147, 246, 3, 15, 205, 197, 172, 21, 36, 143, 47, 100, 240, 226, 221, 254, 42, 3, 157, 155, 175, 163, 158, 79, 0, 218, 226, 120, 249, 119, 199, 198, 147, 10, 94, 44, 118, 232, 93, 23, 165, 38, 215, 36, 187, 206, 15, 184, 31, 176, 125, 76, 140, 202, 78, 28, 224, 186, 89, 4, 206, 166, 29, 249, 36, 45, 162, 247, 210, 158, 62, 243, 40, 251, 126, 192, 124, 8, 107, 59, 244, 124, 166, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 11, 84, 2, 0, 0, 0] } created: object(3,0) mutated: object(_), 0x0000000000000000000000000000000000000000000000000000000000000005, object(0,0) deleted: object(2,0) @@ -49,7 +49,7 @@ gas summary: computation_cost: 1000000, computation_cost_burned: 1000000, storag task 7, line 35: //# run 0x3::iota_system::request_add_stake --args object(0x5) object(6,0) @validator_0 --sender C -events: Event { package_id: iota_system, transaction_module: Identifier("iota_system"), sender: C, type_: StructTag { address: iota_system, module: Identifier("validator"), name: Identifier("StakingRequestEvent"), type_params: [] }, contents: [145, 201, 73, 32, 135, 23, 121, 37, 7, 101, 40, 103, 216, 99, 155, 51, 118, 111, 115, 220, 44, 253, 144, 143, 80, 103, 133, 240, 58, 235, 137, 202, 175, 163, 158, 79, 0, 218, 226, 120, 249, 119, 199, 198, 147, 10, 94, 44, 118, 232, 93, 23, 165, 38, 215, 36, 187, 206, 15, 184, 31, 176, 125, 76, 140, 202, 78, 28, 224, 186, 89, 4, 206, 166, 29, 249, 36, 45, 162, 247, 210, 158, 62, 243, 40, 251, 126, 192, 124, 8, 107, 59, 244, 124, 166, 26, 1, 0, 0, 0, 0, 0, 0, 0, 0, 228, 11, 84, 2, 0, 0, 0] } +events: Event { package_id: iota_system, transaction_module: Identifier("iota_system"), sender: C, type_: StructTag { address: iota_system, module: Identifier("validator"), name: Identifier("StakingRequestEvent"), type_params: [] }, contents: [217, 25, 175, 239, 57, 244, 176, 32, 209, 232, 109, 171, 147, 246, 3, 15, 205, 197, 172, 21, 36, 143, 47, 100, 240, 226, 221, 254, 42, 3, 157, 155, 175, 163, 158, 79, 0, 218, 226, 120, 249, 119, 199, 198, 147, 10, 94, 44, 118, 232, 93, 23, 165, 38, 215, 36, 187, 206, 15, 184, 31, 176, 125, 76, 140, 202, 78, 28, 224, 186, 89, 4, 206, 166, 29, 249, 36, 45, 162, 247, 210, 158, 62, 243, 40, 251, 126, 192, 124, 8, 107, 59, 244, 124, 166, 26, 1, 0, 0, 0, 0, 0, 0, 0, 0, 228, 11, 84, 2, 0, 0, 0] } created: object(7,0) mutated: object(_), 0x0000000000000000000000000000000000000000000000000000000000000005, object(0,0) deleted: object(6,0) @@ -109,13 +109,13 @@ Response: { "stakedIotas": { "edges": [ { - "cursor": "ICY/+FbG+Hqd34UX7O+7VLiMXKC/bqtTKAZwQ4YiyetzBAAAAAAAAAA=", + "cursor": "ICx+i9jLtLxeXhS/A0ahYRLGYYlMzFleNwu1meRx2FBtBAAAAAAAAAA=", "node": { "principal": "10000000000" } }, { - "cursor": "IPEp6dbnEicrkwynNujLy5/Voas64Cc5Ta7ruT5oQNbTBAAAAAAAAAA=", + "cursor": "IJ/jh2RIAAFvbLTf7RAKDlv0BCV3CAEBy5bUCfTnTOIgBAAAAAAAAAA=", "node": { "principal": "10000000000" } @@ -158,10 +158,15 @@ task 14, lines 105-148: Response: { "data": { "coins_after_obj_3_0_chkpt_3": { + "stakedIotas": { + "edges": [] + } + }, + "coins_before_obj_3_0_chkpt_3": { "stakedIotas": { "edges": [ { - "cursor": "IPEp6dbnEicrkwynNujLy5/Voas64Cc5Ta7ruT5oQNbTAwAAAAAAAAA=", + "cursor": "ICx+i9jLtLxeXhS/A0ahYRLGYYlMzFleNwu1meRx2FBtAwAAAAAAAAA=", "node": { "principal": "10000000000" } @@ -169,27 +174,22 @@ Response: { ] } }, - "coins_before_obj_3_0_chkpt_3": { - "stakedIotas": { - "edges": [] - } - }, "coins_after_obj_7_0_chkpt_3": { - "stakedIotas": { - "edges": [] - } - }, - "coins_before_obj_7_0_chkpt_3": { "stakedIotas": { "edges": [ { - "cursor": "ICY/+FbG+Hqd34UX7O+7VLiMXKC/bqtTKAZwQ4YiyetzAwAAAAAAAAA=", + "cursor": "IJ/jh2RIAAFvbLTf7RAKDlv0BCV3CAEBy5bUCfTnTOIgAwAAAAAAAAA=", "node": { "principal": "10000000000" } } ] } + }, + "coins_before_obj_7_0_chkpt_3": { + "stakedIotas": { + "edges": [] + } } } } diff --git a/crates/iota-graphql-e2e-tests/tests/consistency/staked_iota.move b/crates/iota-graphql-e2e-tests/tests/consistency/staked_iota.move index 1b3366f414b..8814cb2e415 100644 --- a/crates/iota-graphql-e2e-tests/tests/consistency/staked_iota.move +++ b/crates/iota-graphql-e2e-tests/tests/consistency/staked_iota.move @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -//# init --protocol-version 1 --simulator --accounts C +//# init --protocol-version 3 --simulator --accounts C //# run-graphql { diff --git a/crates/iota-graphql-e2e-tests/tests/consistency/tx_address_objects.exp b/crates/iota-graphql-e2e-tests/tests/consistency/tx_address_objects.exp index 0b07261f1ff..81a411d29eb 100644 --- a/crates/iota-graphql-e2e-tests/tests/consistency/tx_address_objects.exp +++ b/crates/iota-graphql-e2e-tests/tests/consistency/tx_address_objects.exp @@ -61,66 +61,66 @@ Response: { { "contents": { "json": { - "id": "0x06d5d2e9af70892fdde85874daf2c3dc5f1adc9cb3f22baabfd56e173fc8c39f", - "value": "2" + "id": "0x1457a25e59dd95037988d1623acefa4ea3ed3aeaaf5233566b32c6f20419a028", + "value": "5" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0x1985e10335572563abedc5e04e975dea930a1ef4e4d87685dfc9a9256b293f46", - "value": "3" + "id": "0x20e682e9bd64d57e2b9184ef69c11af67e1b92cb4295c51bf23ee9533f128cf7", + "value": "200" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0x2f3706f4e91edbbd4a2f48a4c52581b16acacf01cbe49d0d789a522e3128bf30", - "value": "4" + "id": "0x2d8288b42428e037f480d70ac52b163a6431bc84858823cf18a40d05047cddb0", + "value": "6" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0x7137b2b53c2a2acb9a845c9c9b68de4fae6509bbff3e63ebc7b3c7c601a24f56", - "value": "200" + "id": "0xd4b20eb98f5c3714c708e35473bcee3e75ffc863d17fb0042915191624d76776", + "value": "4" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0x93205e5ec2238371d751ff89a8efb12b2436c1faf8152049b02fdfd579face26", - "value": "5" + "id": "0xdc7a601e37bef86cb0009a0d5d2928aad82195410365760ce3af99ba796ccf93", + "value": "2" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0xb6e1ac11a0567db347db4c5ce1d1c609d66d1a799045352697d1ae195ed7e57c", - "value": "6" + "id": "0xffe2c100374e1a53f93cd6d37087ec6db3d95628912104be12dc2b63b95e31ea", + "value": "3" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } } @@ -136,66 +136,66 @@ Response: { { "contents": { "json": { - "id": "0x06d5d2e9af70892fdde85874daf2c3dc5f1adc9cb3f22baabfd56e173fc8c39f", - "value": "2" + "id": "0x1457a25e59dd95037988d1623acefa4ea3ed3aeaaf5233566b32c6f20419a028", + "value": "5" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0x1985e10335572563abedc5e04e975dea930a1ef4e4d87685dfc9a9256b293f46", - "value": "3" + "id": "0x20e682e9bd64d57e2b9184ef69c11af67e1b92cb4295c51bf23ee9533f128cf7", + "value": "200" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0x2f3706f4e91edbbd4a2f48a4c52581b16acacf01cbe49d0d789a522e3128bf30", - "value": "4" + "id": "0x2d8288b42428e037f480d70ac52b163a6431bc84858823cf18a40d05047cddb0", + "value": "6" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0x7137b2b53c2a2acb9a845c9c9b68de4fae6509bbff3e63ebc7b3c7c601a24f56", - "value": "200" + "id": "0xd4b20eb98f5c3714c708e35473bcee3e75ffc863d17fb0042915191624d76776", + "value": "4" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0x93205e5ec2238371d751ff89a8efb12b2436c1faf8152049b02fdfd579face26", - "value": "5" + "id": "0xdc7a601e37bef86cb0009a0d5d2928aad82195410365760ce3af99ba796ccf93", + "value": "2" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0xb6e1ac11a0567db347db4c5ce1d1c609d66d1a799045352697d1ae195ed7e57c", - "value": "6" + "id": "0xffe2c100374e1a53f93cd6d37087ec6db3d95628912104be12dc2b63b95e31ea", + "value": "3" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } } @@ -209,66 +209,66 @@ Response: { { "contents": { "json": { - "id": "0x06d5d2e9af70892fdde85874daf2c3dc5f1adc9cb3f22baabfd56e173fc8c39f", - "value": "2" + "id": "0x1457a25e59dd95037988d1623acefa4ea3ed3aeaaf5233566b32c6f20419a028", + "value": "5" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0x1985e10335572563abedc5e04e975dea930a1ef4e4d87685dfc9a9256b293f46", - "value": "3" + "id": "0x20e682e9bd64d57e2b9184ef69c11af67e1b92cb4295c51bf23ee9533f128cf7", + "value": "200" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0x2f3706f4e91edbbd4a2f48a4c52581b16acacf01cbe49d0d789a522e3128bf30", - "value": "4" + "id": "0x2d8288b42428e037f480d70ac52b163a6431bc84858823cf18a40d05047cddb0", + "value": "6" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0x7137b2b53c2a2acb9a845c9c9b68de4fae6509bbff3e63ebc7b3c7c601a24f56", - "value": "200" + "id": "0xd4b20eb98f5c3714c708e35473bcee3e75ffc863d17fb0042915191624d76776", + "value": "4" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0x93205e5ec2238371d751ff89a8efb12b2436c1faf8152049b02fdfd579face26", - "value": "5" + "id": "0xdc7a601e37bef86cb0009a0d5d2928aad82195410365760ce3af99ba796ccf93", + "value": "2" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0xb6e1ac11a0567db347db4c5ce1d1c609d66d1a799045352697d1ae195ed7e57c", - "value": "6" + "id": "0xffe2c100374e1a53f93cd6d37087ec6db3d95628912104be12dc2b63b95e31ea", + "value": "3" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } } @@ -284,7 +284,7 @@ Response: { "repr": "0x0000000000000000000000000000000000000000000000000000000000000002::coin::Coin<0x0000000000000000000000000000000000000000000000000000000000000002::iota::IOTA>" }, "json": { - "id": "0x1a52511867f48d7024447044500d117a88f7c6da82946c92c62ebb0b2b145b50", + "id": "0x9f6cd415c08be09b382dbcdc2471d69edd135d72693ada29700678293a249db6", "balance": { "value": "299999993098000" } @@ -306,66 +306,66 @@ Response: { { "contents": { "json": { - "id": "0x06d5d2e9af70892fdde85874daf2c3dc5f1adc9cb3f22baabfd56e173fc8c39f", - "value": "2" + "id": "0x1457a25e59dd95037988d1623acefa4ea3ed3aeaaf5233566b32c6f20419a028", + "value": "5" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0x1985e10335572563abedc5e04e975dea930a1ef4e4d87685dfc9a9256b293f46", - "value": "3" + "id": "0x20e682e9bd64d57e2b9184ef69c11af67e1b92cb4295c51bf23ee9533f128cf7", + "value": "200" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0x2f3706f4e91edbbd4a2f48a4c52581b16acacf01cbe49d0d789a522e3128bf30", - "value": "4" + "id": "0x2d8288b42428e037f480d70ac52b163a6431bc84858823cf18a40d05047cddb0", + "value": "6" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0x7137b2b53c2a2acb9a845c9c9b68de4fae6509bbff3e63ebc7b3c7c601a24f56", - "value": "200" + "id": "0xd4b20eb98f5c3714c708e35473bcee3e75ffc863d17fb0042915191624d76776", + "value": "4" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0x93205e5ec2238371d751ff89a8efb12b2436c1faf8152049b02fdfd579face26", - "value": "5" + "id": "0xdc7a601e37bef86cb0009a0d5d2928aad82195410365760ce3af99ba796ccf93", + "value": "2" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0xb6e1ac11a0567db347db4c5ce1d1c609d66d1a799045352697d1ae195ed7e57c", - "value": "6" + "id": "0xffe2c100374e1a53f93cd6d37087ec6db3d95628912104be12dc2b63b95e31ea", + "value": "3" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } } @@ -390,66 +390,66 @@ Response: { { "contents": { "json": { - "id": "0x06d5d2e9af70892fdde85874daf2c3dc5f1adc9cb3f22baabfd56e173fc8c39f", - "value": "2" + "id": "0x1457a25e59dd95037988d1623acefa4ea3ed3aeaaf5233566b32c6f20419a028", + "value": "5" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0x1985e10335572563abedc5e04e975dea930a1ef4e4d87685dfc9a9256b293f46", - "value": "3" + "id": "0x20e682e9bd64d57e2b9184ef69c11af67e1b92cb4295c51bf23ee9533f128cf7", + "value": "200" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0x2f3706f4e91edbbd4a2f48a4c52581b16acacf01cbe49d0d789a522e3128bf30", - "value": "4" + "id": "0x2d8288b42428e037f480d70ac52b163a6431bc84858823cf18a40d05047cddb0", + "value": "6" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0x7137b2b53c2a2acb9a845c9c9b68de4fae6509bbff3e63ebc7b3c7c601a24f56", - "value": "200" + "id": "0xd4b20eb98f5c3714c708e35473bcee3e75ffc863d17fb0042915191624d76776", + "value": "4" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0x93205e5ec2238371d751ff89a8efb12b2436c1faf8152049b02fdfd579face26", - "value": "5" + "id": "0xdc7a601e37bef86cb0009a0d5d2928aad82195410365760ce3af99ba796ccf93", + "value": "2" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0xb6e1ac11a0567db347db4c5ce1d1c609d66d1a799045352697d1ae195ed7e57c", - "value": "6" + "id": "0xffe2c100374e1a53f93cd6d37087ec6db3d95628912104be12dc2b63b95e31ea", + "value": "3" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } } @@ -463,66 +463,66 @@ Response: { { "contents": { "json": { - "id": "0x06d5d2e9af70892fdde85874daf2c3dc5f1adc9cb3f22baabfd56e173fc8c39f", - "value": "2" + "id": "0x1457a25e59dd95037988d1623acefa4ea3ed3aeaaf5233566b32c6f20419a028", + "value": "5" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0x1985e10335572563abedc5e04e975dea930a1ef4e4d87685dfc9a9256b293f46", - "value": "3" + "id": "0x20e682e9bd64d57e2b9184ef69c11af67e1b92cb4295c51bf23ee9533f128cf7", + "value": "200" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0x2f3706f4e91edbbd4a2f48a4c52581b16acacf01cbe49d0d789a522e3128bf30", - "value": "4" + "id": "0x2d8288b42428e037f480d70ac52b163a6431bc84858823cf18a40d05047cddb0", + "value": "6" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0x7137b2b53c2a2acb9a845c9c9b68de4fae6509bbff3e63ebc7b3c7c601a24f56", - "value": "200" + "id": "0xd4b20eb98f5c3714c708e35473bcee3e75ffc863d17fb0042915191624d76776", + "value": "4" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0x93205e5ec2238371d751ff89a8efb12b2436c1faf8152049b02fdfd579face26", - "value": "5" + "id": "0xdc7a601e37bef86cb0009a0d5d2928aad82195410365760ce3af99ba796ccf93", + "value": "2" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0xb6e1ac11a0567db347db4c5ce1d1c609d66d1a799045352697d1ae195ed7e57c", - "value": "6" + "id": "0xffe2c100374e1a53f93cd6d37087ec6db3d95628912104be12dc2b63b95e31ea", + "value": "3" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } } @@ -538,7 +538,7 @@ Response: { "repr": "0x0000000000000000000000000000000000000000000000000000000000000002::coin::Coin<0x0000000000000000000000000000000000000000000000000000000000000002::iota::IOTA>" }, "json": { - "id": "0x1a52511867f48d7024447044500d117a88f7c6da82946c92c62ebb0b2b145b50", + "id": "0x9f6cd415c08be09b382dbcdc2471d69edd135d72693ada29700678293a249db6", "balance": { "value": "300000000000000" } @@ -557,66 +557,66 @@ Response: { { "contents": { "json": { - "id": "0x06d5d2e9af70892fdde85874daf2c3dc5f1adc9cb3f22baabfd56e173fc8c39f", - "value": "2" + "id": "0x1457a25e59dd95037988d1623acefa4ea3ed3aeaaf5233566b32c6f20419a028", + "value": "5" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0x1985e10335572563abedc5e04e975dea930a1ef4e4d87685dfc9a9256b293f46", - "value": "3" + "id": "0x20e682e9bd64d57e2b9184ef69c11af67e1b92cb4295c51bf23ee9533f128cf7", + "value": "200" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0x2f3706f4e91edbbd4a2f48a4c52581b16acacf01cbe49d0d789a522e3128bf30", - "value": "4" + "id": "0x2d8288b42428e037f480d70ac52b163a6431bc84858823cf18a40d05047cddb0", + "value": "6" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0x7137b2b53c2a2acb9a845c9c9b68de4fae6509bbff3e63ebc7b3c7c601a24f56", - "value": "200" + "id": "0xd4b20eb98f5c3714c708e35473bcee3e75ffc863d17fb0042915191624d76776", + "value": "4" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0x93205e5ec2238371d751ff89a8efb12b2436c1faf8152049b02fdfd579face26", - "value": "5" + "id": "0xdc7a601e37bef86cb0009a0d5d2928aad82195410365760ce3af99ba796ccf93", + "value": "2" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0xb6e1ac11a0567db347db4c5ce1d1c609d66d1a799045352697d1ae195ed7e57c", - "value": "6" + "id": "0xffe2c100374e1a53f93cd6d37087ec6db3d95628912104be12dc2b63b95e31ea", + "value": "3" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } } @@ -630,66 +630,66 @@ Response: { { "contents": { "json": { - "id": "0x06d5d2e9af70892fdde85874daf2c3dc5f1adc9cb3f22baabfd56e173fc8c39f", - "value": "2" + "id": "0x1457a25e59dd95037988d1623acefa4ea3ed3aeaaf5233566b32c6f20419a028", + "value": "5" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0x1985e10335572563abedc5e04e975dea930a1ef4e4d87685dfc9a9256b293f46", - "value": "3" + "id": "0x20e682e9bd64d57e2b9184ef69c11af67e1b92cb4295c51bf23ee9533f128cf7", + "value": "200" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0x2f3706f4e91edbbd4a2f48a4c52581b16acacf01cbe49d0d789a522e3128bf30", - "value": "4" + "id": "0x2d8288b42428e037f480d70ac52b163a6431bc84858823cf18a40d05047cddb0", + "value": "6" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0x7137b2b53c2a2acb9a845c9c9b68de4fae6509bbff3e63ebc7b3c7c601a24f56", - "value": "200" + "id": "0xd4b20eb98f5c3714c708e35473bcee3e75ffc863d17fb0042915191624d76776", + "value": "4" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0x93205e5ec2238371d751ff89a8efb12b2436c1faf8152049b02fdfd579face26", - "value": "5" + "id": "0xdc7a601e37bef86cb0009a0d5d2928aad82195410365760ce3af99ba796ccf93", + "value": "2" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0xb6e1ac11a0567db347db4c5ce1d1c609d66d1a799045352697d1ae195ed7e57c", - "value": "6" + "id": "0xffe2c100374e1a53f93cd6d37087ec6db3d95628912104be12dc2b63b95e31ea", + "value": "3" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } } @@ -705,7 +705,7 @@ Response: { "repr": "0x0000000000000000000000000000000000000000000000000000000000000002::coin::Coin<0x0000000000000000000000000000000000000000000000000000000000000002::iota::IOTA>" }, "json": { - "id": "0x1a52511867f48d7024447044500d117a88f7c6da82946c92c62ebb0b2b145b50", + "id": "0x9f6cd415c08be09b382dbcdc2471d69edd135d72693ada29700678293a249db6", "balance": { "value": "299999996712400" } @@ -724,66 +724,66 @@ Response: { { "contents": { "json": { - "id": "0x06d5d2e9af70892fdde85874daf2c3dc5f1adc9cb3f22baabfd56e173fc8c39f", - "value": "2" + "id": "0x1457a25e59dd95037988d1623acefa4ea3ed3aeaaf5233566b32c6f20419a028", + "value": "5" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0x1985e10335572563abedc5e04e975dea930a1ef4e4d87685dfc9a9256b293f46", - "value": "3" + "id": "0x20e682e9bd64d57e2b9184ef69c11af67e1b92cb4295c51bf23ee9533f128cf7", + "value": "200" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0x2f3706f4e91edbbd4a2f48a4c52581b16acacf01cbe49d0d789a522e3128bf30", - "value": "4" + "id": "0x2d8288b42428e037f480d70ac52b163a6431bc84858823cf18a40d05047cddb0", + "value": "6" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0x7137b2b53c2a2acb9a845c9c9b68de4fae6509bbff3e63ebc7b3c7c601a24f56", - "value": "200" + "id": "0xd4b20eb98f5c3714c708e35473bcee3e75ffc863d17fb0042915191624d76776", + "value": "4" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0x93205e5ec2238371d751ff89a8efb12b2436c1faf8152049b02fdfd579face26", - "value": "5" + "id": "0xdc7a601e37bef86cb0009a0d5d2928aad82195410365760ce3af99ba796ccf93", + "value": "2" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0xb6e1ac11a0567db347db4c5ce1d1c609d66d1a799045352697d1ae195ed7e57c", - "value": "6" + "id": "0xffe2c100374e1a53f93cd6d37087ec6db3d95628912104be12dc2b63b95e31ea", + "value": "3" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } } @@ -797,66 +797,66 @@ Response: { { "contents": { "json": { - "id": "0x06d5d2e9af70892fdde85874daf2c3dc5f1adc9cb3f22baabfd56e173fc8c39f", - "value": "2" + "id": "0x1457a25e59dd95037988d1623acefa4ea3ed3aeaaf5233566b32c6f20419a028", + "value": "5" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0x1985e10335572563abedc5e04e975dea930a1ef4e4d87685dfc9a9256b293f46", - "value": "3" + "id": "0x20e682e9bd64d57e2b9184ef69c11af67e1b92cb4295c51bf23ee9533f128cf7", + "value": "200" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0x2f3706f4e91edbbd4a2f48a4c52581b16acacf01cbe49d0d789a522e3128bf30", - "value": "4" + "id": "0x2d8288b42428e037f480d70ac52b163a6431bc84858823cf18a40d05047cddb0", + "value": "6" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0x7137b2b53c2a2acb9a845c9c9b68de4fae6509bbff3e63ebc7b3c7c601a24f56", - "value": "200" + "id": "0xd4b20eb98f5c3714c708e35473bcee3e75ffc863d17fb0042915191624d76776", + "value": "4" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0x93205e5ec2238371d751ff89a8efb12b2436c1faf8152049b02fdfd579face26", - "value": "5" + "id": "0xdc7a601e37bef86cb0009a0d5d2928aad82195410365760ce3af99ba796ccf93", + "value": "2" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0xb6e1ac11a0567db347db4c5ce1d1c609d66d1a799045352697d1ae195ed7e57c", - "value": "6" + "id": "0xffe2c100374e1a53f93cd6d37087ec6db3d95628912104be12dc2b63b95e31ea", + "value": "3" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } } @@ -872,7 +872,7 @@ Response: { "repr": "0x0000000000000000000000000000000000000000000000000000000000000002::coin::Coin<0x0000000000000000000000000000000000000000000000000000000000000002::iota::IOTA>" }, "json": { - "id": "0x1a52511867f48d7024447044500d117a88f7c6da82946c92c62ebb0b2b145b50", + "id": "0x9f6cd415c08be09b382dbcdc2471d69edd135d72693ada29700678293a249db6", "balance": { "value": "299999993098000" } @@ -907,66 +907,66 @@ Response: { { "contents": { "json": { - "id": "0x06d5d2e9af70892fdde85874daf2c3dc5f1adc9cb3f22baabfd56e173fc8c39f", - "value": "2" + "id": "0x1457a25e59dd95037988d1623acefa4ea3ed3aeaaf5233566b32c6f20419a028", + "value": "5" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0x1985e10335572563abedc5e04e975dea930a1ef4e4d87685dfc9a9256b293f46", - "value": "3" + "id": "0x20e682e9bd64d57e2b9184ef69c11af67e1b92cb4295c51bf23ee9533f128cf7", + "value": "200" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0x2f3706f4e91edbbd4a2f48a4c52581b16acacf01cbe49d0d789a522e3128bf30", - "value": "4" + "id": "0x2d8288b42428e037f480d70ac52b163a6431bc84858823cf18a40d05047cddb0", + "value": "6" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0x7137b2b53c2a2acb9a845c9c9b68de4fae6509bbff3e63ebc7b3c7c601a24f56", - "value": "200" + "id": "0xd4b20eb98f5c3714c708e35473bcee3e75ffc863d17fb0042915191624d76776", + "value": "4" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0x93205e5ec2238371d751ff89a8efb12b2436c1faf8152049b02fdfd579face26", - "value": "5" + "id": "0xdc7a601e37bef86cb0009a0d5d2928aad82195410365760ce3af99ba796ccf93", + "value": "2" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0xb6e1ac11a0567db347db4c5ce1d1c609d66d1a799045352697d1ae195ed7e57c", - "value": "6" + "id": "0xffe2c100374e1a53f93cd6d37087ec6db3d95628912104be12dc2b63b95e31ea", + "value": "3" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } } @@ -982,66 +982,66 @@ Response: { { "contents": { "json": { - "id": "0x06d5d2e9af70892fdde85874daf2c3dc5f1adc9cb3f22baabfd56e173fc8c39f", - "value": "2" + "id": "0x1457a25e59dd95037988d1623acefa4ea3ed3aeaaf5233566b32c6f20419a028", + "value": "5" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0x1985e10335572563abedc5e04e975dea930a1ef4e4d87685dfc9a9256b293f46", - "value": "3" + "id": "0x20e682e9bd64d57e2b9184ef69c11af67e1b92cb4295c51bf23ee9533f128cf7", + "value": "200" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0x2f3706f4e91edbbd4a2f48a4c52581b16acacf01cbe49d0d789a522e3128bf30", - "value": "4" + "id": "0x2d8288b42428e037f480d70ac52b163a6431bc84858823cf18a40d05047cddb0", + "value": "6" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0x7137b2b53c2a2acb9a845c9c9b68de4fae6509bbff3e63ebc7b3c7c601a24f56", - "value": "200" + "id": "0xd4b20eb98f5c3714c708e35473bcee3e75ffc863d17fb0042915191624d76776", + "value": "4" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0x93205e5ec2238371d751ff89a8efb12b2436c1faf8152049b02fdfd579face26", - "value": "5" + "id": "0xdc7a601e37bef86cb0009a0d5d2928aad82195410365760ce3af99ba796ccf93", + "value": "2" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0xb6e1ac11a0567db347db4c5ce1d1c609d66d1a799045352697d1ae195ed7e57c", - "value": "6" + "id": "0xffe2c100374e1a53f93cd6d37087ec6db3d95628912104be12dc2b63b95e31ea", + "value": "3" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } } @@ -1055,66 +1055,66 @@ Response: { { "contents": { "json": { - "id": "0x06d5d2e9af70892fdde85874daf2c3dc5f1adc9cb3f22baabfd56e173fc8c39f", - "value": "2" + "id": "0x1457a25e59dd95037988d1623acefa4ea3ed3aeaaf5233566b32c6f20419a028", + "value": "5" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0x1985e10335572563abedc5e04e975dea930a1ef4e4d87685dfc9a9256b293f46", - "value": "3" + "id": "0x20e682e9bd64d57e2b9184ef69c11af67e1b92cb4295c51bf23ee9533f128cf7", + "value": "200" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0x2f3706f4e91edbbd4a2f48a4c52581b16acacf01cbe49d0d789a522e3128bf30", - "value": "4" + "id": "0x2d8288b42428e037f480d70ac52b163a6431bc84858823cf18a40d05047cddb0", + "value": "6" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0x7137b2b53c2a2acb9a845c9c9b68de4fae6509bbff3e63ebc7b3c7c601a24f56", - "value": "200" + "id": "0xd4b20eb98f5c3714c708e35473bcee3e75ffc863d17fb0042915191624d76776", + "value": "4" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0x93205e5ec2238371d751ff89a8efb12b2436c1faf8152049b02fdfd579face26", - "value": "5" + "id": "0xdc7a601e37bef86cb0009a0d5d2928aad82195410365760ce3af99ba796ccf93", + "value": "2" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0xb6e1ac11a0567db347db4c5ce1d1c609d66d1a799045352697d1ae195ed7e57c", - "value": "6" + "id": "0xffe2c100374e1a53f93cd6d37087ec6db3d95628912104be12dc2b63b95e31ea", + "value": "3" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } } @@ -1130,7 +1130,7 @@ Response: { "repr": "0x0000000000000000000000000000000000000000000000000000000000000002::coin::Coin<0x0000000000000000000000000000000000000000000000000000000000000002::iota::IOTA>" }, "json": { - "id": "0x1a52511867f48d7024447044500d117a88f7c6da82946c92c62ebb0b2b145b50", + "id": "0x9f6cd415c08be09b382dbcdc2471d69edd135d72693ada29700678293a249db6", "balance": { "value": "299999993098000" } @@ -1152,66 +1152,66 @@ Response: { { "contents": { "json": { - "id": "0x06d5d2e9af70892fdde85874daf2c3dc5f1adc9cb3f22baabfd56e173fc8c39f", - "value": "2" + "id": "0x1457a25e59dd95037988d1623acefa4ea3ed3aeaaf5233566b32c6f20419a028", + "value": "5" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0x1985e10335572563abedc5e04e975dea930a1ef4e4d87685dfc9a9256b293f46", - "value": "3" + "id": "0x20e682e9bd64d57e2b9184ef69c11af67e1b92cb4295c51bf23ee9533f128cf7", + "value": "200" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0x2f3706f4e91edbbd4a2f48a4c52581b16acacf01cbe49d0d789a522e3128bf30", - "value": "4" + "id": "0x2d8288b42428e037f480d70ac52b163a6431bc84858823cf18a40d05047cddb0", + "value": "6" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0x7137b2b53c2a2acb9a845c9c9b68de4fae6509bbff3e63ebc7b3c7c601a24f56", - "value": "200" + "id": "0xd4b20eb98f5c3714c708e35473bcee3e75ffc863d17fb0042915191624d76776", + "value": "4" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0x93205e5ec2238371d751ff89a8efb12b2436c1faf8152049b02fdfd579face26", - "value": "5" + "id": "0xdc7a601e37bef86cb0009a0d5d2928aad82195410365760ce3af99ba796ccf93", + "value": "2" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0xb6e1ac11a0567db347db4c5ce1d1c609d66d1a799045352697d1ae195ed7e57c", - "value": "6" + "id": "0xffe2c100374e1a53f93cd6d37087ec6db3d95628912104be12dc2b63b95e31ea", + "value": "3" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } } @@ -1240,66 +1240,66 @@ Response: { { "contents": { "json": { - "id": "0x06d5d2e9af70892fdde85874daf2c3dc5f1adc9cb3f22baabfd56e173fc8c39f", - "value": "2" + "id": "0x1457a25e59dd95037988d1623acefa4ea3ed3aeaaf5233566b32c6f20419a028", + "value": "5" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0x1985e10335572563abedc5e04e975dea930a1ef4e4d87685dfc9a9256b293f46", - "value": "3" + "id": "0x20e682e9bd64d57e2b9184ef69c11af67e1b92cb4295c51bf23ee9533f128cf7", + "value": "200" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0x2f3706f4e91edbbd4a2f48a4c52581b16acacf01cbe49d0d789a522e3128bf30", - "value": "4" + "id": "0x2d8288b42428e037f480d70ac52b163a6431bc84858823cf18a40d05047cddb0", + "value": "6" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0x7137b2b53c2a2acb9a845c9c9b68de4fae6509bbff3e63ebc7b3c7c601a24f56", - "value": "200" + "id": "0xd4b20eb98f5c3714c708e35473bcee3e75ffc863d17fb0042915191624d76776", + "value": "4" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0x93205e5ec2238371d751ff89a8efb12b2436c1faf8152049b02fdfd579face26", - "value": "5" + "id": "0xdc7a601e37bef86cb0009a0d5d2928aad82195410365760ce3af99ba796ccf93", + "value": "2" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0xb6e1ac11a0567db347db4c5ce1d1c609d66d1a799045352697d1ae195ed7e57c", - "value": "6" + "id": "0xffe2c100374e1a53f93cd6d37087ec6db3d95628912104be12dc2b63b95e31ea", + "value": "3" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } } @@ -1313,66 +1313,66 @@ Response: { { "contents": { "json": { - "id": "0x06d5d2e9af70892fdde85874daf2c3dc5f1adc9cb3f22baabfd56e173fc8c39f", - "value": "2" + "id": "0x1457a25e59dd95037988d1623acefa4ea3ed3aeaaf5233566b32c6f20419a028", + "value": "5" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0x1985e10335572563abedc5e04e975dea930a1ef4e4d87685dfc9a9256b293f46", - "value": "3" + "id": "0x20e682e9bd64d57e2b9184ef69c11af67e1b92cb4295c51bf23ee9533f128cf7", + "value": "200" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0x2f3706f4e91edbbd4a2f48a4c52581b16acacf01cbe49d0d789a522e3128bf30", - "value": "4" + "id": "0x2d8288b42428e037f480d70ac52b163a6431bc84858823cf18a40d05047cddb0", + "value": "6" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0x7137b2b53c2a2acb9a845c9c9b68de4fae6509bbff3e63ebc7b3c7c601a24f56", - "value": "200" + "id": "0xd4b20eb98f5c3714c708e35473bcee3e75ffc863d17fb0042915191624d76776", + "value": "4" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0x93205e5ec2238371d751ff89a8efb12b2436c1faf8152049b02fdfd579face26", - "value": "5" + "id": "0xdc7a601e37bef86cb0009a0d5d2928aad82195410365760ce3af99ba796ccf93", + "value": "2" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0xb6e1ac11a0567db347db4c5ce1d1c609d66d1a799045352697d1ae195ed7e57c", - "value": "6" + "id": "0xffe2c100374e1a53f93cd6d37087ec6db3d95628912104be12dc2b63b95e31ea", + "value": "3" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } } @@ -1388,66 +1388,66 @@ Response: { { "contents": { "json": { - "id": "0x06d5d2e9af70892fdde85874daf2c3dc5f1adc9cb3f22baabfd56e173fc8c39f", - "value": "2" + "id": "0x1457a25e59dd95037988d1623acefa4ea3ed3aeaaf5233566b32c6f20419a028", + "value": "5" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0x1985e10335572563abedc5e04e975dea930a1ef4e4d87685dfc9a9256b293f46", - "value": "3" + "id": "0x20e682e9bd64d57e2b9184ef69c11af67e1b92cb4295c51bf23ee9533f128cf7", + "value": "200" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0x2f3706f4e91edbbd4a2f48a4c52581b16acacf01cbe49d0d789a522e3128bf30", - "value": "4" + "id": "0x2d8288b42428e037f480d70ac52b163a6431bc84858823cf18a40d05047cddb0", + "value": "6" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0x7137b2b53c2a2acb9a845c9c9b68de4fae6509bbff3e63ebc7b3c7c601a24f56", - "value": "200" + "id": "0xd4b20eb98f5c3714c708e35473bcee3e75ffc863d17fb0042915191624d76776", + "value": "4" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0x93205e5ec2238371d751ff89a8efb12b2436c1faf8152049b02fdfd579face26", - "value": "5" + "id": "0xdc7a601e37bef86cb0009a0d5d2928aad82195410365760ce3af99ba796ccf93", + "value": "2" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0xb6e1ac11a0567db347db4c5ce1d1c609d66d1a799045352697d1ae195ed7e57c", - "value": "6" + "id": "0xffe2c100374e1a53f93cd6d37087ec6db3d95628912104be12dc2b63b95e31ea", + "value": "3" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } } @@ -1461,66 +1461,66 @@ Response: { { "contents": { "json": { - "id": "0x06d5d2e9af70892fdde85874daf2c3dc5f1adc9cb3f22baabfd56e173fc8c39f", - "value": "2" + "id": "0x1457a25e59dd95037988d1623acefa4ea3ed3aeaaf5233566b32c6f20419a028", + "value": "5" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0x1985e10335572563abedc5e04e975dea930a1ef4e4d87685dfc9a9256b293f46", - "value": "3" + "id": "0x20e682e9bd64d57e2b9184ef69c11af67e1b92cb4295c51bf23ee9533f128cf7", + "value": "200" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0x2f3706f4e91edbbd4a2f48a4c52581b16acacf01cbe49d0d789a522e3128bf30", - "value": "4" + "id": "0x2d8288b42428e037f480d70ac52b163a6431bc84858823cf18a40d05047cddb0", + "value": "6" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0x7137b2b53c2a2acb9a845c9c9b68de4fae6509bbff3e63ebc7b3c7c601a24f56", - "value": "200" + "id": "0xd4b20eb98f5c3714c708e35473bcee3e75ffc863d17fb0042915191624d76776", + "value": "4" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0x93205e5ec2238371d751ff89a8efb12b2436c1faf8152049b02fdfd579face26", - "value": "5" + "id": "0xdc7a601e37bef86cb0009a0d5d2928aad82195410365760ce3af99ba796ccf93", + "value": "2" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0xb6e1ac11a0567db347db4c5ce1d1c609d66d1a799045352697d1ae195ed7e57c", - "value": "6" + "id": "0xffe2c100374e1a53f93cd6d37087ec6db3d95628912104be12dc2b63b95e31ea", + "value": "3" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } } @@ -1536,66 +1536,66 @@ Response: { { "contents": { "json": { - "id": "0x06d5d2e9af70892fdde85874daf2c3dc5f1adc9cb3f22baabfd56e173fc8c39f", - "value": "2" + "id": "0x1457a25e59dd95037988d1623acefa4ea3ed3aeaaf5233566b32c6f20419a028", + "value": "5" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0x1985e10335572563abedc5e04e975dea930a1ef4e4d87685dfc9a9256b293f46", - "value": "3" + "id": "0x20e682e9bd64d57e2b9184ef69c11af67e1b92cb4295c51bf23ee9533f128cf7", + "value": "200" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0x2f3706f4e91edbbd4a2f48a4c52581b16acacf01cbe49d0d789a522e3128bf30", - "value": "4" + "id": "0x2d8288b42428e037f480d70ac52b163a6431bc84858823cf18a40d05047cddb0", + "value": "6" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0x7137b2b53c2a2acb9a845c9c9b68de4fae6509bbff3e63ebc7b3c7c601a24f56", - "value": "200" + "id": "0xd4b20eb98f5c3714c708e35473bcee3e75ffc863d17fb0042915191624d76776", + "value": "4" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0x93205e5ec2238371d751ff89a8efb12b2436c1faf8152049b02fdfd579face26", - "value": "5" + "id": "0xdc7a601e37bef86cb0009a0d5d2928aad82195410365760ce3af99ba796ccf93", + "value": "2" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0xb6e1ac11a0567db347db4c5ce1d1c609d66d1a799045352697d1ae195ed7e57c", - "value": "6" + "id": "0xffe2c100374e1a53f93cd6d37087ec6db3d95628912104be12dc2b63b95e31ea", + "value": "3" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } } @@ -1609,66 +1609,66 @@ Response: { { "contents": { "json": { - "id": "0x06d5d2e9af70892fdde85874daf2c3dc5f1adc9cb3f22baabfd56e173fc8c39f", - "value": "2" + "id": "0x1457a25e59dd95037988d1623acefa4ea3ed3aeaaf5233566b32c6f20419a028", + "value": "5" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0x1985e10335572563abedc5e04e975dea930a1ef4e4d87685dfc9a9256b293f46", - "value": "3" + "id": "0x20e682e9bd64d57e2b9184ef69c11af67e1b92cb4295c51bf23ee9533f128cf7", + "value": "200" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0x2f3706f4e91edbbd4a2f48a4c52581b16acacf01cbe49d0d789a522e3128bf30", - "value": "4" + "id": "0x2d8288b42428e037f480d70ac52b163a6431bc84858823cf18a40d05047cddb0", + "value": "6" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0x7137b2b53c2a2acb9a845c9c9b68de4fae6509bbff3e63ebc7b3c7c601a24f56", - "value": "200" + "id": "0xd4b20eb98f5c3714c708e35473bcee3e75ffc863d17fb0042915191624d76776", + "value": "4" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0x93205e5ec2238371d751ff89a8efb12b2436c1faf8152049b02fdfd579face26", - "value": "5" + "id": "0xdc7a601e37bef86cb0009a0d5d2928aad82195410365760ce3af99ba796ccf93", + "value": "2" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } }, { "contents": { "json": { - "id": "0xb6e1ac11a0567db347db4c5ce1d1c609d66d1a799045352697d1ae195ed7e57c", - "value": "6" + "id": "0xffe2c100374e1a53f93cd6d37087ec6db3d95628912104be12dc2b63b95e31ea", + "value": "3" }, "type": { - "repr": "0x87557ebcf30086c52715468f621fd094af7efdc79a0ed647ede304eee0e2006d::M1::Object" + "repr": "0x89f4878c607cda08a8c7e8364507a8800574457a6101a928e5f731bdc4952962::M1::Object" } } } diff --git a/crates/iota-graphql-e2e-tests/tests/consistency/tx_address_objects.move b/crates/iota-graphql-e2e-tests/tests/consistency/tx_address_objects.move index 634d449bf17..d9566e43800 100644 --- a/crates/iota-graphql-e2e-tests/tests/consistency/tx_address_objects.move +++ b/crates/iota-graphql-e2e-tests/tests/consistency/tx_address_objects.move @@ -13,7 +13,7 @@ // 2 | (3, 3, 3) // 3 | (4, 4, 4, 4) -//# init --protocol-version 1 --addresses Test=0x0 --accounts A B --simulator +//# init --protocol-version 3 --addresses Test=0x0 --accounts A B --simulator //# publish module Test::M1 { diff --git a/crates/iota-graphql-e2e-tests/tests/datetime/datetime.move b/crates/iota-graphql-e2e-tests/tests/datetime/datetime.move index abd0f649abe..9a00cdce3d9 100644 --- a/crates/iota-graphql-e2e-tests/tests/datetime/datetime.move +++ b/crates/iota-graphql-e2e-tests/tests/datetime/datetime.move @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -//# init --protocol-version 1 --simulator +//# init --protocol-version 3 --simulator //# create-checkpoint diff --git a/crates/iota-graphql-e2e-tests/tests/epoch/chain_identifier.exp b/crates/iota-graphql-e2e-tests/tests/epoch/chain_identifier.exp index 7bbd7811f87..8ec6b0f5856 100644 --- a/crates/iota-graphql-e2e-tests/tests/epoch/chain_identifier.exp +++ b/crates/iota-graphql-e2e-tests/tests/epoch/chain_identifier.exp @@ -11,6 +11,6 @@ task 2, lines 10-13: //# run-graphql Response: { "data": { - "chainIdentifier": "e2a97689" + "chainIdentifier": "924c496c" } } diff --git a/crates/iota-graphql-e2e-tests/tests/epoch/chain_identifier.move b/crates/iota-graphql-e2e-tests/tests/epoch/chain_identifier.move index 88638c14ebc..2e0f4e5badc 100644 --- a/crates/iota-graphql-e2e-tests/tests/epoch/chain_identifier.move +++ b/crates/iota-graphql-e2e-tests/tests/epoch/chain_identifier.move @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -//# init --protocol-version 1 --simulator --accounts C +//# init --protocol-version 3 --simulator --accounts C //# create-checkpoint diff --git a/crates/iota-graphql-e2e-tests/tests/epoch/epoch.exp b/crates/iota-graphql-e2e-tests/tests/epoch/epoch.exp index 30eef67e10a..32ba7fb5d95 100644 --- a/crates/iota-graphql-e2e-tests/tests/epoch/epoch.exp +++ b/crates/iota-graphql-e2e-tests/tests/epoch/epoch.exp @@ -21,7 +21,7 @@ gas summary: computation_cost: 1000000, computation_cost_burned: 1000000, storag task 4, lines 17-19: //# run 0x3::iota_system::request_add_stake --args object(0x5) object(3,0) @validator_0 --sender C -events: Event { package_id: iota_system, transaction_module: Identifier("iota_system"), sender: C, type_: StructTag { address: iota_system, module: Identifier("validator"), name: Identifier("StakingRequestEvent"), type_params: [] }, contents: [145, 201, 73, 32, 135, 23, 121, 37, 7, 101, 40, 103, 216, 99, 155, 51, 118, 111, 115, 220, 44, 253, 144, 143, 80, 103, 133, 240, 58, 235, 137, 202, 175, 163, 158, 79, 0, 218, 226, 120, 249, 119, 199, 198, 147, 10, 94, 44, 118, 232, 93, 23, 165, 38, 215, 36, 187, 206, 15, 184, 31, 176, 125, 76, 140, 202, 78, 28, 224, 186, 89, 4, 206, 166, 29, 249, 36, 45, 162, 247, 210, 158, 62, 243, 40, 251, 126, 192, 124, 8, 107, 59, 244, 124, 166, 26, 1, 0, 0, 0, 0, 0, 0, 0, 0, 228, 11, 84, 2, 0, 0, 0] } +events: Event { package_id: iota_system, transaction_module: Identifier("iota_system"), sender: C, type_: StructTag { address: iota_system, module: Identifier("validator"), name: Identifier("StakingRequestEvent"), type_params: [] }, contents: [217, 25, 175, 239, 57, 244, 176, 32, 209, 232, 109, 171, 147, 246, 3, 15, 205, 197, 172, 21, 36, 143, 47, 100, 240, 226, 221, 254, 42, 3, 157, 155, 175, 163, 158, 79, 0, 218, 226, 120, 249, 119, 199, 198, 147, 10, 94, 44, 118, 232, 93, 23, 165, 38, 215, 36, 187, 206, 15, 184, 31, 176, 125, 76, 140, 202, 78, 28, 224, 186, 89, 4, 206, 166, 29, 249, 36, 45, 162, 247, 210, 158, 62, 243, 40, 251, 126, 192, 124, 8, 107, 59, 244, 124, 166, 26, 1, 0, 0, 0, 0, 0, 0, 0, 0, 228, 11, 84, 2, 0, 0, 0] } created: object(4,0) mutated: object(_), 0x0000000000000000000000000000000000000000000000000000000000000005, object(0,0) deleted: object(3,0) @@ -67,7 +67,7 @@ Response: { ] }, "validatorCandidatesSize": 0, - "inactivePoolsId": "0x48b495a9f2c67e307895dec692c61488d4a82e2a1219fc6d8a2f56b5adb66dce" + "inactivePoolsId": "0x697325617c22344bd6c7921686e670bcbf688bbb32f71908316e918f28b34df4" }, "totalGasFees": "1000000", "totalStakeRewards": "767000000000000", @@ -81,13 +81,13 @@ Response: { "kind": { "__typename": "ProgrammableTransactionBlock" }, - "digest": "7SJtdFybBPY6aTpoRw4y1Z7vShCUUGqqJUDmL5o64CDu" + "digest": "8RUGZcfVT7KR2y4mF8eJ645r1sMkwNhFiAjiAzZ5ZQXW" }, { "kind": { "__typename": "EndOfEpochTransaction" }, - "digest": "9P5t7GdBVgLofELfhVpgeTJ4JoRP3TWYWZfBWrZwrcyV" + "digest": "HxmCwBJxYq7XYbLvt2MQKQAyvwGwue9yyDNSZryxF58m" } ] } diff --git a/crates/iota-graphql-e2e-tests/tests/epoch/epoch.move b/crates/iota-graphql-e2e-tests/tests/epoch/epoch.move index 07950a86ece..4ff9857f984 100644 --- a/crates/iota-graphql-e2e-tests/tests/epoch/epoch.move +++ b/crates/iota-graphql-e2e-tests/tests/epoch/epoch.move @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -//# init --protocol-version 1 --simulator --accounts C +//# init --protocol-version 3 --simulator --accounts C // TODO: Short term hack to get around indexer epoch issue diff --git a/crates/iota-graphql-e2e-tests/tests/epoch/protocol_configs.exp b/crates/iota-graphql-e2e-tests/tests/epoch/protocol_configs.exp index def241be0f3..4328ecd9028 100644 --- a/crates/iota-graphql-e2e-tests/tests/epoch/protocol_configs.exp +++ b/crates/iota-graphql-e2e-tests/tests/epoch/protocol_configs.exp @@ -12,7 +12,7 @@ task 2, lines 9-20: Response: { "data": { "protocolConfig": { - "protocolVersion": 1, + "protocolVersion": 3, "config": { "value": "128" }, diff --git a/crates/iota-graphql-e2e-tests/tests/epoch/protocol_configs.move b/crates/iota-graphql-e2e-tests/tests/epoch/protocol_configs.move index bd095f947e5..774e8bbbcc9 100644 --- a/crates/iota-graphql-e2e-tests/tests/epoch/protocol_configs.move +++ b/crates/iota-graphql-e2e-tests/tests/epoch/protocol_configs.move @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -//# init --protocol-version 1 --simulator --accounts C +//# init --protocol-version 3 --simulator --accounts C //# create-checkpoint diff --git a/crates/iota-graphql-e2e-tests/tests/epoch/system_state.exp b/crates/iota-graphql-e2e-tests/tests/epoch/system_state.exp index 02077205f22..44275610639 100644 --- a/crates/iota-graphql-e2e-tests/tests/epoch/system_state.exp +++ b/crates/iota-graphql-e2e-tests/tests/epoch/system_state.exp @@ -21,7 +21,7 @@ gas summary: computation_cost: 1000000, computation_cost_burned: 1000000, storag task 4, line 19: //# run 0x3::iota_system::request_add_stake --args object(0x5) object(3,0) @validator_0 --sender C -events: Event { package_id: iota_system, transaction_module: Identifier("iota_system"), sender: C, type_: StructTag { address: iota_system, module: Identifier("validator"), name: Identifier("StakingRequestEvent"), type_params: [] }, contents: [82, 156, 67, 66, 179, 182, 139, 22, 41, 95, 18, 92, 229, 180, 139, 208, 171, 130, 171, 230, 62, 173, 24, 194, 70, 211, 255, 135, 134, 155, 120, 225, 175, 163, 158, 79, 0, 218, 226, 120, 249, 119, 199, 198, 147, 10, 94, 44, 118, 232, 93, 23, 165, 38, 215, 36, 187, 206, 15, 184, 31, 176, 125, 76, 140, 202, 78, 28, 224, 186, 89, 4, 206, 166, 29, 249, 36, 45, 162, 247, 210, 158, 62, 243, 40, 251, 126, 192, 124, 8, 107, 59, 244, 124, 166, 26, 1, 0, 0, 0, 0, 0, 0, 0, 0, 228, 11, 84, 2, 0, 0, 0] } +events: Event { package_id: iota_system, transaction_module: Identifier("iota_system"), sender: C, type_: StructTag { address: iota_system, module: Identifier("validator"), name: Identifier("StakingRequestEvent"), type_params: [] }, contents: [92, 255, 40, 237, 198, 73, 205, 67, 209, 145, 49, 106, 217, 73, 88, 110, 184, 125, 246, 24, 38, 172, 47, 25, 61, 71, 153, 80, 215, 118, 139, 200, 175, 163, 158, 79, 0, 218, 226, 120, 249, 119, 199, 198, 147, 10, 94, 44, 118, 232, 93, 23, 165, 38, 215, 36, 187, 206, 15, 184, 31, 176, 125, 76, 140, 202, 78, 28, 224, 186, 89, 4, 206, 166, 29, 249, 36, 45, 162, 247, 210, 158, 62, 243, 40, 251, 126, 192, 124, 8, 107, 59, 244, 124, 166, 26, 1, 0, 0, 0, 0, 0, 0, 0, 0, 228, 11, 84, 2, 0, 0, 0] } created: object(4,0) mutated: object(_), 0x0000000000000000000000000000000000000000000000000000000000000005, object(0,0) deleted: object(3,0) @@ -61,7 +61,7 @@ Epoch advanced: 3 task 12, line 37: //# run 0x3::iota_system::request_withdraw_stake --args object(0x5) object(4,0) --sender C -events: Event { package_id: iota_system, transaction_module: Identifier("iota_system"), sender: C, type_: StructTag { address: iota_system, module: Identifier("validator"), name: Identifier("UnstakingRequestEvent"), type_params: [] }, contents: [82, 156, 67, 66, 179, 182, 139, 22, 41, 95, 18, 92, 229, 180, 139, 208, 171, 130, 171, 230, 62, 173, 24, 194, 70, 211, 255, 135, 134, 155, 120, 225, 175, 163, 158, 79, 0, 218, 226, 120, 249, 119, 199, 198, 147, 10, 94, 44, 118, 232, 93, 23, 165, 38, 215, 36, 187, 206, 15, 184, 31, 176, 125, 76, 140, 202, 78, 28, 224, 186, 89, 4, 206, 166, 29, 249, 36, 45, 162, 247, 210, 158, 62, 243, 40, 251, 126, 192, 124, 8, 107, 59, 244, 124, 166, 26, 2, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 228, 11, 84, 2, 0, 0, 0, 12, 33, 189, 38, 1, 0, 0, 0] } +events: Event { package_id: iota_system, transaction_module: Identifier("iota_system"), sender: C, type_: StructTag { address: iota_system, module: Identifier("validator"), name: Identifier("UnstakingRequestEvent"), type_params: [] }, contents: [92, 255, 40, 237, 198, 73, 205, 67, 209, 145, 49, 106, 217, 73, 88, 110, 184, 125, 246, 24, 38, 172, 47, 25, 61, 71, 153, 80, 215, 118, 139, 200, 175, 163, 158, 79, 0, 218, 226, 120, 249, 119, 199, 198, 147, 10, 94, 44, 118, 232, 93, 23, 165, 38, 215, 36, 187, 206, 15, 184, 31, 176, 125, 76, 140, 202, 78, 28, 224, 186, 89, 4, 206, 166, 29, 249, 36, 45, 162, 247, 210, 158, 62, 243, 40, 251, 126, 192, 124, 8, 107, 59, 244, 124, 166, 26, 2, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 228, 11, 84, 2, 0, 0, 0, 12, 33, 189, 38, 1, 0, 0, 0] } created: object(12,0) mutated: object(_), 0x0000000000000000000000000000000000000000000000000000000000000005, object(0,0) deleted: object(4,0) diff --git a/crates/iota-graphql-e2e-tests/tests/epoch/system_state.move b/crates/iota-graphql-e2e-tests/tests/epoch/system_state.move index a97d93100ae..b76ac55ef7e 100644 --- a/crates/iota-graphql-e2e-tests/tests/epoch/system_state.move +++ b/crates/iota-graphql-e2e-tests/tests/epoch/system_state.move @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -//# init --protocol-version 1 --simulator --accounts C --custom-validator-account +//# init --protocol-version 3 --simulator --accounts C --custom-validator-account // Run a few transactions and check that the system state storage fund is correctly reported // for historical epochs diff --git a/crates/iota-graphql-e2e-tests/tests/errors/clever_errors.exp b/crates/iota-graphql-e2e-tests/tests/errors/clever_errors.exp index d56278abb77..95dcb6214a5 100644 --- a/crates/iota-graphql-e2e-tests/tests/errors/clever_errors.exp +++ b/crates/iota-graphql-e2e-tests/tests/errors/clever_errors.exp @@ -77,67 +77,67 @@ Response: { { "effects": { "status": "FAILURE", - "errors": "Error in 1st command, from '0x322ea0fab60fef0ce07a128ba221506400816291c3e6352c547b7af4cafa9371::m::callU8' (line 30), abort 'ImAU8': 0" + "errors": "Error in 1st command, from '0x03d41831cb41d89bd851fc0408c68cbfd8eae0504f5e7872efde32591e06f7fb::m::callU8' (line 30), abort 'ImAU8': 0" } }, { "effects": { "status": "FAILURE", - "errors": "Error in 1st command, from '0x322ea0fab60fef0ce07a128ba221506400816291c3e6352c547b7af4cafa9371::m::callU16' (line 33), abort 'ImAU16': 1" + "errors": "Error in 1st command, from '0x03d41831cb41d89bd851fc0408c68cbfd8eae0504f5e7872efde32591e06f7fb::m::callU16' (line 33), abort 'ImAU16': 1" } }, { "effects": { "status": "FAILURE", - "errors": "Error in 1st command, from '0x322ea0fab60fef0ce07a128ba221506400816291c3e6352c547b7af4cafa9371::m::callU32' (line 36), abort 'ImAU32': 2" + "errors": "Error in 1st command, from '0x03d41831cb41d89bd851fc0408c68cbfd8eae0504f5e7872efde32591e06f7fb::m::callU32' (line 36), abort 'ImAU32': 2" } }, { "effects": { "status": "FAILURE", - "errors": "Error in 1st command, from '0x322ea0fab60fef0ce07a128ba221506400816291c3e6352c547b7af4cafa9371::m::callU64' (line 39), abort 'ImAU64': 3" + "errors": "Error in 1st command, from '0x03d41831cb41d89bd851fc0408c68cbfd8eae0504f5e7872efde32591e06f7fb::m::callU64' (line 39), abort 'ImAU64': 3" } }, { "effects": { "status": "FAILURE", - "errors": "Error in 1st command, from '0x322ea0fab60fef0ce07a128ba221506400816291c3e6352c547b7af4cafa9371::m::callU128' (line 42), abort 'ImAU128': 4" + "errors": "Error in 1st command, from '0x03d41831cb41d89bd851fc0408c68cbfd8eae0504f5e7872efde32591e06f7fb::m::callU128' (line 42), abort 'ImAU128': 4" } }, { "effects": { "status": "FAILURE", - "errors": "Error in 1st command, from '0x322ea0fab60fef0ce07a128ba221506400816291c3e6352c547b7af4cafa9371::m::callU256' (line 45), abort 'ImAU256': 5" + "errors": "Error in 1st command, from '0x03d41831cb41d89bd851fc0408c68cbfd8eae0504f5e7872efde32591e06f7fb::m::callU256' (line 45), abort 'ImAU256': 5" } }, { "effects": { "status": "FAILURE", - "errors": "Error in 1st command, from '0x322ea0fab60fef0ce07a128ba221506400816291c3e6352c547b7af4cafa9371::m::callAddress' (line 48), abort 'ImAnAddress': 0x0000000000000000000000000000000000000000000000000000000000000006" + "errors": "Error in 1st command, from '0x03d41831cb41d89bd851fc0408c68cbfd8eae0504f5e7872efde32591e06f7fb::m::callAddress' (line 48), abort 'ImAnAddress': 0x0000000000000000000000000000000000000000000000000000000000000006" } }, { "effects": { "status": "FAILURE", - "errors": "Error in 1st command, from '0x322ea0fab60fef0ce07a128ba221506400816291c3e6352c547b7af4cafa9371::m::callString' (line 51), abort 'ImAString': This is a string" + "errors": "Error in 1st command, from '0x03d41831cb41d89bd851fc0408c68cbfd8eae0504f5e7872efde32591e06f7fb::m::callString' (line 51), abort 'ImAString': This is a string" } }, { "effects": { "status": "FAILURE", - "errors": "Error in 1st command, from '0x322ea0fab60fef0ce07a128ba221506400816291c3e6352c547b7af4cafa9371::m::callU64vec' (line 54), abort 'ImNotAString': BQEAAAAAAAAAAgAAAAAAAAADAAAAAAAAAAQAAAAAAAAABQAAAAAAAAA=" + "errors": "Error in 1st command, from '0x03d41831cb41d89bd851fc0408c68cbfd8eae0504f5e7872efde32591e06f7fb::m::callU64vec' (line 54), abort 'ImNotAString': BQEAAAAAAAAAAgAAAAAAAAADAAAAAAAAAAQAAAAAAAAABQAAAAAAAAA=" } }, { "effects": { "status": "FAILURE", - "errors": "Error in 1st command, from '0x322ea0fab60fef0ce07a128ba221506400816291c3e6352c547b7af4cafa9371::m::normalAbort' (instruction 1), abort code: 0" + "errors": "Error in 1st command, from '0x03d41831cb41d89bd851fc0408c68cbfd8eae0504f5e7872efde32591e06f7fb::m::normalAbort' (instruction 1), abort code: 0" } }, { "effects": { "status": "FAILURE", - "errors": "Error in 1st command, from '0x322ea0fab60fef0ce07a128ba221506400816291c3e6352c547b7af4cafa9371::m::assertLineNo' (line 60)" + "errors": "Error in 1st command, from '0x03d41831cb41d89bd851fc0408c68cbfd8eae0504f5e7872efde32591e06f7fb::m::assertLineNo' (line 60)" } } ] @@ -248,7 +248,7 @@ Response: { }, "errors": [ { - "message": "Internal error occurred while processing request: Error resolving Move location: Linkage not found for package: fae1ca9e0539e57d226f63569906b6c6aaf1b87bc59de378ddabbdff9d90792f", + "message": "Internal error occurred while processing request: Error resolving Move location: Linkage not found for package: ed305684cc73241a5b1625abb0a973baa0e7dacdd7759308a83a98a916f758b0", "locations": [ { "line": 6, @@ -264,7 +264,7 @@ Response: { ] }, { - "message": "Internal error occurred while processing request: Error resolving Move location: Linkage not found for package: fae1ca9e0539e57d226f63569906b6c6aaf1b87bc59de378ddabbdff9d90792f", + "message": "Internal error occurred while processing request: Error resolving Move location: Linkage not found for package: ed305684cc73241a5b1625abb0a973baa0e7dacdd7759308a83a98a916f758b0", "locations": [ { "line": 6, @@ -280,7 +280,7 @@ Response: { ] }, { - "message": "Internal error occurred while processing request: Error resolving Move location: Linkage not found for package: fae1ca9e0539e57d226f63569906b6c6aaf1b87bc59de378ddabbdff9d90792f", + "message": "Internal error occurred while processing request: Error resolving Move location: Linkage not found for package: ed305684cc73241a5b1625abb0a973baa0e7dacdd7759308a83a98a916f758b0", "locations": [ { "line": 6, @@ -296,7 +296,7 @@ Response: { ] }, { - "message": "Internal error occurred while processing request: Error resolving Move location: Linkage not found for package: fae1ca9e0539e57d226f63569906b6c6aaf1b87bc59de378ddabbdff9d90792f", + "message": "Internal error occurred while processing request: Error resolving Move location: Linkage not found for package: ed305684cc73241a5b1625abb0a973baa0e7dacdd7759308a83a98a916f758b0", "locations": [ { "line": 6, @@ -312,7 +312,7 @@ Response: { ] }, { - "message": "Internal error occurred while processing request: Error resolving Move location: Linkage not found for package: fae1ca9e0539e57d226f63569906b6c6aaf1b87bc59de378ddabbdff9d90792f", + "message": "Internal error occurred while processing request: Error resolving Move location: Linkage not found for package: ed305684cc73241a5b1625abb0a973baa0e7dacdd7759308a83a98a916f758b0", "locations": [ { "line": 6, @@ -328,7 +328,7 @@ Response: { ] }, { - "message": "Internal error occurred while processing request: Error resolving Move location: Linkage not found for package: fae1ca9e0539e57d226f63569906b6c6aaf1b87bc59de378ddabbdff9d90792f", + "message": "Internal error occurred while processing request: Error resolving Move location: Linkage not found for package: ed305684cc73241a5b1625abb0a973baa0e7dacdd7759308a83a98a916f758b0", "locations": [ { "line": 6, @@ -344,7 +344,7 @@ Response: { ] }, { - "message": "Internal error occurred while processing request: Error resolving Move location: Linkage not found for package: fae1ca9e0539e57d226f63569906b6c6aaf1b87bc59de378ddabbdff9d90792f", + "message": "Internal error occurred while processing request: Error resolving Move location: Linkage not found for package: ed305684cc73241a5b1625abb0a973baa0e7dacdd7759308a83a98a916f758b0", "locations": [ { "line": 6, @@ -360,7 +360,7 @@ Response: { ] }, { - "message": "Internal error occurred while processing request: Error resolving Move location: Linkage not found for package: fae1ca9e0539e57d226f63569906b6c6aaf1b87bc59de378ddabbdff9d90792f", + "message": "Internal error occurred while processing request: Error resolving Move location: Linkage not found for package: ed305684cc73241a5b1625abb0a973baa0e7dacdd7759308a83a98a916f758b0", "locations": [ { "line": 6, @@ -376,7 +376,7 @@ Response: { ] }, { - "message": "Internal error occurred while processing request: Error resolving Move location: Linkage not found for package: fae1ca9e0539e57d226f63569906b6c6aaf1b87bc59de378ddabbdff9d90792f", + "message": "Internal error occurred while processing request: Error resolving Move location: Linkage not found for package: ed305684cc73241a5b1625abb0a973baa0e7dacdd7759308a83a98a916f758b0", "locations": [ { "line": 6, diff --git a/crates/iota-graphql-e2e-tests/tests/errors/clever_errors.move b/crates/iota-graphql-e2e-tests/tests/errors/clever_errors.move index 80f4b884b04..cf601d53604 100644 --- a/crates/iota-graphql-e2e-tests/tests/errors/clever_errors.move +++ b/crates/iota-graphql-e2e-tests/tests/errors/clever_errors.move @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -//# init --protocol-version 1 --addresses P0=0x0 P1=0x0 --accounts A --simulator +//# init --protocol-version 3 --addresses P0=0x0 P1=0x0 --accounts A --simulator //# publish --upgradeable --sender A module P0::m { diff --git a/crates/iota-graphql-e2e-tests/tests/errors/clever_errors_in_macros.exp b/crates/iota-graphql-e2e-tests/tests/errors/clever_errors_in_macros.exp index a36d804579a..becf8efed3e 100644 --- a/crates/iota-graphql-e2e-tests/tests/errors/clever_errors_in_macros.exp +++ b/crates/iota-graphql-e2e-tests/tests/errors/clever_errors_in_macros.exp @@ -37,19 +37,19 @@ Response: { { "effects": { "status": "FAILURE", - "errors": "Error in 1st command, from '0x11dc3ad690a3827513133bf2891ebfe4f51fc934651fb9128b788ca564d998e1::m::t_a' (line 21)" + "errors": "Error in 1st command, from '0x44a9d67e77d63fda2134bb70abc66305c2efdb7fa390636d62e695a7ba6cb1a0::m::t_a' (line 21)" } }, { "effects": { "status": "FAILURE", - "errors": "Error in 1st command, from '0x11dc3ad690a3827513133bf2891ebfe4f51fc934651fb9128b788ca564d998e1::m::t_calls_a' (line 24)" + "errors": "Error in 1st command, from '0x44a9d67e77d63fda2134bb70abc66305c2efdb7fa390636d62e695a7ba6cb1a0::m::t_calls_a' (line 24)" } }, { "effects": { "status": "FAILURE", - "errors": "Error in 1st command, from '0x11dc3ad690a3827513133bf2891ebfe4f51fc934651fb9128b788ca564d998e1::m::t_const_assert' (line 10), abort 'EMsg': This is a string" + "errors": "Error in 1st command, from '0x44a9d67e77d63fda2134bb70abc66305c2efdb7fa390636d62e695a7ba6cb1a0::m::t_const_assert' (line 10), abort 'EMsg': This is a string" } } ] diff --git a/crates/iota-graphql-e2e-tests/tests/errors/clever_errors_in_macros.move b/crates/iota-graphql-e2e-tests/tests/errors/clever_errors_in_macros.move index 54c0c991230..e74f2272b01 100644 --- a/crates/iota-graphql-e2e-tests/tests/errors/clever_errors_in_macros.move +++ b/crates/iota-graphql-e2e-tests/tests/errors/clever_errors_in_macros.move @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -//# init --protocol-version 1 --addresses P0=0x0 --accounts A --simulator +//# init --protocol-version 3 --addresses P0=0x0 --accounts A --simulator //# publish --sender A module P0::m { diff --git a/crates/iota-graphql-e2e-tests/tests/event_connection/combo_filter_error.move b/crates/iota-graphql-e2e-tests/tests/event_connection/combo_filter_error.move index 63e5f295316..26e79074e97 100644 --- a/crates/iota-graphql-e2e-tests/tests/event_connection/combo_filter_error.move +++ b/crates/iota-graphql-e2e-tests/tests/event_connection/combo_filter_error.move @@ -5,7 +5,7 @@ // Tests that fetching events filtered on both emitting module and event would result // in an error. -//# init --protocol-version 1 --addresses Test=0x0 --accounts A B --simulator +//# init --protocol-version 3 --addresses Test=0x0 --accounts A B --simulator //# publish module Test::M1 { diff --git a/crates/iota-graphql-e2e-tests/tests/event_connection/event_connection.exp b/crates/iota-graphql-e2e-tests/tests/event_connection/event_connection.exp index 20ea2fdff0d..6e2735a0628 100644 --- a/crates/iota-graphql-e2e-tests/tests/event_connection/event_connection.exp +++ b/crates/iota-graphql-e2e-tests/tests/event_connection/event_connection.exp @@ -62,7 +62,7 @@ Response: { "name": "M1" }, "type": { - "repr": "0x355db42904a277506aa6b010760f2493218951e292423698a0f1cda4fca6626c::M1::EventA" + "repr": "0xf79e299296162171b715da0d4813d40390ab12099666db8022a3eeab8b4c0896::M1::EventA" }, "sender": { "address": "0x8cca4e1ce0ba5904cea61df9242da2f7d29e3ef328fb7ec07c086b3bf47ca61a" @@ -80,7 +80,7 @@ Response: { "name": "M1" }, "type": { - "repr": "0x355db42904a277506aa6b010760f2493218951e292423698a0f1cda4fca6626c::M1::EventB<0x355db42904a277506aa6b010760f2493218951e292423698a0f1cda4fca6626c::M1::Object>" + "repr": "0xf79e299296162171b715da0d4813d40390ab12099666db8022a3eeab8b4c0896::M1::EventB<0xf79e299296162171b715da0d4813d40390ab12099666db8022a3eeab8b4c0896::M1::Object>" }, "sender": { "address": "0x8cca4e1ce0ba5904cea61df9242da2f7d29e3ef328fb7ec07c086b3bf47ca61a" @@ -98,7 +98,7 @@ Response: { "name": "M2" }, "type": { - "repr": "0x355db42904a277506aa6b010760f2493218951e292423698a0f1cda4fca6626c::M2::EventA" + "repr": "0xf79e299296162171b715da0d4813d40390ab12099666db8022a3eeab8b4c0896::M2::EventA" }, "sender": { "address": "0x8cca4e1ce0ba5904cea61df9242da2f7d29e3ef328fb7ec07c086b3bf47ca61a" @@ -116,7 +116,7 @@ Response: { "name": "M2" }, "type": { - "repr": "0x355db42904a277506aa6b010760f2493218951e292423698a0f1cda4fca6626c::M2::EventB<0x355db42904a277506aa6b010760f2493218951e292423698a0f1cda4fca6626c::M2::Object>" + "repr": "0xf79e299296162171b715da0d4813d40390ab12099666db8022a3eeab8b4c0896::M2::EventB<0xf79e299296162171b715da0d4813d40390ab12099666db8022a3eeab8b4c0896::M2::Object>" }, "sender": { "address": "0x8cca4e1ce0ba5904cea61df9242da2f7d29e3ef328fb7ec07c086b3bf47ca61a" @@ -145,7 +145,7 @@ Response: { "name": "M1" }, "type": { - "repr": "0x355db42904a277506aa6b010760f2493218951e292423698a0f1cda4fca6626c::M1::EventA" + "repr": "0xf79e299296162171b715da0d4813d40390ab12099666db8022a3eeab8b4c0896::M1::EventA" }, "sender": { "address": "0x8cca4e1ce0ba5904cea61df9242da2f7d29e3ef328fb7ec07c086b3bf47ca61a" @@ -163,7 +163,7 @@ Response: { "name": "M1" }, "type": { - "repr": "0x355db42904a277506aa6b010760f2493218951e292423698a0f1cda4fca6626c::M1::EventB<0x355db42904a277506aa6b010760f2493218951e292423698a0f1cda4fca6626c::M1::Object>" + "repr": "0xf79e299296162171b715da0d4813d40390ab12099666db8022a3eeab8b4c0896::M1::EventB<0xf79e299296162171b715da0d4813d40390ab12099666db8022a3eeab8b4c0896::M1::Object>" }, "sender": { "address": "0x8cca4e1ce0ba5904cea61df9242da2f7d29e3ef328fb7ec07c086b3bf47ca61a" @@ -181,7 +181,7 @@ Response: { "name": "M2" }, "type": { - "repr": "0x355db42904a277506aa6b010760f2493218951e292423698a0f1cda4fca6626c::M2::EventA" + "repr": "0xf79e299296162171b715da0d4813d40390ab12099666db8022a3eeab8b4c0896::M2::EventA" }, "sender": { "address": "0x8cca4e1ce0ba5904cea61df9242da2f7d29e3ef328fb7ec07c086b3bf47ca61a" @@ -199,7 +199,7 @@ Response: { "name": "M2" }, "type": { - "repr": "0x355db42904a277506aa6b010760f2493218951e292423698a0f1cda4fca6626c::M2::EventB<0x355db42904a277506aa6b010760f2493218951e292423698a0f1cda4fca6626c::M2::Object>" + "repr": "0xf79e299296162171b715da0d4813d40390ab12099666db8022a3eeab8b4c0896::M2::EventB<0xf79e299296162171b715da0d4813d40390ab12099666db8022a3eeab8b4c0896::M2::Object>" }, "sender": { "address": "0x8cca4e1ce0ba5904cea61df9242da2f7d29e3ef328fb7ec07c086b3bf47ca61a" @@ -228,7 +228,7 @@ Response: { "name": "M1" }, "type": { - "repr": "0x355db42904a277506aa6b010760f2493218951e292423698a0f1cda4fca6626c::M1::EventA" + "repr": "0xf79e299296162171b715da0d4813d40390ab12099666db8022a3eeab8b4c0896::M1::EventA" }, "sender": { "address": "0x8cca4e1ce0ba5904cea61df9242da2f7d29e3ef328fb7ec07c086b3bf47ca61a" @@ -246,7 +246,7 @@ Response: { "name": "M1" }, "type": { - "repr": "0x355db42904a277506aa6b010760f2493218951e292423698a0f1cda4fca6626c::M1::EventB<0x355db42904a277506aa6b010760f2493218951e292423698a0f1cda4fca6626c::M1::Object>" + "repr": "0xf79e299296162171b715da0d4813d40390ab12099666db8022a3eeab8b4c0896::M1::EventB<0xf79e299296162171b715da0d4813d40390ab12099666db8022a3eeab8b4c0896::M1::Object>" }, "sender": { "address": "0x8cca4e1ce0ba5904cea61df9242da2f7d29e3ef328fb7ec07c086b3bf47ca61a" @@ -275,7 +275,7 @@ Response: { "name": "M1" }, "type": { - "repr": "0x355db42904a277506aa6b010760f2493218951e292423698a0f1cda4fca6626c::M1::EventA" + "repr": "0xf79e299296162171b715da0d4813d40390ab12099666db8022a3eeab8b4c0896::M1::EventA" }, "sender": { "address": "0x8cca4e1ce0ba5904cea61df9242da2f7d29e3ef328fb7ec07c086b3bf47ca61a" @@ -304,7 +304,7 @@ Response: { "name": "M1" }, "type": { - "repr": "0x355db42904a277506aa6b010760f2493218951e292423698a0f1cda4fca6626c::M1::EventB<0x355db42904a277506aa6b010760f2493218951e292423698a0f1cda4fca6626c::M1::Object>" + "repr": "0xf79e299296162171b715da0d4813d40390ab12099666db8022a3eeab8b4c0896::M1::EventB<0xf79e299296162171b715da0d4813d40390ab12099666db8022a3eeab8b4c0896::M1::Object>" }, "sender": { "address": "0x8cca4e1ce0ba5904cea61df9242da2f7d29e3ef328fb7ec07c086b3bf47ca61a" diff --git a/crates/iota-graphql-e2e-tests/tests/event_connection/event_connection.move b/crates/iota-graphql-e2e-tests/tests/event_connection/event_connection.move index e75def35ee1..475662bf2fe 100644 --- a/crates/iota-graphql-e2e-tests/tests/event_connection/event_connection.move +++ b/crates/iota-graphql-e2e-tests/tests/event_connection/event_connection.move @@ -10,7 +10,7 @@ // Verifies correct event when filtered for Test::M1::EventB // Verifies error when filtered on sender, package, module and event type with generics and < -//# init --protocol-version 1 --addresses Test=0x0 --accounts A B --simulator +//# init --protocol-version 3 --addresses Test=0x0 --accounts A B --simulator //# publish module Test::M1 { diff --git a/crates/iota-graphql-e2e-tests/tests/event_connection/nested_emit_event.exp b/crates/iota-graphql-e2e-tests/tests/event_connection/nested_emit_event.exp index 10fe278d63e..5048dae8740 100644 --- a/crates/iota-graphql-e2e-tests/tests/event_connection/nested_emit_event.exp +++ b/crates/iota-graphql-e2e-tests/tests/event_connection/nested_emit_event.exp @@ -30,7 +30,7 @@ Response: { "name": "M3" }, "type": { - "repr": "0x4ce60f0572bedc153aaa9b5515c1f8364b76fead9bd0c01dc9e5c8c39846d156::M1::EventA" + "repr": "0x3317437a9fe9c78bda693c85b8a7227ae260153ddaa28e58a7906237bf227d84::M1::EventA" }, "sender": { "address": "0x8cca4e1ce0ba5904cea61df9242da2f7d29e3ef328fb7ec07c086b3bf47ca61a" @@ -56,7 +56,7 @@ Response: { "name": "M3" }, "type": { - "repr": "0x4ce60f0572bedc153aaa9b5515c1f8364b76fead9bd0c01dc9e5c8c39846d156::M1::EventA" + "repr": "0x3317437a9fe9c78bda693c85b8a7227ae260153ddaa28e58a7906237bf227d84::M1::EventA" }, "sender": { "address": "0x8cca4e1ce0ba5904cea61df9242da2f7d29e3ef328fb7ec07c086b3bf47ca61a" @@ -102,7 +102,7 @@ Response: { "name": "M3" }, "type": { - "repr": "0x4ce60f0572bedc153aaa9b5515c1f8364b76fead9bd0c01dc9e5c8c39846d156::M1::EventA" + "repr": "0x3317437a9fe9c78bda693c85b8a7227ae260153ddaa28e58a7906237bf227d84::M1::EventA" }, "sender": { "address": "0x8cca4e1ce0ba5904cea61df9242da2f7d29e3ef328fb7ec07c086b3bf47ca61a" diff --git a/crates/iota-graphql-e2e-tests/tests/event_connection/nested_emit_event.move b/crates/iota-graphql-e2e-tests/tests/event_connection/nested_emit_event.move index 4f495dd769c..60b882f1fe9 100644 --- a/crates/iota-graphql-e2e-tests/tests/event_connection/nested_emit_event.move +++ b/crates/iota-graphql-e2e-tests/tests/event_connection/nested_emit_event.move @@ -6,7 +6,7 @@ // The emitting module is where the entrypoint function is defined - // in other words, the function called by a programmable transaction block. -//# init --protocol-version 1 --addresses Test=0x0 --accounts A --simulator +//# init --protocol-version 3 --addresses Test=0x0 --accounts A --simulator //# publish module Test::M1 { diff --git a/crates/iota-graphql-e2e-tests/tests/event_connection/no_filter.exp b/crates/iota-graphql-e2e-tests/tests/event_connection/no_filter.exp index 8a1728c5601..5b58043da43 100644 --- a/crates/iota-graphql-e2e-tests/tests/event_connection/no_filter.exp +++ b/crates/iota-graphql-e2e-tests/tests/event_connection/no_filter.exp @@ -33,12 +33,12 @@ Response: { "nodes": [ { "json": { - "id": "0x7d4c1fe3f73cdd9531f795b56fb6ad1cbbc4a14efff6af465256be7c52c0d404" + "id": "0x55a6b566aa7d7e5b03deef0dd47a9c124b037655f160ba09dcff14cf032a6c90" } }, { "json": { - "id": "0x7d4c1fe3f73cdd9531f795b56fb6ad1cbbc4a14efff6af465256be7c52c0d404", + "id": "0x55a6b566aa7d7e5b03deef0dd47a9c124b037655f160ba09dcff14cf032a6c90", "version": 1, "fields": { "contents": [ diff --git a/crates/iota-graphql-e2e-tests/tests/event_connection/no_filter.move b/crates/iota-graphql-e2e-tests/tests/event_connection/no_filter.move index 2c50f654d39..25349c2de0c 100644 --- a/crates/iota-graphql-e2e-tests/tests/event_connection/no_filter.move +++ b/crates/iota-graphql-e2e-tests/tests/event_connection/no_filter.move @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -//# init --protocol-version 1 --addresses Test=0x0 --accounts A --simulator +//# init --protocol-version 3 --addresses Test=0x0 --accounts A --simulator //# publish module Test::M1 { diff --git a/crates/iota-graphql-e2e-tests/tests/event_connection/pagination.exp b/crates/iota-graphql-e2e-tests/tests/event_connection/pagination.exp index 6015776f3fe..de49d1769ec 100644 --- a/crates/iota-graphql-e2e-tests/tests/event_connection/pagination.exp +++ b/crates/iota-graphql-e2e-tests/tests/event_connection/pagination.exp @@ -42,7 +42,7 @@ Response: { "name": "M1" }, "type": { - "repr": "0x999de5aa7620209919ea1dc088028fffa75c36282190e063c3df58534d2842b1::M1::EventA" + "repr": "0x9ad464974f1d2c4ca76338261ac674df3da7f19d51fda13d7fad14c23d1ab9cc::M1::EventA" }, "sender": { "address": "0x8cca4e1ce0ba5904cea61df9242da2f7d29e3ef328fb7ec07c086b3bf47ca61a" @@ -60,7 +60,7 @@ Response: { "name": "M1" }, "type": { - "repr": "0x999de5aa7620209919ea1dc088028fffa75c36282190e063c3df58534d2842b1::M1::EventA" + "repr": "0x9ad464974f1d2c4ca76338261ac674df3da7f19d51fda13d7fad14c23d1ab9cc::M1::EventA" }, "sender": { "address": "0x8cca4e1ce0ba5904cea61df9242da2f7d29e3ef328fb7ec07c086b3bf47ca61a" @@ -78,7 +78,7 @@ Response: { "name": "M1" }, "type": { - "repr": "0x999de5aa7620209919ea1dc088028fffa75c36282190e063c3df58534d2842b1::M1::EventA" + "repr": "0x9ad464974f1d2c4ca76338261ac674df3da7f19d51fda13d7fad14c23d1ab9cc::M1::EventA" }, "sender": { "address": "0x8cca4e1ce0ba5904cea61df9242da2f7d29e3ef328fb7ec07c086b3bf47ca61a" @@ -111,7 +111,7 @@ Response: { "name": "M1" }, "type": { - "repr": "0x999de5aa7620209919ea1dc088028fffa75c36282190e063c3df58534d2842b1::M1::EventA" + "repr": "0x9ad464974f1d2c4ca76338261ac674df3da7f19d51fda13d7fad14c23d1ab9cc::M1::EventA" }, "sender": { "address": "0x8cca4e1ce0ba5904cea61df9242da2f7d29e3ef328fb7ec07c086b3bf47ca61a" @@ -129,7 +129,7 @@ Response: { "name": "M1" }, "type": { - "repr": "0x999de5aa7620209919ea1dc088028fffa75c36282190e063c3df58534d2842b1::M1::EventA" + "repr": "0x9ad464974f1d2c4ca76338261ac674df3da7f19d51fda13d7fad14c23d1ab9cc::M1::EventA" }, "sender": { "address": "0x8cca4e1ce0ba5904cea61df9242da2f7d29e3ef328fb7ec07c086b3bf47ca61a" @@ -162,7 +162,7 @@ Response: { "name": "M1" }, "type": { - "repr": "0x999de5aa7620209919ea1dc088028fffa75c36282190e063c3df58534d2842b1::M1::EventA" + "repr": "0x9ad464974f1d2c4ca76338261ac674df3da7f19d51fda13d7fad14c23d1ab9cc::M1::EventA" }, "sender": { "address": "0x8cca4e1ce0ba5904cea61df9242da2f7d29e3ef328fb7ec07c086b3bf47ca61a" @@ -180,7 +180,7 @@ Response: { "name": "M1" }, "type": { - "repr": "0x999de5aa7620209919ea1dc088028fffa75c36282190e063c3df58534d2842b1::M1::EventA" + "repr": "0x9ad464974f1d2c4ca76338261ac674df3da7f19d51fda13d7fad14c23d1ab9cc::M1::EventA" }, "sender": { "address": "0x8cca4e1ce0ba5904cea61df9242da2f7d29e3ef328fb7ec07c086b3bf47ca61a" @@ -213,7 +213,7 @@ Response: { "name": "M1" }, "type": { - "repr": "0x999de5aa7620209919ea1dc088028fffa75c36282190e063c3df58534d2842b1::M1::EventA" + "repr": "0x9ad464974f1d2c4ca76338261ac674df3da7f19d51fda13d7fad14c23d1ab9cc::M1::EventA" }, "sender": { "address": "0x8cca4e1ce0ba5904cea61df9242da2f7d29e3ef328fb7ec07c086b3bf47ca61a" @@ -231,7 +231,7 @@ Response: { "name": "M1" }, "type": { - "repr": "0x999de5aa7620209919ea1dc088028fffa75c36282190e063c3df58534d2842b1::M1::EventA" + "repr": "0x9ad464974f1d2c4ca76338261ac674df3da7f19d51fda13d7fad14c23d1ab9cc::M1::EventA" }, "sender": { "address": "0x8cca4e1ce0ba5904cea61df9242da2f7d29e3ef328fb7ec07c086b3bf47ca61a" diff --git a/crates/iota-graphql-e2e-tests/tests/event_connection/pagination.move b/crates/iota-graphql-e2e-tests/tests/event_connection/pagination.move index 514f6b954ef..005b6f6c5f4 100644 --- a/crates/iota-graphql-e2e-tests/tests/event_connection/pagination.move +++ b/crates/iota-graphql-e2e-tests/tests/event_connection/pagination.move @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -//# init --protocol-version 1 --addresses Test=0x0 --accounts A --simulator +//# init --protocol-version 3 --addresses Test=0x0 --accounts A --simulator //# publish module Test::M1 { diff --git a/crates/iota-graphql-e2e-tests/tests/event_connection/tx_digest.exp b/crates/iota-graphql-e2e-tests/tests/event_connection/tx_digest.exp index 2b1087ce2ef..47701a5d734 100644 --- a/crates/iota-graphql-e2e-tests/tests/event_connection/tx_digest.exp +++ b/crates/iota-graphql-e2e-tests/tests/event_connection/tx_digest.exp @@ -37,19 +37,19 @@ Response: { "transactionBlocks": { "nodes": [ { - "digest": "CmPeQ2JKFnEKeZsYz9cYU8q57Wb1fgZxpDqYq9YinuQA" + "digest": "5XJr4MXW36JcHWpqf2PF2oAD2cfWg4bk1jQWVp6Josvj" }, { - "digest": "Cr67aCWwfbpbrQvsdhniTfA6v6wEbyTA5cwKr7MeVo6h" + "digest": "6gj6p9W2h9EVhCRKeDp6oqs24b6wKhTD4XzxqUp68gmX" }, { - "digest": "F9dhDrsiFxBWatoDNmExL7PQQW6xBzpAj8iyqbzAagXj" + "digest": "7s5GAykr3qnQKCbAbNT8peqP5Yu5bA1sJgj4bdzXrmqq" }, { - "digest": "EkH8TQ1xRv4Lj4wtD4kRuZrsPYP2vGKSk2mtbeENDGsn" + "digest": "DvfnX27xkS1oE9XuTiQbacrnMhsXshdbV9oYWx6jzkro" }, { - "digest": "9oZ3VdEUep1tbAAHbrACiQEPuRAwvXYU4m3TrViQSB5v" + "digest": "H5Y3w7yiV7N4VFNXKTNjHE6UetWxZ1dFR6uguKKmtVMh" } ] } diff --git a/crates/iota-graphql-e2e-tests/tests/event_connection/tx_digest.move b/crates/iota-graphql-e2e-tests/tests/event_connection/tx_digest.move index e6f9ea2833d..515512a008b 100644 --- a/crates/iota-graphql-e2e-tests/tests/event_connection/tx_digest.move +++ b/crates/iota-graphql-e2e-tests/tests/event_connection/tx_digest.move @@ -6,7 +6,7 @@ // Also tests that fetching events filtered on a tx digest that has events returns the correct // number of page-limit-bound nodes. -//# init --protocol-version 1 --addresses Test=0x0 --accounts A B --simulator +//# init --protocol-version 3 --addresses Test=0x0 --accounts A B --simulator //# publish module Test::M1 { @@ -47,7 +47,7 @@ module Test::M1 { { # `transactionDigest` is the digest of the 4th transaction returned by # task 6 (see `tx_digest.exp`) - events(filter: {transactionDigest: "EkH8TQ1xRv4Lj4wtD4kRuZrsPYP2vGKSk2mtbeENDGsn"}) { + events(filter: {transactionDigest: "DvfnX27xkS1oE9XuTiQbacrnMhsXshdbV9oYWx6jzkro"}) { edges { cursor node { @@ -62,7 +62,7 @@ module Test::M1 { { # `transactionDigest` is the digest of the 4th transaction returned by # task 6 (see `tx_digest.exp`) - events(after: "@{cursor_0}" filter: {transactionDigest: "EkH8TQ1xRv4Lj4wtD4kRuZrsPYP2vGKSk2mtbeENDGsn"}) { + events(after: "@{cursor_0}" filter: {transactionDigest: "DvfnX27xkS1oE9XuTiQbacrnMhsXshdbV9oYWx6jzkro"}) { edges { cursor node { @@ -79,7 +79,7 @@ module Test::M1 { { # `transactionDigest` is the digest of the 4th transaction returned by # task 6 (see `tx_digest.exp`) - events(after: "@{cursor_0}" filter: {transactionDigest: "EkH8TQ1xRv4Lj4wtD4kRuZrsPYP2vGKSk2mtbeENDGsn"}) { + events(after: "@{cursor_0}" filter: {transactionDigest: "DvfnX27xkS1oE9XuTiQbacrnMhsXshdbV9oYWx6jzkro"}) { edges { cursor node { @@ -94,7 +94,7 @@ module Test::M1 { { # `transactionDigest` is the digest of the 5th transaction returned by # task 6 (see `tx_digest.exp`) - events(filter: {transactionDigest: "9oZ3VdEUep1tbAAHbrACiQEPuRAwvXYU4m3TrViQSB5v"}) { + events(filter: {transactionDigest: "H5Y3w7yiV7N4VFNXKTNjHE6UetWxZ1dFR6uguKKmtVMh"}) { edges { cursor node { @@ -108,7 +108,7 @@ module Test::M1 { { # `transactionDigest` is the digest of the 5th transaction returned by # task 6 (see `tx_digest.exp`) - events(after: "@{cursor_0}" filter: {transactionDigest: "9oZ3VdEUep1tbAAHbrACiQEPuRAwvXYU4m3TrViQSB5v"}) { + events(after: "@{cursor_0}" filter: {transactionDigest: "H5Y3w7yiV7N4VFNXKTNjHE6UetWxZ1dFR6uguKKmtVMh"}) { edges { cursor node { @@ -123,7 +123,7 @@ module Test::M1 { { # `transactionDigest` is the digest of the 4th transaction returned by # task 6 (see `tx_digest.exp`) - events(last: 10 filter: {transactionDigest: "EkH8TQ1xRv4Lj4wtD4kRuZrsPYP2vGKSk2mtbeENDGsn"}) { + events(last: 10 filter: {transactionDigest: "DvfnX27xkS1oE9XuTiQbacrnMhsXshdbV9oYWx6jzkro"}) { edges { cursor node { @@ -138,7 +138,7 @@ module Test::M1 { { # `transactionDigest` is the digest of the 4th transaction returned by # task 6 (see `tx_digest.exp`) - events(last: 10 before: "@{cursor_0}" filter: {transactionDigest: "EkH8TQ1xRv4Lj4wtD4kRuZrsPYP2vGKSk2mtbeENDGsn"}) { + events(last: 10 before: "@{cursor_0}" filter: {transactionDigest: "DvfnX27xkS1oE9XuTiQbacrnMhsXshdbV9oYWx6jzkro"}) { edges { cursor node { @@ -155,7 +155,7 @@ module Test::M1 { { # `transactionDigest` is the digest of the 4th transaction returned by # task 6 (see `tx_digest.exp`) - events(last: 10 before: "@{cursor_0}" filter: {transactionDigest: "EkH8TQ1xRv4Lj4wtD4kRuZrsPYP2vGKSk2mtbeENDGsn"}) { + events(last: 10 before: "@{cursor_0}" filter: {transactionDigest: "DvfnX27xkS1oE9XuTiQbacrnMhsXshdbV9oYWx6jzkro"}) { edges { cursor node { @@ -170,7 +170,7 @@ module Test::M1 { { # `transactionDigest` is the digest of the 5th transaction returned by # task 6 (see `tx_digest.exp`) - events(last: 10 filter: {transactionDigest: "9oZ3VdEUep1tbAAHbrACiQEPuRAwvXYU4m3TrViQSB5v"}) { + events(last: 10 filter: {transactionDigest: "H5Y3w7yiV7N4VFNXKTNjHE6UetWxZ1dFR6uguKKmtVMh"}) { edges { cursor node { @@ -184,7 +184,7 @@ module Test::M1 { { # `transactionDigest` is the digest of the 5th transaction returned by # task 6 (see `tx_digest.exp`) - events(last: 10 before: "@{cursor_0}" filter: {transactionDigest: "9oZ3VdEUep1tbAAHbrACiQEPuRAwvXYU4m3TrViQSB5v"}) { + events(last: 10 before: "@{cursor_0}" filter: {transactionDigest: "H5Y3w7yiV7N4VFNXKTNjHE6UetWxZ1dFR6uguKKmtVMh"}) { edges { cursor node { @@ -199,7 +199,7 @@ module Test::M1 { { # `transactionDigest` is the digest of the 4th transaction returned by # task 6 (see `tx_digest.exp`) - events(filter: {sender: "@{A}" transactionDigest: "EkH8TQ1xRv4Lj4wtD4kRuZrsPYP2vGKSk2mtbeENDGsn"}) { + events(filter: {sender: "@{A}" transactionDigest: "DvfnX27xkS1oE9XuTiQbacrnMhsXshdbV9oYWx6jzkro"}) { edges { cursor node { @@ -214,7 +214,7 @@ module Test::M1 { { # `transactionDigest` is the digest of the 5th transaction returned by # task 6 (see `tx_digest.exp`) - events(filter: {sender: "@{B}" transactionDigest: "9oZ3VdEUep1tbAAHbrACiQEPuRAwvXYU4m3TrViQSB5v"}) { + events(filter: {sender: "@{B}" transactionDigest: "H5Y3w7yiV7N4VFNXKTNjHE6UetWxZ1dFR6uguKKmtVMh"}) { edges { cursor node { @@ -229,7 +229,7 @@ module Test::M1 { { # `transactionDigest` is the digest of the 4th transaction returned by # task 6 (see `tx_digest.exp`) - events(filter: {sender: "@{B}" transactionDigest: "EkH8TQ1xRv4Lj4wtD4kRuZrsPYP2vGKSk2mtbeENDGsn"}) { + events(filter: {sender: "@{B}" transactionDigest: "DvfnX27xkS1oE9XuTiQbacrnMhsXshdbV9oYWx6jzkro"}) { edges { cursor node { @@ -244,7 +244,7 @@ module Test::M1 { { # `transactionDigest` is the digest of the 5th transaction returned by # task 6 (see `tx_digest.exp`) - events(filter: {sender: "@{A}" transactionDigest: "9oZ3VdEUep1tbAAHbrACiQEPuRAwvXYU4m3TrViQSB5v"}) { + events(filter: {sender: "@{A}" transactionDigest: "H5Y3w7yiV7N4VFNXKTNjHE6UetWxZ1dFR6uguKKmtVMh"}) { edges { cursor node { diff --git a/crates/iota-graphql-e2e-tests/tests/event_connection/type_filter.exp b/crates/iota-graphql-e2e-tests/tests/event_connection/type_filter.exp index 3b1903593bf..0d3a212357a 100644 --- a/crates/iota-graphql-e2e-tests/tests/event_connection/type_filter.exp +++ b/crates/iota-graphql-e2e-tests/tests/event_connection/type_filter.exp @@ -30,7 +30,7 @@ Response: { "name": "M2" }, "type": { - "repr": "0x1978d81fd93431a2b3ce6565adff1d6b3608ebbc3f81bca49672392044fa0eca::M1::EventA" + "repr": "0x45fe4a1c1c0acc7fbdd60355112b0227271f9ecb15969de0861f7322ad174def::M1::EventA" }, "sender": { "address": "0x8cca4e1ce0ba5904cea61df9242da2f7d29e3ef328fb7ec07c086b3bf47ca61a" @@ -72,7 +72,7 @@ Response: { "name": "M2" }, "type": { - "repr": "0x1978d81fd93431a2b3ce6565adff1d6b3608ebbc3f81bca49672392044fa0eca::M1::EventA" + "repr": "0x45fe4a1c1c0acc7fbdd60355112b0227271f9ecb15969de0861f7322ad174def::M1::EventA" }, "sender": { "address": "0x8cca4e1ce0ba5904cea61df9242da2f7d29e3ef328fb7ec07c086b3bf47ca61a" @@ -98,7 +98,7 @@ Response: { "name": "M2" }, "type": { - "repr": "0x1978d81fd93431a2b3ce6565adff1d6b3608ebbc3f81bca49672392044fa0eca::M2::EventB" + "repr": "0x45fe4a1c1c0acc7fbdd60355112b0227271f9ecb15969de0861f7322ad174def::M2::EventB" }, "sender": { "address": "0x8cca4e1ce0ba5904cea61df9242da2f7d29e3ef328fb7ec07c086b3bf47ca61a" @@ -124,7 +124,7 @@ Response: { "name": "M2" }, "type": { - "repr": "0x1978d81fd93431a2b3ce6565adff1d6b3608ebbc3f81bca49672392044fa0eca::M1::EventA" + "repr": "0x45fe4a1c1c0acc7fbdd60355112b0227271f9ecb15969de0861f7322ad174def::M1::EventA" }, "sender": { "address": "0x8cca4e1ce0ba5904cea61df9242da2f7d29e3ef328fb7ec07c086b3bf47ca61a" @@ -139,7 +139,7 @@ Response: { "name": "M2" }, "type": { - "repr": "0x1978d81fd93431a2b3ce6565adff1d6b3608ebbc3f81bca49672392044fa0eca::M2::EventB" + "repr": "0x45fe4a1c1c0acc7fbdd60355112b0227271f9ecb15969de0861f7322ad174def::M2::EventB" }, "sender": { "address": "0x8cca4e1ce0ba5904cea61df9242da2f7d29e3ef328fb7ec07c086b3bf47ca61a" @@ -165,7 +165,7 @@ Response: { "name": "M2" }, "type": { - "repr": "0x1978d81fd93431a2b3ce6565adff1d6b3608ebbc3f81bca49672392044fa0eca::M1::EventA" + "repr": "0x45fe4a1c1c0acc7fbdd60355112b0227271f9ecb15969de0861f7322ad174def::M1::EventA" }, "sender": { "address": "0x8cca4e1ce0ba5904cea61df9242da2f7d29e3ef328fb7ec07c086b3bf47ca61a" @@ -180,7 +180,7 @@ Response: { "name": "M2" }, "type": { - "repr": "0x1978d81fd93431a2b3ce6565adff1d6b3608ebbc3f81bca49672392044fa0eca::M2::EventB" + "repr": "0x45fe4a1c1c0acc7fbdd60355112b0227271f9ecb15969de0861f7322ad174def::M2::EventB" }, "sender": { "address": "0x8cca4e1ce0ba5904cea61df9242da2f7d29e3ef328fb7ec07c086b3bf47ca61a" @@ -195,7 +195,7 @@ Response: { "name": "M2" }, "type": { - "repr": "0x1978d81fd93431a2b3ce6565adff1d6b3608ebbc3f81bca49672392044fa0eca::M2::EventB" + "repr": "0x45fe4a1c1c0acc7fbdd60355112b0227271f9ecb15969de0861f7322ad174def::M2::EventB" }, "sender": { "address": "0x28f02a953f3553f51a9365593c7d4bd0643d2085f004b18c6ca9de51682b2c80" diff --git a/crates/iota-graphql-e2e-tests/tests/event_connection/type_filter.move b/crates/iota-graphql-e2e-tests/tests/event_connection/type_filter.move index c3b5d6bf01f..33de4e0cbcd 100644 --- a/crates/iota-graphql-e2e-tests/tests/event_connection/type_filter.move +++ b/crates/iota-graphql-e2e-tests/tests/event_connection/type_filter.move @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -//# init --protocol-version 1 --addresses Test=0x0 --accounts A B --simulator +//# init --protocol-version 3 --addresses Test=0x0 --accounts A B --simulator //# publish module Test::M1 { diff --git a/crates/iota-graphql-e2e-tests/tests/event_connection/type_param_filter.exp b/crates/iota-graphql-e2e-tests/tests/event_connection/type_param_filter.exp index 034c36b518a..cf82d55558f 100644 --- a/crates/iota-graphql-e2e-tests/tests/event_connection/type_param_filter.exp +++ b/crates/iota-graphql-e2e-tests/tests/event_connection/type_param_filter.exp @@ -38,19 +38,19 @@ Response: { "transactionBlocks": { "nodes": [ { - "digest": "CmPeQ2JKFnEKeZsYz9cYU8q57Wb1fgZxpDqYq9YinuQA" + "digest": "5XJr4MXW36JcHWpqf2PF2oAD2cfWg4bk1jQWVp6Josvj" }, { - "digest": "ChGw1FpdLESefvbz4sAoni52P9jWpTAubgxkNsvV5kSk" + "digest": "2pBMcHK9WnYkufQTf4UisKPSg9Ub1dsocywVuPDqVzmD" }, { - "digest": "6muLxHj13tG23qV2eyNud8ciUrKno4NUpDFFFoGMRTNW" + "digest": "8enbCf5TacFaL4FyrZTL3mybyPUNGNzg8mLuYH5D5WgG" }, { - "digest": "5b7G3sXWboXZSKB6zQqzH3rq15Q4UqbaFRrfS9HpQR9B" + "digest": "AX1vKAJ59ZRqqswuP1XiWULhvUn8VAepSoapmtpYVpkS" }, { - "digest": "mnGPbLwe3rhbRZMokPmZXJtCtrpYzBQ6wFwJ7mrg56w" + "digest": "66oELEdw4Aj9VA751HaSEzwyVccggCW7TcgigqiSyZab" } ] } @@ -65,7 +65,7 @@ Response: { "nodes": [ { "type": { - "repr": "0x0743c995c75b4bdcf02b9585730ea00567a502031977468fdcc80bd0e1449270::M1::EventA<0x0743c995c75b4bdcf02b9585730ea00567a502031977468fdcc80bd0e1449270::M1::T1>" + "repr": "0x9a25c1cfdc5a40871cb1315bd9b7c869b2780e66f539307c2599e97d8048ae49::M1::EventA<0x9a25c1cfdc5a40871cb1315bd9b7c869b2780e66f539307c2599e97d8048ae49::M1::T1>" }, "sender": { "address": "0x8cca4e1ce0ba5904cea61df9242da2f7d29e3ef328fb7ec07c086b3bf47ca61a" @@ -78,7 +78,7 @@ Response: { }, { "type": { - "repr": "0x0743c995c75b4bdcf02b9585730ea00567a502031977468fdcc80bd0e1449270::M1::EventA<0x0743c995c75b4bdcf02b9585730ea00567a502031977468fdcc80bd0e1449270::M1::T2>" + "repr": "0x9a25c1cfdc5a40871cb1315bd9b7c869b2780e66f539307c2599e97d8048ae49::M1::EventA<0x9a25c1cfdc5a40871cb1315bd9b7c869b2780e66f539307c2599e97d8048ae49::M1::T2>" }, "sender": { "address": "0x8cca4e1ce0ba5904cea61df9242da2f7d29e3ef328fb7ec07c086b3bf47ca61a" @@ -91,7 +91,7 @@ Response: { }, { "type": { - "repr": "0x0743c995c75b4bdcf02b9585730ea00567a502031977468fdcc80bd0e1449270::M1::EventA<0x0743c995c75b4bdcf02b9585730ea00567a502031977468fdcc80bd0e1449270::M1::T1>" + "repr": "0x9a25c1cfdc5a40871cb1315bd9b7c869b2780e66f539307c2599e97d8048ae49::M1::EventA<0x9a25c1cfdc5a40871cb1315bd9b7c869b2780e66f539307c2599e97d8048ae49::M1::T1>" }, "sender": { "address": "0x8cca4e1ce0ba5904cea61df9242da2f7d29e3ef328fb7ec07c086b3bf47ca61a" @@ -104,7 +104,7 @@ Response: { }, { "type": { - "repr": "0x0743c995c75b4bdcf02b9585730ea00567a502031977468fdcc80bd0e1449270::M1::EventA<0x0743c995c75b4bdcf02b9585730ea00567a502031977468fdcc80bd0e1449270::M1::T2>" + "repr": "0x9a25c1cfdc5a40871cb1315bd9b7c869b2780e66f539307c2599e97d8048ae49::M1::EventA<0x9a25c1cfdc5a40871cb1315bd9b7c869b2780e66f539307c2599e97d8048ae49::M1::T2>" }, "sender": { "address": "0x8cca4e1ce0ba5904cea61df9242da2f7d29e3ef328fb7ec07c086b3bf47ca61a" @@ -128,7 +128,7 @@ Response: { "nodes": [ { "type": { - "repr": "0x0743c995c75b4bdcf02b9585730ea00567a502031977468fdcc80bd0e1449270::M1::EventA<0x0743c995c75b4bdcf02b9585730ea00567a502031977468fdcc80bd0e1449270::M1::T1>" + "repr": "0x9a25c1cfdc5a40871cb1315bd9b7c869b2780e66f539307c2599e97d8048ae49::M1::EventA<0x9a25c1cfdc5a40871cb1315bd9b7c869b2780e66f539307c2599e97d8048ae49::M1::T1>" }, "sender": { "address": "0x8cca4e1ce0ba5904cea61df9242da2f7d29e3ef328fb7ec07c086b3bf47ca61a" @@ -141,7 +141,7 @@ Response: { }, { "type": { - "repr": "0x0743c995c75b4bdcf02b9585730ea00567a502031977468fdcc80bd0e1449270::M1::EventA<0x0743c995c75b4bdcf02b9585730ea00567a502031977468fdcc80bd0e1449270::M1::T1>" + "repr": "0x9a25c1cfdc5a40871cb1315bd9b7c869b2780e66f539307c2599e97d8048ae49::M1::EventA<0x9a25c1cfdc5a40871cb1315bd9b7c869b2780e66f539307c2599e97d8048ae49::M1::T1>" }, "sender": { "address": "0x8cca4e1ce0ba5904cea61df9242da2f7d29e3ef328fb7ec07c086b3bf47ca61a" @@ -165,7 +165,7 @@ Response: { "nodes": [ { "type": { - "repr": "0x0743c995c75b4bdcf02b9585730ea00567a502031977468fdcc80bd0e1449270::M1::EventA<0x0743c995c75b4bdcf02b9585730ea00567a502031977468fdcc80bd0e1449270::M1::T2>" + "repr": "0x9a25c1cfdc5a40871cb1315bd9b7c869b2780e66f539307c2599e97d8048ae49::M1::EventA<0x9a25c1cfdc5a40871cb1315bd9b7c869b2780e66f539307c2599e97d8048ae49::M1::T2>" }, "sender": { "address": "0x8cca4e1ce0ba5904cea61df9242da2f7d29e3ef328fb7ec07c086b3bf47ca61a" diff --git a/crates/iota-graphql-e2e-tests/tests/event_connection/type_param_filter.move b/crates/iota-graphql-e2e-tests/tests/event_connection/type_param_filter.move index a8df0d44e52..ba967f74244 100644 --- a/crates/iota-graphql-e2e-tests/tests/event_connection/type_param_filter.move +++ b/crates/iota-graphql-e2e-tests/tests/event_connection/type_param_filter.move @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -//# init --protocol-version 1 --addresses Test=0x0 --accounts A B --simulator +//# init --protocol-version 3 --addresses Test=0x0 --accounts A B --simulator //# publish module Test::M1 { @@ -81,7 +81,7 @@ module Test::M1 { { # `transactionDigest` is the digest of the 5th transaction returned from # task 6 (see `type_param_filter.exp`) - events(filter: {eventType: "@{Test}::M1::EventA<@{Test}::M1::T2>", transactionDigest: "mnGPbLwe3rhbRZMokPmZXJtCtrpYzBQ6wFwJ7mrg56w"}) { + events(filter: {eventType: "@{Test}::M1::EventA<@{Test}::M1::T2>", transactionDigest: "66oELEdw4Aj9VA751HaSEzwyVccggCW7TcgigqiSyZab"}) { nodes { type { repr diff --git a/crates/iota-graphql-e2e-tests/tests/events/sending_module.exp b/crates/iota-graphql-e2e-tests/tests/events/sending_module.exp new file mode 100644 index 00000000000..ff198aa7f33 --- /dev/null +++ b/crates/iota-graphql-e2e-tests/tests/events/sending_module.exp @@ -0,0 +1,70 @@ +processed 6 tasks + +init: +A: object(0,0) + +task 1, lines 8-13: +//# publish --upgradeable --sender A +created: object(1,0), object(1,1) +mutated: object(0,0) +gas summary: computation_cost: 1000000, computation_cost_burned: 1000000, storage_cost: 5312400, storage_rebate: 0, non_refundable_storage_fee: 0 + +task 2, lines 14-27: +//# upgrade --package Test --upgrade-capability 1,1 --sender A +created: object(2,0) +mutated: object(0,0), object(1,1) +gas summary: computation_cost: 1000000, computation_cost_burned: 1000000, storage_cost: 6786800, storage_rebate: 2606800, non_refundable_storage_fee: 0 + +task 3, line 28: +//# run Test::M1::emit --sender A +events: Event { package_id: Test, transaction_module: Identifier("M1"), sender: A, type_: StructTag { address: fake(1,0), module: Identifier("M0"), name: Identifier("Event"), type_params: [] }, contents: [42, 0, 0, 0, 0, 0, 0, 0] } +mutated: object(0,0) +gas summary: computation_cost: 1000000, computation_cost_burned: 1000000, storage_cost: 980400, storage_rebate: 980400, non_refundable_storage_fee: 0 + +task 4, line 30: +//# create-checkpoint +Checkpoint created: 1 + +task 5, lines 32-47: +//# run-graphql +Response: { + "data": { + "events": { + "nodes": [ + { + "sendingModule": { + "package": { + "address": "0x000000000000000000000000000000000000000000000000000000000000107a" + }, + "name": "nft" + }, + "type": { + "repr": "0x0000000000000000000000000000000000000000000000000000000000000002::display::DisplayCreated<0x000000000000000000000000000000000000000000000000000000000000107a::nft::Nft>" + } + }, + { + "sendingModule": { + "package": { + "address": "0x000000000000000000000000000000000000000000000000000000000000107a" + }, + "name": "nft" + }, + "type": { + "repr": "0x0000000000000000000000000000000000000000000000000000000000000002::display::VersionUpdated<0x000000000000000000000000000000000000000000000000000000000000107a::nft::Nft>" + } + }, + { + "sendingModule": { + "package": { + "address": "0xbf4a1cd7a1f49231d9ac48596d16f6de48758108e9f73400c9b7e5af7abff125" + }, + "name": "M1" + }, + "type": { + "repr": "0x569dde10dc72ddb81506bd86b753393967f4b76a7eb56677d6fc27aaabb1bfdb::M0::Event" + } + } + ] + } + } +} diff --git a/crates/iota-graphql-e2e-tests/tests/events/sending_module.move b/crates/iota-graphql-e2e-tests/tests/events/sending_module.move new file mode 100644 index 00000000000..db2c9b87bcc --- /dev/null +++ b/crates/iota-graphql-e2e-tests/tests/events/sending_module.move @@ -0,0 +1,47 @@ +// Copyright (c) Mysten Labs, Inc. +// Modifications Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + + +//# init --protocol-version 3 --addresses Test=0x0 --accounts A --simulator + +//# publish --upgradeable --sender A +module Test::M0 { + public struct Event has copy, drop { + value: u64 + } +} +//# upgrade --package Test --upgrade-capability 1,1 --sender A +module Test::M0 { + public struct Event has copy, drop { + value: u64 + } + public fun emit() { + iota::event::emit(Event { value: 42 }) + } +} +module Test::M1 { + public fun emit() { + Test::M0::emit() + } +} +//# run Test::M1::emit --sender A + +//# create-checkpoint + +//# run-graphql +{ + events { + nodes { + sendingModule { + package { + address + } + name + } + type { + repr + } + } + } +} \ No newline at end of file diff --git a/crates/iota-graphql-e2e-tests/tests/limits/directives.exp b/crates/iota-graphql-e2e-tests/tests/limits/directives.exp index fbc8a46327c..b250f1e6ba1 100644 --- a/crates/iota-graphql-e2e-tests/tests/limits/directives.exp +++ b/crates/iota-graphql-e2e-tests/tests/limits/directives.exp @@ -73,7 +73,7 @@ task 5, lines 59-63: //# run-graphql Response: { "data": { - "chainIdentifier": "e2a97689" + "chainIdentifier": "924c496c" } } @@ -81,7 +81,7 @@ task 6, lines 65-69: //# run-graphql Response: { "data": { - "chainIdentifier": "e2a97689" + "chainIdentifier": "924c496c" } } diff --git a/crates/iota-graphql-e2e-tests/tests/limits/directives.move b/crates/iota-graphql-e2e-tests/tests/limits/directives.move index a9158fc6484..b9835e21e11 100644 --- a/crates/iota-graphql-e2e-tests/tests/limits/directives.move +++ b/crates/iota-graphql-e2e-tests/tests/limits/directives.move @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -//# init --protocol-version 1 --addresses Test=0x0 --accounts A --simulator +//# init --protocol-version 3 --addresses Test=0x0 --accounts A --simulator //# run-graphql diff --git a/crates/iota-graphql-e2e-tests/tests/limits/output_node_estimation.exp b/crates/iota-graphql-e2e-tests/tests/limits/output_node_estimation.exp index b7660421b69..fd16f6bebd7 100644 --- a/crates/iota-graphql-e2e-tests/tests/limits/output_node_estimation.exp +++ b/crates/iota-graphql-e2e-tests/tests/limits/output_node_estimation.exp @@ -30,7 +30,7 @@ Response: { "edges": [ { "node": { - "digest": "EjxArvXVR7U8yu5Yi2oDmELwV74gwJFinZKhnPuTKj83" + "digest": "HA4up8t27PnLk1un1DvTbctYWMRp2AMzkMbJLDeGVopQ" } } ] @@ -59,7 +59,7 @@ Response: { "edges": [ { "txns": { - "digest": "EjxArvXVR7U8yu5Yi2oDmELwV74gwJFinZKhnPuTKj83" + "digest": "HA4up8t27PnLk1un1DvTbctYWMRp2AMzkMbJLDeGVopQ" } } ] @@ -91,7 +91,7 @@ Response: { "edges": [ { "txns": { - "digest": "EjxArvXVR7U8yu5Yi2oDmELwV74gwJFinZKhnPuTKj83" + "digest": "HA4up8t27PnLk1un1DvTbctYWMRp2AMzkMbJLDeGVopQ" } } ] @@ -100,7 +100,7 @@ Response: { "edges": [ { "txns": { - "digest": "EjxArvXVR7U8yu5Yi2oDmELwV74gwJFinZKhnPuTKj83" + "digest": "HA4up8t27PnLk1un1DvTbctYWMRp2AMzkMbJLDeGVopQ" } } ] @@ -132,7 +132,7 @@ Response: { "edges": [ { "txns": { - "digest": "EjxArvXVR7U8yu5Yi2oDmELwV74gwJFinZKhnPuTKj83" + "digest": "HA4up8t27PnLk1un1DvTbctYWMRp2AMzkMbJLDeGVopQ" } } ] @@ -164,7 +164,7 @@ Response: { "edges": [ { "txns": { - "digest": "EjxArvXVR7U8yu5Yi2oDmELwV74gwJFinZKhnPuTKj83" + "digest": "HA4up8t27PnLk1un1DvTbctYWMRp2AMzkMbJLDeGVopQ" } } ] @@ -190,7 +190,7 @@ Response: { "edges": [ { "txns": { - "digest": "EjxArvXVR7U8yu5Yi2oDmELwV74gwJFinZKhnPuTKj83" + "digest": "HA4up8t27PnLk1un1DvTbctYWMRp2AMzkMbJLDeGVopQ" } } ] @@ -216,7 +216,7 @@ Response: { "edges": [ { "txns": { - "digest": "EjxArvXVR7U8yu5Yi2oDmELwV74gwJFinZKhnPuTKj83", + "digest": "HA4up8t27PnLk1un1DvTbctYWMRp2AMzkMbJLDeGVopQ", "first": null, "last": null } @@ -243,7 +243,7 @@ Response: { "transactionBlocks": { "nodes": [ { - "digest": "EjxArvXVR7U8yu5Yi2oDmELwV74gwJFinZKhnPuTKj83", + "digest": "HA4up8t27PnLk1un1DvTbctYWMRp2AMzkMbJLDeGVopQ", "first": null, "last": null } @@ -270,7 +270,7 @@ Response: { "edges": [ { "txns": { - "digest": "EjxArvXVR7U8yu5Yi2oDmELwV74gwJFinZKhnPuTKj83", + "digest": "HA4up8t27PnLk1un1DvTbctYWMRp2AMzkMbJLDeGVopQ", "a": null, "b": null } @@ -324,7 +324,7 @@ Response: { "edges": [ { "node": { - "digest": "EjxArvXVR7U8yu5Yi2oDmELwV74gwJFinZKhnPuTKj83", + "digest": "HA4up8t27PnLk1un1DvTbctYWMRp2AMzkMbJLDeGVopQ", "a": null } } @@ -350,14 +350,14 @@ Response: { "fragmentSpread": { "nodes": [ { - "digest": "EjxArvXVR7U8yu5Yi2oDmELwV74gwJFinZKhnPuTKj83" + "digest": "HA4up8t27PnLk1un1DvTbctYWMRp2AMzkMbJLDeGVopQ" } ] }, "inlineFragment": { "nodes": [ { - "digest": "EjxArvXVR7U8yu5Yi2oDmELwV74gwJFinZKhnPuTKj83" + "digest": "HA4up8t27PnLk1un1DvTbctYWMRp2AMzkMbJLDeGVopQ" } ] } diff --git a/crates/iota-graphql-e2e-tests/tests/limits/output_node_estimation.move b/crates/iota-graphql-e2e-tests/tests/limits/output_node_estimation.move index d8b769b881e..02f2236e85c 100644 --- a/crates/iota-graphql-e2e-tests/tests/limits/output_node_estimation.move +++ b/crates/iota-graphql-e2e-tests/tests/limits/output_node_estimation.move @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -//# init --protocol-version 1 --addresses A=0x42 --simulator +//# init --protocol-version 3 --addresses A=0x42 --simulator //# run-graphql --show-usage # pageInfo does not inherit connection's weights diff --git a/crates/iota-graphql-e2e-tests/tests/objects/coin.exp b/crates/iota-graphql-e2e-tests/tests/objects/coin.exp index 13c0fed33e1..ebad5352508 100644 --- a/crates/iota-graphql-e2e-tests/tests/objects/coin.exp +++ b/crates/iota-graphql-e2e-tests/tests/objects/coin.exp @@ -21,9 +21,9 @@ Response: { "iotaCoins": { "edges": [ { - "cursor": "IAUfdSfIJ+BUduck+TPi0OqPD7kIxW/IadU7pI8JDO2hAQAAAAAAAAA=", + "cursor": "IBily2iGhVVMSzcMP1UUZtum+yU5CSD6WDaBKp+2ZQDEAQAAAAAAAAA=", "node": { - "coinBalance": "30000000000000000", + "coinBalance": "299999983382000", "contents": { "type": { "repr": "0x0000000000000000000000000000000000000000000000000000000000000002::coin::Coin<0x0000000000000000000000000000000000000000000000000000000000000002::iota::IOTA>" @@ -32,7 +32,7 @@ Response: { } }, { - "cursor": "IGQSAAScq/jz2PWkB8n/2Zq/NyWuskIjmIfWJ6p2xcvnAQAAAAAAAAA=", + "cursor": "IG9h5K/B6fAjwRaUUkX/n8scYKtc6LIOKyDq49g+b0/gAQAAAAAAAAA=", "node": { "coinBalance": "300000000000000", "contents": { @@ -43,9 +43,9 @@ Response: { } }, { - "cursor": "IMafGVTG0T42MAdfRilm4G2fBf7CmEbT14ECYYflQRQxAQAAAAAAAAA=", + "cursor": "IJqDZP1WO7o1JivvOMvXGj/0Rnafmg8FbUgL7kjTUGy7AQAAAAAAAAA=", "node": { - "coinBalance": "299999983382000", + "coinBalance": "30000000000000000", "contents": { "type": { "repr": "0x0000000000000000000000000000000000000000000000000000000000000002::coin::Coin<0x0000000000000000000000000000000000000000000000000000000000000002::iota::IOTA>" @@ -58,34 +58,34 @@ Response: { "fakeCoins": { "edges": [ { - "cursor": "IDA83btPrJYvdZJSYxHTMwTntnb1td8qEwJabuS53VYOAQAAAAAAAAA=", + "cursor": "IG0zqMxTwpxTJFpyeAIwRaelE3oOFs8N8Vou2O21YZsOAQAAAAAAAAA=", "node": { - "coinBalance": "2", + "coinBalance": "3", "contents": { "type": { - "repr": "0x0000000000000000000000000000000000000000000000000000000000000002::coin::Coin<0xff92cd43d27e0af392d761a8e253e684dfcc6707854e46d94774a2751877eef5::fake::FAKE>" + "repr": "0x0000000000000000000000000000000000000000000000000000000000000002::coin::Coin<0x6d8bf133dd0c61c8c4a18781e62eefa7a190afc4e65d5f7d2fc143086c5469bd::fake::FAKE>" } } } }, { - "cursor": "IJa3gXgkZqu5tgHRpzZI9hvBIfX+0OV/h4KlHe/fkQXjAQAAAAAAAAA=", + "cursor": "ILpFYtIteN4ELc+I7UuXbnbFlnG/ZOYvYB6x5BZgI2ESAQAAAAAAAAA=", "node": { - "coinBalance": "1", + "coinBalance": "2", "contents": { "type": { - "repr": "0x0000000000000000000000000000000000000000000000000000000000000002::coin::Coin<0xff92cd43d27e0af392d761a8e253e684dfcc6707854e46d94774a2751877eef5::fake::FAKE>" + "repr": "0x0000000000000000000000000000000000000000000000000000000000000002::coin::Coin<0x6d8bf133dd0c61c8c4a18781e62eefa7a190afc4e65d5f7d2fc143086c5469bd::fake::FAKE>" } } } }, { - "cursor": "IPclUYS8wwbSrJwJqrO8vj9k3Cks56yvflmE3zZQNZWSAQAAAAAAAAA=", + "cursor": "IN2Z2LcN9DNNVlPNZnZraym86lnlUiNFr7nVycVJxP+nAQAAAAAAAAA=", "node": { - "coinBalance": "3", + "coinBalance": "1", "contents": { "type": { - "repr": "0x0000000000000000000000000000000000000000000000000000000000000002::coin::Coin<0xff92cd43d27e0af392d761a8e253e684dfcc6707854e46d94774a2751877eef5::fake::FAKE>" + "repr": "0x0000000000000000000000000000000000000000000000000000000000000002::coin::Coin<0x6d8bf133dd0c61c8c4a18781e62eefa7a190afc4e65d5f7d2fc143086c5469bd::fake::FAKE>" } } } @@ -96,7 +96,7 @@ Response: { "coins": { "edges": [ { - "cursor": "IMafGVTG0T42MAdfRilm4G2fBf7CmEbT14ECYYflQRQxAQAAAAAAAAA=", + "cursor": "IBily2iGhVVMSzcMP1UUZtum+yU5CSD6WDaBKp+2ZQDEAQAAAAAAAAA=", "node": { "coinBalance": "299999983382000", "contents": { @@ -121,10 +121,10 @@ Response: { } }, { - "cursor": "eyJ0IjoiMHhmZjkyY2Q0M2QyN2UwYWYzOTJkNzYxYThlMjUzZTY4NGRmY2M2NzA3ODU0ZTQ2ZDk0Nzc0YTI3NTE4NzdlZWY1OjpmYWtlOjpGQUtFIiwiYyI6MX0", + "cursor": "eyJ0IjoiMHg2ZDhiZjEzM2RkMGM2MWM4YzRhMTg3ODFlNjJlZWZhN2ExOTBhZmM0ZTY1ZDVmN2QyZmMxNDMwODZjNTQ2OWJkOjpmYWtlOjpGQUtFIiwiYyI6MX0", "node": { "coinType": { - "repr": "0xff92cd43d27e0af392d761a8e253e684dfcc6707854e46d94774a2751877eef5::fake::FAKE" + "repr": "0x6d8bf133dd0c61c8c4a18781e62eefa7a190afc4e65d5f7d2fc143086c5469bd::fake::FAKE" }, "coinObjectCount": 3, "totalBalance": "6" @@ -142,7 +142,7 @@ Response: { "lastBalance": { "edges": [ { - "cursor": "eyJ0IjoiMHhmZjkyY2Q0M2QyN2UwYWYzOTJkNzYxYThlMjUzZTY4NGRmY2M2NzA3ODU0ZTQ2ZDk0Nzc0YTI3NTE4NzdlZWY1OjpmYWtlOjpGQUtFIiwiYyI6MX0" + "cursor": "eyJ0IjoiMHg2ZDhiZjEzM2RkMGM2MWM4YzRhMTg3ODFlNjJlZWZhN2ExOTBhZmM0ZTY1ZDVmN2QyZmMxNDMwODZjNTQ2OWJkOjpmYWtlOjpGQUtFIiwiYyI6MX0" } ] } diff --git a/crates/iota-graphql-e2e-tests/tests/objects/coin.move b/crates/iota-graphql-e2e-tests/tests/objects/coin.move index 020dd87a4ab..ed5c0d50ab1 100644 --- a/crates/iota-graphql-e2e-tests/tests/objects/coin.move +++ b/crates/iota-graphql-e2e-tests/tests/objects/coin.move @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -//# init --protocol-version 1 --addresses P0=0x0 --accounts A --simulator +//# init --protocol-version 3 --addresses P0=0x0 --accounts A --simulator //# publish --sender A module P0::fake { diff --git a/crates/iota-graphql-e2e-tests/tests/objects/data.exp b/crates/iota-graphql-e2e-tests/tests/objects/data.exp index 2fcc77702b3..6d79d516cf0 100644 --- a/crates/iota-graphql-e2e-tests/tests/objects/data.exp +++ b/crates/iota-graphql-e2e-tests/tests/objects/data.exp @@ -36,7 +36,7 @@ Response: { "asMoveObject": { "contents": { "type": { - "repr": "0xe0ef7a7ba01308537537496e046369f6664d6a66766d3ec40418a768c98ba1e8::m::Foo" + "repr": "0xd8858c3f9c4f658f4e48b16aa2b7c51d6c2ea85100535fe1d8cea8126acbfd87::m::Foo" }, "data": { "Struct": [ @@ -44,38 +44,38 @@ Response: { "name": "id", "value": { "UID": [ - 55, - 140, - 182, - 180, + 20, + 122, 109, - 180, - 10, - 32, - 206, - 27, - 49, - 182, + 73, + 199, + 198, + 156, + 23, 57, - 108, + 244, + 61, + 52, 252, - 219, - 129, - 213, - 146, - 143, - 101, - 13, - 152, - 99, - 213, - 8, - 123, - 107, - 48, - 204, - 87, - 150 + 62, + 224, + 62, + 244, + 137, + 119, + 169, + 178, + 144, + 177, + 4, + 6, + 244, + 222, + 150, + 242, + 14, + 53, + 12 ] } }, @@ -83,38 +83,38 @@ Response: { "name": "f0", "value": { "ID": [ - 55, - 140, - 182, - 180, + 20, + 122, 109, - 180, - 10, - 32, - 206, - 27, - 49, - 182, + 73, + 199, + 198, + 156, + 23, 57, - 108, + 244, + 61, + 52, 252, - 219, - 129, - 213, - 146, - 143, - 101, - 13, - 152, - 99, - 213, - 8, - 123, - 107, - 48, - 204, - 87, - 150 + 62, + 224, + 62, + 244, + 137, + 119, + 169, + 178, + 144, + 177, + 4, + 6, + 244, + 222, + 150, + 242, + 14, + 53, + 12 ] } }, @@ -154,38 +154,38 @@ Response: { "Vector": [ { "Address": [ - 55, - 140, - 182, - 180, + 20, + 122, 109, - 180, - 10, - 32, - 206, - 27, - 49, - 182, + 73, + 199, + 198, + 156, + 23, 57, - 108, + 244, + 61, + 52, 252, - 219, - 129, - 213, - 146, - 143, - 101, - 13, - 152, - 99, - 213, - 8, - 123, - 107, - 48, - 204, - 87, - 150 + 62, + 224, + 62, + 244, + 137, + 119, + 169, + 178, + 144, + 177, + 4, + 6, + 244, + 222, + 150, + 242, + 14, + 53, + 12 ] } ] @@ -202,15 +202,15 @@ Response: { ] }, "json": { - "id": "0x378cb6b46db40a20ce1b31b6396cfcdb81d5928f650d9863d5087b6b30cc5796", - "f0": "0x378cb6b46db40a20ce1b31b6396cfcdb81d5928f650d9863d5087b6b30cc5796", + "id": "0x147a6d49c7c69c1739f43d34fc3ee03ef48977a9b290b10406f4de96f20e350c", + "f0": "0x147a6d49c7c69c1739f43d34fc3ee03ef48977a9b290b10406f4de96f20e350c", "f1": true, "f2": 42, "f3": "43", "f4": "hello", "f5": "world", "f6": [ - "0x378cb6b46db40a20ce1b31b6396cfcdb81d5928f650d9863d5087b6b30cc5796" + "0x147a6d49c7c69c1739f43d34fc3ee03ef48977a9b290b10406f4de96f20e350c" ], "f7": 44 } @@ -231,38 +231,38 @@ Response: { "name": "id", "value": { "UID": [ - 100, - 18, - 0, - 4, - 156, - 171, - 248, - 243, - 216, - 245, - 164, - 7, - 201, - 255, - 217, - 154, - 191, - 55, - 37, - 174, - 178, - 66, + 111, + 97, + 228, + 175, + 193, + 233, + 240, 35, - 152, - 135, - 214, - 39, - 170, - 118, - 197, + 193, + 22, + 148, + 82, + 69, + 255, + 159, 203, - 231 + 28, + 96, + 171, + 92, + 232, + 178, + 14, + 43, + 32, + 234, + 227, + 216, + 62, + 111, + 79, + 224 ] } }, @@ -282,7 +282,7 @@ Response: { ] }, "json": { - "id": "0x641200049cabf8f3d8f5a407c9ffd99abf3725aeb242239887d627aa76c5cbe7", + "id": "0x6f61e4afc1e9f023c116945245ff9fcb1c60ab5ce8b20e2b20eae3d83e6f4fe0", "balance": { "value": "299999988469600" } diff --git a/crates/iota-graphql-e2e-tests/tests/objects/data.move b/crates/iota-graphql-e2e-tests/tests/objects/data.move index fe7985f1b9c..1595eb88554 100644 --- a/crates/iota-graphql-e2e-tests/tests/objects/data.move +++ b/crates/iota-graphql-e2e-tests/tests/objects/data.move @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -//# init --protocol-version 1 --addresses P0=0x0 --accounts A --simulator +//# init --protocol-version 3 --addresses P0=0x0 --accounts A --simulator //# publish module P0::m { diff --git a/crates/iota-graphql-e2e-tests/tests/objects/display.exp b/crates/iota-graphql-e2e-tests/tests/objects/display.exp index 8d17c8e4fd9..bf50eda9156 100644 --- a/crates/iota-graphql-e2e-tests/tests/objects/display.exp +++ b/crates/iota-graphql-e2e-tests/tests/objects/display.exp @@ -5,7 +5,7 @@ A: object(0,0) task 1, lines 7-131: //# publish --sender A -events: Event { package_id: Test, transaction_module: Identifier("boars"), sender: A, type_: StructTag { address: iota, module: Identifier("display"), name: Identifier("DisplayCreated"), type_params: [Struct(StructTag { address: Test, module: Identifier("boars"), name: Identifier("Boar"), type_params: [] })] }, contents: [155, 85, 136, 164, 81, 63, 109, 148, 75, 198, 60, 36, 25, 208, 95, 122, 157, 232, 18, 97, 53, 211, 101, 208, 13, 29, 31, 165, 226, 122, 237, 179] } +events: Event { package_id: Test, transaction_module: Identifier("boars"), sender: A, type_: StructTag { address: iota, module: Identifier("display"), name: Identifier("DisplayCreated"), type_params: [Struct(StructTag { address: Test, module: Identifier("boars"), name: Identifier("Boar"), type_params: [] })] }, contents: [187, 140, 105, 181, 122, 15, 118, 201, 161, 89, 13, 177, 14, 92, 210, 68, 126, 138, 208, 165, 206, 111, 45, 120, 187, 220, 213, 233, 218, 60, 254, 64] } created: object(1,0), object(1,1), object(1,2) mutated: object(0,0) gas summary: computation_cost: 1000000, computation_cost_burned: 1000000, storage_cost: 21447200, storage_rebate: 0, non_refundable_storage_fee: 0 @@ -16,7 +16,7 @@ Checkpoint created: 1 task 3, line 135: //# view-checkpoint -CheckpointSummary { epoch: 0, seq: 1, content_digest: 4zAfAVwFXhmFipWuRjudEjJYvRVd67NfPr9qBW7F9WfZ, +CheckpointSummary { epoch: 0, seq: 1, content_digest: 8KL1ykbGuB4FxZCpQFtTwojA9dAGCUhW1jqPn7Bzbdr5, epoch_rolling_gas_cost_summary: GasCostSummary { computation_cost: 1000000, computation_cost_burned: 1000000, storage_cost: 21447200, storage_rebate: 0, non_refundable_storage_fee: 0 }} task 4, line 137: @@ -27,7 +27,7 @@ gas summary: computation_cost: 1000000, computation_cost_burned: 1000000, storag task 5, line 139: //# run Test::boars::update_display_faulty --sender A --args object(1,1) -events: Event { package_id: Test, transaction_module: Identifier("boars"), sender: A, type_: StructTag { address: iota, module: Identifier("display"), name: Identifier("VersionUpdated"), type_params: [Struct(StructTag { address: Test, module: Identifier("boars"), name: Identifier("Boar"), type_params: [] })] }, contents: [155, 85, 136, 164, 81, 63, 109, 148, 75, 198, 60, 36, 25, 208, 95, 122, 157, 232, 18, 97, 53, 211, 101, 208, 13, 29, 31, 165, 226, 122, 237, 179, 1, 0, 3, 7, 118, 101, 99, 116, 111, 114, 115, 5, 123, 118, 101, 99, 125, 3, 105, 100, 100, 5, 123, 105, 100, 100, 125, 5, 110, 97, 109, 101, 101, 7, 123, 110, 97, 109, 101, 101, 125] } +events: Event { package_id: Test, transaction_module: Identifier("boars"), sender: A, type_: StructTag { address: iota, module: Identifier("display"), name: Identifier("VersionUpdated"), type_params: [Struct(StructTag { address: Test, module: Identifier("boars"), name: Identifier("Boar"), type_params: [] })] }, contents: [187, 140, 105, 181, 122, 15, 118, 201, 161, 89, 13, 177, 14, 92, 210, 68, 126, 138, 208, 165, 206, 111, 45, 120, 187, 220, 213, 233, 218, 60, 254, 64, 1, 0, 3, 7, 118, 101, 99, 116, 111, 114, 115, 5, 123, 118, 101, 99, 125, 3, 105, 100, 100, 5, 123, 105, 100, 100, 125, 5, 110, 97, 109, 101, 101, 7, 123, 110, 97, 109, 101, 101, 125] } mutated: object(0,0), object(1,1) gas summary: computation_cost: 1000000, computation_cost_burned: 1000000, storage_cost: 2926000, storage_rebate: 2637200, non_refundable_storage_fee: 0 @@ -37,7 +37,7 @@ Checkpoint created: 2 task 7, line 143: //# view-checkpoint -CheckpointSummary { epoch: 0, seq: 2, content_digest: GbyYdBVTebRQFzWA9B8nox5yAL4quujoQeZphrp9EguP, +CheckpointSummary { epoch: 0, seq: 2, content_digest: ET9fgY1A1CQcNRxWNYKBYWtvrvQgC7p3DXJhffWhGPzL, epoch_rolling_gas_cost_summary: GasCostSummary { computation_cost: 3000000, computation_cost_burned: 3000000, storage_cost: 27914800, storage_rebate: 3617600, non_refundable_storage_fee: 0 }} task 8, lines 145-158: @@ -74,7 +74,7 @@ Response: { task 9, line 160: //# run Test::boars::single_add --sender A --args object(1,1) -events: Event { package_id: Test, transaction_module: Identifier("boars"), sender: A, type_: StructTag { address: iota, module: Identifier("display"), name: Identifier("VersionUpdated"), type_params: [Struct(StructTag { address: Test, module: Identifier("boars"), name: Identifier("Boar"), type_params: [] })] }, contents: [155, 85, 136, 164, 81, 63, 109, 148, 75, 198, 60, 36, 25, 208, 95, 122, 157, 232, 18, 97, 53, 211, 101, 208, 13, 29, 31, 165, 226, 122, 237, 179, 2, 0, 4, 7, 118, 101, 99, 116, 111, 114, 115, 5, 123, 118, 101, 99, 125, 3, 105, 100, 100, 5, 123, 105, 100, 100, 125, 5, 110, 97, 109, 101, 101, 7, 123, 110, 97, 109, 101, 101, 125, 4, 110, 117, 109, 115, 6, 123, 110, 117, 109, 115, 125] } +events: Event { package_id: Test, transaction_module: Identifier("boars"), sender: A, type_: StructTag { address: iota, module: Identifier("display"), name: Identifier("VersionUpdated"), type_params: [Struct(StructTag { address: Test, module: Identifier("boars"), name: Identifier("Boar"), type_params: [] })] }, contents: [187, 140, 105, 181, 122, 15, 118, 201, 161, 89, 13, 177, 14, 92, 210, 68, 126, 138, 208, 165, 206, 111, 45, 120, 187, 220, 213, 233, 218, 60, 254, 64, 2, 0, 4, 7, 118, 101, 99, 116, 111, 114, 115, 5, 123, 118, 101, 99, 125, 3, 105, 100, 100, 5, 123, 105, 100, 100, 125, 5, 110, 97, 109, 101, 101, 7, 123, 110, 97, 109, 101, 101, 125, 4, 110, 117, 109, 115, 6, 123, 110, 117, 109, 115, 125] } mutated: object(0,0), object(1,1) gas summary: computation_cost: 1000000, computation_cost_burned: 1000000, storage_cost: 3017200, storage_rebate: 2926000, non_refundable_storage_fee: 0 @@ -84,7 +84,7 @@ Checkpoint created: 3 task 11, line 164: //# view-checkpoint -CheckpointSummary { epoch: 0, seq: 3, content_digest: 2KBZj5iLNbskohG5KL5VtdGE6onV6YEZQigAzeXZUwUc, +CheckpointSummary { epoch: 0, seq: 3, content_digest: CaK9KjzwCdVatLFbEkaQKMWaBoyY86XVeRgToHrScNFh, epoch_rolling_gas_cost_summary: GasCostSummary { computation_cost: 4000000, computation_cost_burned: 4000000, storage_cost: 30932000, storage_rebate: 6543600, non_refundable_storage_fee: 0 }} task 12, lines 166-179: @@ -126,7 +126,7 @@ Response: { task 13, line 181: //# run Test::boars::multi_add --sender A --args object(1,1) -events: Event { package_id: Test, transaction_module: Identifier("boars"), sender: A, type_: StructTag { address: iota, module: Identifier("display"), name: Identifier("VersionUpdated"), type_params: [Struct(StructTag { address: Test, module: Identifier("boars"), name: Identifier("Boar"), type_params: [] })] }, contents: [155, 85, 136, 164, 81, 63, 109, 148, 75, 198, 60, 36, 25, 208, 95, 122, 157, 232, 18, 97, 53, 211, 101, 208, 13, 29, 31, 165, 226, 122, 237, 179, 3, 0, 15, 7, 118, 101, 99, 116, 111, 114, 115, 5, 123, 118, 101, 99, 125, 3, 105, 100, 100, 5, 123, 105, 100, 100, 125, 5, 110, 97, 109, 101, 101, 7, 123, 110, 97, 109, 101, 101, 125, 4, 110, 117, 109, 115, 6, 123, 110, 117, 109, 115, 125, 5, 98, 111, 111, 108, 115, 7, 123, 98, 111, 111, 108, 115, 125, 5, 98, 117, 121, 101, 114, 7, 123, 98, 117, 121, 101, 114, 125, 4, 110, 97, 109, 101, 6, 123, 110, 97, 109, 101, 125, 7, 99, 114, 101, 97, 116, 111, 114, 9, 123, 99, 114, 101, 97, 116, 111, 114, 125, 5, 112, 114, 105, 99, 101, 7, 123, 112, 114, 105, 99, 101, 125, 11, 112, 114, 111, 106, 101, 99, 116, 95, 117, 114, 108, 58, 85, 110, 105, 113, 117, 101, 32, 66, 111, 97, 114, 32, 102, 114, 111, 109, 32, 116, 104, 101, 32, 66, 111, 97, 114, 115, 32, 99, 111, 108, 108, 101, 99, 116, 105, 111, 110, 32, 119, 105, 116, 104, 32, 123, 110, 97, 109, 101, 125, 32, 97, 110, 100, 32, 123, 105, 100, 125, 8, 98, 97, 115, 101, 95, 117, 114, 108, 32, 104, 116, 116, 112, 115, 58, 47, 47, 103, 101, 116, 45, 97, 45, 98, 111, 97, 114, 46, 99, 111, 109, 47, 123, 105, 109, 103, 95, 117, 114, 108, 125, 11, 110, 111, 95, 116, 101, 109, 112, 108, 97, 116, 101, 23, 104, 116, 116, 112, 115, 58, 47, 47, 103, 101, 116, 45, 97, 45, 98, 111, 97, 114, 46, 99, 111, 109, 47, 3, 97, 103, 101, 21, 123, 109, 101, 116, 97, 100, 97, 116, 97, 46, 110, 101, 115, 116, 101, 100, 46, 97, 103, 101, 125, 8, 102, 117, 108, 108, 95, 117, 114, 108, 10, 123, 102, 117, 108, 108, 95, 117, 114, 108, 125, 13, 101, 115, 99, 97, 112, 101, 95, 115, 121, 110, 116, 97, 120, 8, 92, 123, 110, 97, 109, 101, 92, 125] } +events: Event { package_id: Test, transaction_module: Identifier("boars"), sender: A, type_: StructTag { address: iota, module: Identifier("display"), name: Identifier("VersionUpdated"), type_params: [Struct(StructTag { address: Test, module: Identifier("boars"), name: Identifier("Boar"), type_params: [] })] }, contents: [187, 140, 105, 181, 122, 15, 118, 201, 161, 89, 13, 177, 14, 92, 210, 68, 126, 138, 208, 165, 206, 111, 45, 120, 187, 220, 213, 233, 218, 60, 254, 64, 3, 0, 15, 7, 118, 101, 99, 116, 111, 114, 115, 5, 123, 118, 101, 99, 125, 3, 105, 100, 100, 5, 123, 105, 100, 100, 125, 5, 110, 97, 109, 101, 101, 7, 123, 110, 97, 109, 101, 101, 125, 4, 110, 117, 109, 115, 6, 123, 110, 117, 109, 115, 125, 5, 98, 111, 111, 108, 115, 7, 123, 98, 111, 111, 108, 115, 125, 5, 98, 117, 121, 101, 114, 7, 123, 98, 117, 121, 101, 114, 125, 4, 110, 97, 109, 101, 6, 123, 110, 97, 109, 101, 125, 7, 99, 114, 101, 97, 116, 111, 114, 9, 123, 99, 114, 101, 97, 116, 111, 114, 125, 5, 112, 114, 105, 99, 101, 7, 123, 112, 114, 105, 99, 101, 125, 11, 112, 114, 111, 106, 101, 99, 116, 95, 117, 114, 108, 58, 85, 110, 105, 113, 117, 101, 32, 66, 111, 97, 114, 32, 102, 114, 111, 109, 32, 116, 104, 101, 32, 66, 111, 97, 114, 115, 32, 99, 111, 108, 108, 101, 99, 116, 105, 111, 110, 32, 119, 105, 116, 104, 32, 123, 110, 97, 109, 101, 125, 32, 97, 110, 100, 32, 123, 105, 100, 125, 8, 98, 97, 115, 101, 95, 117, 114, 108, 32, 104, 116, 116, 112, 115, 58, 47, 47, 103, 101, 116, 45, 97, 45, 98, 111, 97, 114, 46, 99, 111, 109, 47, 123, 105, 109, 103, 95, 117, 114, 108, 125, 11, 110, 111, 95, 116, 101, 109, 112, 108, 97, 116, 101, 23, 104, 116, 116, 112, 115, 58, 47, 47, 103, 101, 116, 45, 97, 45, 98, 111, 97, 114, 46, 99, 111, 109, 47, 3, 97, 103, 101, 21, 123, 109, 101, 116, 97, 100, 97, 116, 97, 46, 110, 101, 115, 116, 101, 100, 46, 97, 103, 101, 125, 8, 102, 117, 108, 108, 95, 117, 114, 108, 10, 123, 102, 117, 108, 108, 95, 117, 114, 108, 125, 13, 101, 115, 99, 97, 112, 101, 95, 115, 121, 110, 116, 97, 120, 8, 92, 123, 110, 97, 109, 101, 92, 125] } mutated: object(0,0), object(1,1) gas summary: computation_cost: 1000000, computation_cost_burned: 1000000, storage_cost: 5221200, storage_rebate: 3017200, non_refundable_storage_fee: 0 @@ -136,7 +136,7 @@ Checkpoint created: 4 task 15, line 185: //# view-checkpoint -CheckpointSummary { epoch: 0, seq: 4, content_digest: D6dE1yK8HSeHb7QdiXFjf9qMKPdAYHdNWBMWkb26nbJt, +CheckpointSummary { epoch: 0, seq: 4, content_digest: FCxhKY3MRduFDFzwVqwS3uNmfLcWT9VMVyx5DXgyLyxu, epoch_rolling_gas_cost_summary: GasCostSummary { computation_cost: 5000000, computation_cost_burned: 5000000, storage_cost: 36153200, storage_rebate: 9560800, non_refundable_storage_fee: 0 }} task 16, lines 187-200: @@ -195,7 +195,7 @@ Response: { }, { "key": "project_url", - "value": "Unique Boar from the Boars collection with First Boar and 0x889962831d2d9d2273e1890c6592ea21197e4e577259171eed3fe0d49e2906d7", + "value": "Unique Boar from the Boars collection with First Boar and 0x5bd1a7b5d989a691e439fb8528f532d507f97ba71a174e53339319083f15e8e8", "error": null }, { diff --git a/crates/iota-graphql-e2e-tests/tests/objects/display.move b/crates/iota-graphql-e2e-tests/tests/objects/display.move index 31963f74a61..9fe3e406192 100644 --- a/crates/iota-graphql-e2e-tests/tests/objects/display.move +++ b/crates/iota-graphql-e2e-tests/tests/objects/display.move @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -//# init --protocol-version 1 --addresses Test=0x0 --accounts A --simulator +//# init --protocol-version 3 --addresses Test=0x0 --accounts A --simulator //# publish --sender A module Test::boars { diff --git a/crates/iota-graphql-e2e-tests/tests/objects/enum_data.exp b/crates/iota-graphql-e2e-tests/tests/objects/enum_data.exp index cb3b64ecc62..fac1fda94be 100644 --- a/crates/iota-graphql-e2e-tests/tests/objects/enum_data.exp +++ b/crates/iota-graphql-e2e-tests/tests/objects/enum_data.exp @@ -36,7 +36,7 @@ Response: { "asMoveObject": { "contents": { "type": { - "repr": "0x37f6b83e93f5faa2818235a6c07c2559447623e45725f49eaf51d21311961a88::m::Foo" + "repr": "0x0000000000000000000000000000000000000000000000000000000000000002::coin::Coin<0x0000000000000000000000000000000000000000000000000000000000000002::iota::IOTA>" }, "data": { "Struct": [ @@ -44,38 +44,111 @@ Response: { "name": "id", "value": { "UID": [ - 83, - 9, - 241, - 204, - 212, - 6, + 111, + 97, + 228, + 175, + 193, + 233, + 240, + 35, + 193, + 22, + 148, + 82, + 69, + 255, + 159, 203, - 57, - 197, - 134, + 28, + 96, + 171, + 92, + 232, + 178, + 14, + 43, + 32, 234, - 65, - 158, - 61, + 227, + 216, + 62, + 111, + 79, + 224 + ] + } + }, + { + "name": "balance", + "value": { + "Struct": [ + { + "name": "value", + "value": { + "Number": "299999995982800" + } + } + ] + } + } + ] + }, + "json": { + "id": "0x6f61e4afc1e9f023c116945245ff9fcb1c60ab5ce8b20e2b20eae3d83e6f4fe0", + "balance": { + "value": "299999995982800" + } + } + } + } + } + }, + { + "outputState": { + "asMoveObject": { + "contents": { + "type": { + "repr": "0xf210a282fd5df957e40bdf8c7536a035233e6ebd306132390cb10d67b4ae3d77::m::Foo" + }, + "data": { + "Struct": [ + { + "name": "id", + "value": { + "UID": [ + 235, + 17, + 204, + 36, + 83, + 225, + 192, + 186, + 116, + 44, + 86, + 207, + 239, 177, - 15, + 245, 53, - 250, - 79, - 130, - 156, - 148, - 26, - 3, - 100, - 56, - 147, - 127, - 45, - 103, - 230, - 95 + 176, + 145, + 179, + 216, + 218, + 243, + 161, + 175, + 208, + 107, + 158, + 49, + 141, + 10, + 37, + 42 ] } }, @@ -83,38 +156,38 @@ Response: { "name": "f0", "value": { "ID": [ - 83, - 9, - 241, + 235, + 17, 204, - 212, - 6, - 203, - 57, - 197, - 134, - 234, - 65, - 158, - 61, + 36, + 83, + 225, + 192, + 186, + 116, + 44, + 86, + 207, + 239, 177, - 15, + 245, 53, - 250, - 79, - 130, - 156, - 148, - 26, - 3, - 100, - 56, - 147, - 127, - 45, - 103, - 230, - 95 + 176, + 145, + 179, + 216, + 218, + 243, + 161, + 175, + 208, + 107, + 158, + 49, + 141, + 10, + 37, + 42 ] } }, @@ -154,38 +227,38 @@ Response: { "Vector": [ { "Address": [ - 83, - 9, - 241, + 235, + 17, 204, - 212, - 6, - 203, - 57, - 197, - 134, - 234, - 65, - 158, - 61, + 36, + 83, + 225, + 192, + 186, + 116, + 44, + 86, + 207, + 239, 177, - 15, + 245, 53, - 250, - 79, - 130, - 156, - 148, - 26, - 3, - 100, - 56, - 147, - 127, - 45, - 103, - 230, - 95 + 176, + 145, + 179, + 216, + 218, + 243, + 161, + 175, + 208, + 107, + 158, + 49, + 141, + 10, + 37, + 42 ] } ] @@ -252,15 +325,15 @@ Response: { ] }, "json": { - "id": "0x5309f1ccd406cb39c586ea419e3db10f35fa4f829c941a036438937f2d67e65f", - "f0": "0x5309f1ccd406cb39c586ea419e3db10f35fa4f829c941a036438937f2d67e65f", + "id": "0xeb11cc2453e1c0ba742c56cfefb1f535b091b3d8daf3a1afd06b9e318d0a252a", + "f0": "0xeb11cc2453e1c0ba742c56cfefb1f535b091b3d8daf3a1afd06b9e318d0a252a", "f1": true, "f2": 42, "f3": "43", "f4": "hello", "f5": "world", "f6": [ - "0x5309f1ccd406cb39c586ea419e3db10f35fa4f829c941a036438937f2d67e65f" + "0xeb11cc2453e1c0ba742c56cfefb1f535b091b3d8daf3a1afd06b9e318d0a252a" ], "f7": 44, "f8": { @@ -283,79 +356,6 @@ Response: { } } } - }, - { - "outputState": { - "asMoveObject": { - "contents": { - "type": { - "repr": "0x0000000000000000000000000000000000000000000000000000000000000002::coin::Coin<0x0000000000000000000000000000000000000000000000000000000000000002::iota::IOTA>" - }, - "data": { - "Struct": [ - { - "name": "id", - "value": { - "UID": [ - 100, - 18, - 0, - 4, - 156, - 171, - 248, - 243, - 216, - 245, - 164, - 7, - 201, - 255, - 217, - 154, - 191, - 55, - 37, - 174, - 178, - 66, - 35, - 152, - 135, - 214, - 39, - 170, - 118, - 197, - 203, - 231 - ] - } - }, - { - "name": "balance", - "value": { - "Struct": [ - { - "name": "value", - "value": { - "Number": "299999995982800" - } - } - ] - } - } - ] - }, - "json": { - "id": "0x641200049cabf8f3d8f5a407c9ffd99abf3725aeb242239887d627aa76c5cbe7", - "balance": { - "value": "299999995982800" - } - } - } - } - } } ] } diff --git a/crates/iota-graphql-e2e-tests/tests/objects/enum_data.move b/crates/iota-graphql-e2e-tests/tests/objects/enum_data.move index 8348235b29a..655884df8e2 100644 --- a/crates/iota-graphql-e2e-tests/tests/objects/enum_data.move +++ b/crates/iota-graphql-e2e-tests/tests/objects/enum_data.move @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -//# init --addresses P0=0x0 P1=0x0 --accounts A --simulator --protocol-version 1 +//# init --addresses P0=0x0 P1=0x0 --accounts A --simulator --protocol-version 3 //# publish --upgradeable --sender A module P0::m { diff --git a/crates/iota-graphql-e2e-tests/tests/objects/filter_by_type.exp b/crates/iota-graphql-e2e-tests/tests/objects/filter_by_type.exp index ee3a4125263..e36b399fd15 100644 --- a/crates/iota-graphql-e2e-tests/tests/objects/filter_by_type.exp +++ b/crates/iota-graphql-e2e-tests/tests/objects/filter_by_type.exp @@ -21,7 +21,7 @@ gas summary: computation_cost: 1000000, computation_cost_burned: 1000000, storag task 4, lines 16-18: //# run 0x3::iota_system::request_add_stake --args object(0x5) object(3,0) @validator_0 --sender C -events: Event { package_id: iota_system, transaction_module: Identifier("iota_system"), sender: C, type_: StructTag { address: iota_system, module: Identifier("validator"), name: Identifier("StakingRequestEvent"), type_params: [] }, contents: [145, 201, 73, 32, 135, 23, 121, 37, 7, 101, 40, 103, 216, 99, 155, 51, 118, 111, 115, 220, 44, 253, 144, 143, 80, 103, 133, 240, 58, 235, 137, 202, 175, 163, 158, 79, 0, 218, 226, 120, 249, 119, 199, 198, 147, 10, 94, 44, 118, 232, 93, 23, 165, 38, 215, 36, 187, 206, 15, 184, 31, 176, 125, 76, 140, 202, 78, 28, 224, 186, 89, 4, 206, 166, 29, 249, 36, 45, 162, 247, 210, 158, 62, 243, 40, 251, 126, 192, 124, 8, 107, 59, 244, 124, 166, 26, 1, 0, 0, 0, 0, 0, 0, 0, 0, 228, 11, 84, 2, 0, 0, 0] } +events: Event { package_id: iota_system, transaction_module: Identifier("iota_system"), sender: C, type_: StructTag { address: iota_system, module: Identifier("validator"), name: Identifier("StakingRequestEvent"), type_params: [] }, contents: [217, 25, 175, 239, 57, 244, 176, 32, 209, 232, 109, 171, 147, 246, 3, 15, 205, 197, 172, 21, 36, 143, 47, 100, 240, 226, 221, 254, 42, 3, 157, 155, 175, 163, 158, 79, 0, 218, 226, 120, 249, 119, 199, 198, 147, 10, 94, 44, 118, 232, 93, 23, 165, 38, 215, 36, 187, 206, 15, 184, 31, 176, 125, 76, 140, 202, 78, 28, 224, 186, 89, 4, 206, 166, 29, 249, 36, 45, 162, 247, 210, 158, 62, 243, 40, 251, 126, 192, 124, 8, 107, 59, 244, 124, 166, 26, 1, 0, 0, 0, 0, 0, 0, 0, 0, 228, 11, 84, 2, 0, 0, 0] } created: object(4,0) mutated: object(_), 0x0000000000000000000000000000000000000000000000000000000000000005, object(0,0) deleted: object(3,0) @@ -134,7 +134,7 @@ Response: { "asMoveObject": { "contents": { "type": { - "repr": "0x0000000000000000000000000000000000000000000000000000000000000002::coin::Coin<0x0000000000000000000000000000000000000000000000000000000000000002::iota::IOTA>" + "repr": "0x0000000000000000000000000000000000000000000000000000000000000002::dynamic_field::Field" } } } @@ -145,7 +145,7 @@ Response: { "asMoveObject": { "contents": { "type": { - "repr": "0x0000000000000000000000000000000000000000000000000000000000000002::dynamic_field::Field" + "repr": "0x0000000000000000000000000000000000000000000000000000000000000002::coin::Coin<0x0000000000000000000000000000000000000000000000000000000000000002::iota::IOTA>" } } } @@ -156,7 +156,7 @@ Response: { "asMoveObject": { "contents": { "type": { - "repr": "0x0000000000000000000000000000000000000000000000000000000000000002::dynamic_field::Field" + "repr": "0x0000000000000000000000000000000000000000000000000000000000000002::dynamic_field::Field<0x0000000000000000000000000000000000000000000000000000000000000002::object::ID,address>" } } } @@ -167,7 +167,7 @@ Response: { "asMoveObject": { "contents": { "type": { - "repr": "0x0000000000000000000000000000000000000000000000000000000000000002::coin::Coin<0x0000000000000000000000000000000000000000000000000000000000000002::iota::IOTA>" + "repr": "0x0000000000000000000000000000000000000000000000000000000000000002::dynamic_field::Field" } } } @@ -178,7 +178,7 @@ Response: { "asMoveObject": { "contents": { "type": { - "repr": "0x0000000000000000000000000000000000000000000000000000000000000002::dynamic_field::Field" + "repr": "0x0000000000000000000000000000000000000000000000000000000000000002::dynamic_field::Field" } } } @@ -189,7 +189,7 @@ Response: { "asMoveObject": { "contents": { "type": { - "repr": "0x0000000000000000000000000000000000000000000000000000000000000002::display::Display<0x000000000000000000000000000000000000000000000000000000000000107a::nft::Nft>" + "repr": "0x0000000000000000000000000000000000000000000000000000000000000002::coin::CoinMetadata<0x0000000000000000000000000000000000000000000000000000000000000002::iota::IOTA>" } } } @@ -200,7 +200,7 @@ Response: { "asMoveObject": { "contents": { "type": { - "repr": "0x0000000000000000000000000000000000000000000000000000000000000002::dynamic_field::Field<0x0000000000000000000000000000000000000000000000000000000000000002::object::ID,address>" + "repr": "0x0000000000000000000000000000000000000000000000000000000000000002::display::Display<0x000000000000000000000000000000000000000000000000000000000000107a::nft::Nft>" } } } @@ -211,7 +211,7 @@ Response: { "asMoveObject": { "contents": { "type": { - "repr": "0x0000000000000000000000000000000000000000000000000000000000000002::dynamic_field::Field" + "repr": "0x0000000000000000000000000000000000000000000000000000000000000002::dynamic_field::Field" } } } @@ -222,7 +222,7 @@ Response: { "asMoveObject": { "contents": { "type": { - "repr": "0x0000000000000000000000000000000000000000000000000000000000000002::coin::CoinMetadata<0x0000000000000000000000000000000000000000000000000000000000000002::iota::IOTA>" + "repr": "0x0000000000000000000000000000000000000000000000000000000000000002::coin::Coin<0x0000000000000000000000000000000000000000000000000000000000000002::iota::IOTA>" } } } @@ -233,7 +233,7 @@ Response: { "asMoveObject": { "contents": { "type": { - "repr": "0x0000000000000000000000000000000000000000000000000000000000000002::coin::Coin<0x0000000000000000000000000000000000000000000000000000000000000002::iota::IOTA>" + "repr": "0x0000000000000000000000000000000000000000000000000000000000000002::dynamic_field::Field" } } } @@ -244,7 +244,7 @@ Response: { "asMoveObject": { "contents": { "type": { - "repr": "0x0000000000000000000000000000000000000000000000000000000000000002::dynamic_field::Field" + "repr": "0x0000000000000000000000000000000000000000000000000000000000000002::coin::Coin<0x0000000000000000000000000000000000000000000000000000000000000002::iota::IOTA>" } } } @@ -277,7 +277,7 @@ Response: { "asMoveObject": { "contents": { "type": { - "repr": "0x0000000000000000000000000000000000000000000000000000000000000002::coin::Coin<0x0000000000000000000000000000000000000000000000000000000000000002::iota::IOTA>" + "repr": "0x0000000000000000000000000000000000000000000000000000000000000002::coin::CoinMetadata<0x0000000000000000000000000000000000000000000000000000000000000002::iota::IOTA>" } } } @@ -288,7 +288,7 @@ Response: { "asMoveObject": { "contents": { "type": { - "repr": "0x0000000000000000000000000000000000000000000000000000000000000002::coin::CoinMetadata<0x0000000000000000000000000000000000000000000000000000000000000002::iota::IOTA>" + "repr": "0x0000000000000000000000000000000000000000000000000000000000000002::coin::Coin<0x0000000000000000000000000000000000000000000000000000000000000002::iota::IOTA>" } } } diff --git a/crates/iota-graphql-e2e-tests/tests/objects/filter_by_type.move b/crates/iota-graphql-e2e-tests/tests/objects/filter_by_type.move index 1487434869d..4f43cac4d37 100644 --- a/crates/iota-graphql-e2e-tests/tests/objects/filter_by_type.move +++ b/crates/iota-graphql-e2e-tests/tests/objects/filter_by_type.move @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -//# init --protocol-version 1 --simulator --accounts C +//# init --protocol-version 3 --simulator --accounts C // TODO: Short term hack to get around indexer epoch issue //# create-checkpoint diff --git a/crates/iota-graphql-e2e-tests/tests/objects/pagination.exp b/crates/iota-graphql-e2e-tests/tests/objects/pagination.exp index 38db19b6da2..9c76ad922f0 100644 --- a/crates/iota-graphql-e2e-tests/tests/objects/pagination.exp +++ b/crates/iota-graphql-e2e-tests/tests/objects/pagination.exp @@ -48,19 +48,19 @@ Response: { "objects": { "edges": [ { - "cursor": "IAXGOxelPyat2ktykI7yExbqPi0zGAJwpEL4QOtk4i5JAQAAAAAAAAA=" + "cursor": "IBcnOgT0HBt/zwECt9TY8eAARlbizljFmQw20vNrznaAAQAAAAAAAAA=" }, { - "cursor": "IIhXgyfJmpDjfYgKcvjwnz8XljbqK8kWTshmtGAa1JcrAQAAAAAAAAA=" + "cursor": "IDnfdsnYm3WfTX/I86oanPj4gqpOnvKppLqzh539e51DAQAAAAAAAAA=" }, { - "cursor": "IIuOKDIL3ox4W0vwl9Iys+UJ+hOhYIxg9QXA1kvE02x1AQAAAAAAAAA=" + "cursor": "IEisGDkgq6z6Ww8fsM8DlovaXtUEQKitDSwqq47z+IUhAQAAAAAAAAA=" }, { - "cursor": "IKaEPeEks1/XBPKzfdNHH89Pmqm8lXcmxDqL2W0EAEsyAQAAAAAAAAA=" + "cursor": "IHe6f9OtHxHPsu8Ocxk0+8Le05zLLIWJCX7hPLtjxf1bAQAAAAAAAAA=" }, { - "cursor": "ILL8PT6CGnkMV6rhl3RwEvqsdGHGUNh5XsuxI1STMnrZAQAAAAAAAAA=" + "cursor": "IIOsrADQ8BewuFucSNoSsxl38aOLmCmqq1M1qt1obgy8AQAAAAAAAAA=" } ] } @@ -76,10 +76,10 @@ Response: { "objects": { "edges": [ { - "cursor": "IAXGOxelPyat2ktykI7yExbqPi0zGAJwpEL4QOtk4i5JAQAAAAAAAAA=" + "cursor": "IBcnOgT0HBt/zwECt9TY8eAARlbizljFmQw20vNrznaAAQAAAAAAAAA=" }, { - "cursor": "IIhXgyfJmpDjfYgKcvjwnz8XljbqK8kWTshmtGAa1JcrAQAAAAAAAAA=" + "cursor": "IDnfdsnYm3WfTX/I86oanPj4gqpOnvKppLqzh539e51DAQAAAAAAAAA=" } ] } @@ -95,52 +95,52 @@ Response: { "objects": { "edges": [ { - "cursor": "IAXGOxelPyat2ktykI7yExbqPi0zGAJwpEL4QOtk4i5JAQAAAAAAAAA=", + "cursor": "IBcnOgT0HBt/zwECt9TY8eAARlbizljFmQw20vNrznaAAQAAAAAAAAA=", "node": { - "address": "0x05c63b17a53f26adda4b72908ef21316ea3e2d33180270a442f840eb64e22e49" + "address": "0x17273a04f41c1b7fcf0102b7d4d8f1e0004656e2ce58c5990c36d2f36bce7680" } }, { - "cursor": "IIhXgyfJmpDjfYgKcvjwnz8XljbqK8kWTshmtGAa1JcrAQAAAAAAAAA=", + "cursor": "IDnfdsnYm3WfTX/I86oanPj4gqpOnvKppLqzh539e51DAQAAAAAAAAA=", "node": { - "address": "0x88578327c99a90e37d880a72f8f09f3f179636ea2bc9164ec866b4601ad4972b" + "address": "0x39df76c9d89b759f4d7fc8f3aa1a9cf8f882aa4e9ef2a9a4bab3879dfd7b9d43" } }, { - "cursor": "IIuOKDIL3ox4W0vwl9Iys+UJ+hOhYIxg9QXA1kvE02x1AQAAAAAAAAA=", + "cursor": "IEisGDkgq6z6Ww8fsM8DlovaXtUEQKitDSwqq47z+IUhAQAAAAAAAAA=", "node": { - "address": "0x8b8e28320bde8c785b4bf097d232b3e509fa13a1608c60f505c0d64bc4d36c75" + "address": "0x48ac183920abacfa5b0f1fb0cf03968bda5ed50440a8ad0d2c2aab8ef3f88521" } }, { - "cursor": "IKaEPeEks1/XBPKzfdNHH89Pmqm8lXcmxDqL2W0EAEsyAQAAAAAAAAA=", + "cursor": "IHe6f9OtHxHPsu8Ocxk0+8Le05zLLIWJCX7hPLtjxf1bAQAAAAAAAAA=", "node": { - "address": "0xa6843de124b35fd704f2b37dd3471fcf4f9aa9bc957726c43a8bd96d04004b32" + "address": "0x77ba7fd3ad1f11cfb2ef0e731934fbc2ded39ccb2c8589097ee13cbb63c5fd5b" } }, { - "cursor": "ILL8PT6CGnkMV6rhl3RwEvqsdGHGUNh5XsuxI1STMnrZAQAAAAAAAAA=", + "cursor": "IIOsrADQ8BewuFucSNoSsxl38aOLmCmqq1M1qt1obgy8AQAAAAAAAAA=", "node": { - "address": "0xb2fc3d3e821a790c57aae197747012faac7461c650d8795ecbb1235493327ad9" + "address": "0x83acac00d0f017b0b85b9c48da12b31977f1a38b9829aaab5335aadd686e0cbc" } } ] } }, "obj_3_0": { - "address": "0x88578327c99a90e37d880a72f8f09f3f179636ea2bc9164ec866b4601ad4972b" + "address": "0x17273a04f41c1b7fcf0102b7d4d8f1e0004656e2ce58c5990c36d2f36bce7680" }, "obj_5_0": { - "address": "0xa6843de124b35fd704f2b37dd3471fcf4f9aa9bc957726c43a8bd96d04004b32" + "address": "0x39df76c9d89b759f4d7fc8f3aa1a9cf8f882aa4e9ef2a9a4bab3879dfd7b9d43" }, "obj_6_0": { - "address": "0xb2fc3d3e821a790c57aae197747012faac7461c650d8795ecbb1235493327ad9" + "address": "0x77ba7fd3ad1f11cfb2ef0e731934fbc2ded39ccb2c8589097ee13cbb63c5fd5b" }, "obj_4_0": { - "address": "0x8b8e28320bde8c785b4bf097d232b3e509fa13a1608c60f505c0d64bc4d36c75" + "address": "0x83acac00d0f017b0b85b9c48da12b31977f1a38b9829aaab5335aadd686e0cbc" }, "obj_2_0": { - "address": "0x05c63b17a53f26adda4b72908ef21316ea3e2d33180270a442f840eb64e22e49" + "address": "0x48ac183920abacfa5b0f1fb0cf03968bda5ed50440a8ad0d2c2aab8ef3f88521" } } } @@ -153,7 +153,10 @@ Response: { "objects": { "edges": [ { - "cursor": "ILL8PT6CGnkMV6rhl3RwEvqsdGHGUNh5XsuxI1STMnrZAQAAAAAAAAA=" + "cursor": "IEisGDkgq6z6Ww8fsM8DlovaXtUEQKitDSwqq47z+IUhAQAAAAAAAAA=" + }, + { + "cursor": "IHe6f9OtHxHPsu8Ocxk0+8Le05zLLIWJCX7hPLtjxf1bAQAAAAAAAAA=" } ] } @@ -167,11 +170,7 @@ Response: { "data": { "address": { "objects": { - "edges": [ - { - "cursor": "IKaEPeEks1/XBPKzfdNHH89Pmqm8lXcmxDqL2W0EAEsyAQAAAAAAAAA=" - } - ] + "edges": [] } } } @@ -183,11 +182,7 @@ Response: { "data": { "address": { "objects": { - "edges": [ - { - "cursor": "IAXGOxelPyat2ktykI7yExbqPi0zGAJwpEL4QOtk4i5JAQAAAAAAAAA=" - } - ] + "edges": [] } } } @@ -201,15 +196,15 @@ Response: { "objects": { "edges": [ { - "cursor": "IKaEPeEks1/XBPKzfdNHH89Pmqm8lXcmxDqL2W0EAEsyAQAAAAAAAAA=", + "cursor": "IHe6f9OtHxHPsu8Ocxk0+8Le05zLLIWJCX7hPLtjxf1bAQAAAAAAAAA=", "node": { - "address": "0xa6843de124b35fd704f2b37dd3471fcf4f9aa9bc957726c43a8bd96d04004b32" + "address": "0x77ba7fd3ad1f11cfb2ef0e731934fbc2ded39ccb2c8589097ee13cbb63c5fd5b" } }, { - "cursor": "ILL8PT6CGnkMV6rhl3RwEvqsdGHGUNh5XsuxI1STMnrZAQAAAAAAAAA=", + "cursor": "IIOsrADQ8BewuFucSNoSsxl38aOLmCmqq1M1qt1obgy8AQAAAAAAAAA=", "node": { - "address": "0xb2fc3d3e821a790c57aae197747012faac7461c650d8795ecbb1235493327ad9" + "address": "0x83acac00d0f017b0b85b9c48da12b31977f1a38b9829aaab5335aadd686e0cbc" } } ] diff --git a/crates/iota-graphql-e2e-tests/tests/objects/pagination.move b/crates/iota-graphql-e2e-tests/tests/objects/pagination.move index a29772c7180..1761941b779 100644 --- a/crates/iota-graphql-e2e-tests/tests/objects/pagination.move +++ b/crates/iota-graphql-e2e-tests/tests/objects/pagination.move @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -//# init --protocol-version 1 --addresses Test=0x0 A=0x42 --simulator +//# init --protocol-version 3 --addresses Test=0x0 A=0x42 --simulator //# publish module Test::M1 { diff --git a/crates/iota-graphql-e2e-tests/tests/objects/public_transfer.exp b/crates/iota-graphql-e2e-tests/tests/objects/public_transfer.exp index 5c4f5326f97..a49b4b7a09a 100644 --- a/crates/iota-graphql-e2e-tests/tests/objects/public_transfer.exp +++ b/crates/iota-graphql-e2e-tests/tests/objects/public_transfer.exp @@ -37,7 +37,7 @@ Response: { "asMoveObject": { "contents": { "type": { - "repr": "0xd01ba1620a63906586ce0abe061e1f132f9581e42c616660afa3119a028c48a5::m::Bar" + "repr": "0x0000000000000000000000000000000000000000000000000000000000000002::coin::Coin<0x0000000000000000000000000000000000000000000000000000000000000002::iota::IOTA>" } } } @@ -48,7 +48,7 @@ Response: { "asMoveObject": { "contents": { "type": { - "repr": "0x0000000000000000000000000000000000000000000000000000000000000002::coin::Coin<0x0000000000000000000000000000000000000000000000000000000000000002::iota::IOTA>" + "repr": "0x4bc5cdfa11066824f0581c920eb6d415e06d05af77e9ff92a3ead639290b53fb::m::Bar" } } } @@ -59,7 +59,7 @@ Response: { "asMoveObject": { "contents": { "type": { - "repr": "0xd01ba1620a63906586ce0abe061e1f132f9581e42c616660afa3119a028c48a5::m::Foo" + "repr": "0x4bc5cdfa11066824f0581c920eb6d415e06d05af77e9ff92a3ead639290b53fb::m::Foo" } } } diff --git a/crates/iota-graphql-e2e-tests/tests/objects/public_transfer.move b/crates/iota-graphql-e2e-tests/tests/objects/public_transfer.move index 4859be85c7a..878e31eaddc 100644 --- a/crates/iota-graphql-e2e-tests/tests/objects/public_transfer.move +++ b/crates/iota-graphql-e2e-tests/tests/objects/public_transfer.move @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -//# init --protocol-version 1 --addresses P0=0x0 --accounts A --simulator +//# init --protocol-version 3 --addresses P0=0x0 --accounts A --simulator //# publish module P0::m { diff --git a/crates/iota-graphql-e2e-tests/tests/objects/received.exp b/crates/iota-graphql-e2e-tests/tests/objects/received.exp index 2132f4d9a92..e37bae0b579 100644 --- a/crates/iota-graphql-e2e-tests/tests/objects/received.exp +++ b/crates/iota-graphql-e2e-tests/tests/objects/received.exp @@ -30,7 +30,7 @@ Response: { "receivedTransactionBlocks": { "nodes": [ { - "digest": "87R2Us8BZN1RJYEvfdLp3LrxiiVWuwJA5UeMoCeYdJ4b" + "digest": "5Y8XcPc5cBi1hAXtoWbC8Zp5NkJB2pwsiwy81YtSbTxR" } ] } diff --git a/crates/iota-graphql-e2e-tests/tests/objects/received.move b/crates/iota-graphql-e2e-tests/tests/objects/received.move index c79a2dbf3d2..349b70ab0f1 100644 --- a/crates/iota-graphql-e2e-tests/tests/objects/received.move +++ b/crates/iota-graphql-e2e-tests/tests/objects/received.move @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -//# init --protocol-version 1 --addresses P0=0x0 --simulator +//# init --protocol-version 3 --addresses P0=0x0 --simulator //# run-graphql { diff --git a/crates/iota-graphql-e2e-tests/tests/objects/staked_iota.exp b/crates/iota-graphql-e2e-tests/tests/objects/staked_iota.exp index af253fa6124..2ecf6ea028d 100644 --- a/crates/iota-graphql-e2e-tests/tests/objects/staked_iota.exp +++ b/crates/iota-graphql-e2e-tests/tests/objects/staked_iota.exp @@ -10,7 +10,7 @@ Response: { "objects": { "edges": [ { - "cursor": "IAeULt3Vt3s3r+CMTYVO1viD348GDaO7+cH3HhE5nbGzAAAAAAAAAAA=", + "cursor": "IBzTT9dE90ffUpMMyHxrf3Gr46ZpcTQoNSYG8PyAd4rRAAAAAAAAAAA=", "node": { "asMoveObject": { "asStakedIota": { @@ -39,7 +39,7 @@ gas summary: computation_cost: 1000000, computation_cost_burned: 1000000, storag task 3, line 38: //# run 0x3::iota_system::request_add_stake --args object(0x5) object(2,0) @validator_0 --sender C -events: Event { package_id: iota_system, transaction_module: Identifier("iota_system"), sender: C, type_: StructTag { address: iota_system, module: Identifier("validator"), name: Identifier("StakingRequestEvent"), type_params: [] }, contents: [145, 201, 73, 32, 135, 23, 121, 37, 7, 101, 40, 103, 216, 99, 155, 51, 118, 111, 115, 220, 44, 253, 144, 143, 80, 103, 133, 240, 58, 235, 137, 202, 175, 163, 158, 79, 0, 218, 226, 120, 249, 119, 199, 198, 147, 10, 94, 44, 118, 232, 93, 23, 165, 38, 215, 36, 187, 206, 15, 184, 31, 176, 125, 76, 140, 202, 78, 28, 224, 186, 89, 4, 206, 166, 29, 249, 36, 45, 162, 247, 210, 158, 62, 243, 40, 251, 126, 192, 124, 8, 107, 59, 244, 124, 166, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 11, 84, 2, 0, 0, 0] } +events: Event { package_id: iota_system, transaction_module: Identifier("iota_system"), sender: C, type_: StructTag { address: iota_system, module: Identifier("validator"), name: Identifier("StakingRequestEvent"), type_params: [] }, contents: [217, 25, 175, 239, 57, 244, 176, 32, 209, 232, 109, 171, 147, 246, 3, 15, 205, 197, 172, 21, 36, 143, 47, 100, 240, 226, 221, 254, 42, 3, 157, 155, 175, 163, 158, 79, 0, 218, 226, 120, 249, 119, 199, 198, 147, 10, 94, 44, 118, 232, 93, 23, 165, 38, 215, 36, 187, 206, 15, 184, 31, 176, 125, 76, 140, 202, 78, 28, 224, 186, 89, 4, 206, 166, 29, 249, 36, 45, 162, 247, 210, 158, 62, 243, 40, 251, 126, 192, 124, 8, 107, 59, 244, 124, 166, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 11, 84, 2, 0, 0, 0] } created: object(3,0) mutated: object(_), 0x0000000000000000000000000000000000000000000000000000000000000005, object(0,0) deleted: object(2,0) @@ -60,34 +60,34 @@ Response: { "objects": { "edges": [ { - "cursor": "IAeULt3Vt3s3r+CMTYVO1viD348GDaO7+cH3HhE5nbGzAgAAAAAAAAA=", + "cursor": "IBRoODsinaSa4FR6ECYNlPAg85qVJE3d+HBEkymgWhy5AgAAAAAAAAA=", "node": { "asMoveObject": { "asStakedIota": { - "principal": "1500000000000000", - "poolId": "0x91c949208717792507652867d8639b33766f73dc2cfd908f506785f03aeb89ca" + "principal": "15340000000000", + "poolId": "0xd919afef39f4b020d1e86dab93f6030fcdc5ac15248f2f64f0e2ddfe2a039d9b" } } } }, { - "cursor": "IA+owYRIwFujnaEiElWV25tmsgRd3aiT7h9//oDyhQb2AgAAAAAAAAA=", + "cursor": "IBzTT9dE90ffUpMMyHxrf3Gr46ZpcTQoNSYG8PyAd4rRAgAAAAAAAAA=", "node": { "asMoveObject": { "asStakedIota": { - "principal": "15340000000000", - "poolId": "0x91c949208717792507652867d8639b33766f73dc2cfd908f506785f03aeb89ca" + "principal": "1500000000000000", + "poolId": "0xd919afef39f4b020d1e86dab93f6030fcdc5ac15248f2f64f0e2ddfe2a039d9b" } } } }, { - "cursor": "IPEp6dbnEicrkwynNujLy5/Voas64Cc5Ta7ruT5oQNbTAgAAAAAAAAA=", + "cursor": "ICx+i9jLtLxeXhS/A0ahYRLGYYlMzFleNwu1meRx2FBtAgAAAAAAAAA=", "node": { "asMoveObject": { "asStakedIota": { "principal": "10000000000", - "poolId": "0x91c949208717792507652867d8639b33766f73dc2cfd908f506785f03aeb89ca" + "poolId": "0xd919afef39f4b020d1e86dab93f6030fcdc5ac15248f2f64f0e2ddfe2a039d9b" } } } @@ -98,7 +98,7 @@ Response: { "stakedIotas": { "edges": [ { - "cursor": "IPEp6dbnEicrkwynNujLy5/Voas64Cc5Ta7ruT5oQNbTAgAAAAAAAAA=", + "cursor": "ICx+i9jLtLxeXhS/A0ahYRLGYYlMzFleNwu1meRx2FBtAgAAAAAAAAA=", "node": { "principal": "10000000000" } diff --git a/crates/iota-graphql-e2e-tests/tests/objects/staked_iota.move b/crates/iota-graphql-e2e-tests/tests/objects/staked_iota.move index 78ffdc2c968..28433b412c2 100644 --- a/crates/iota-graphql-e2e-tests/tests/objects/staked_iota.move +++ b/crates/iota-graphql-e2e-tests/tests/objects/staked_iota.move @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -//# init --protocol-version 1 --simulator --accounts C +//# init --protocol-version 3 --simulator --accounts C //# run-graphql { # Initial query yields only the validator's stake diff --git a/crates/iota-graphql-e2e-tests/tests/owner/downcasts.exp b/crates/iota-graphql-e2e-tests/tests/owner/downcasts.exp index 4c0135a646e..a9841222726 100644 --- a/crates/iota-graphql-e2e-tests/tests/owner/downcasts.exp +++ b/crates/iota-graphql-e2e-tests/tests/owner/downcasts.exp @@ -24,7 +24,7 @@ Response: { }, "coin": { "asObject": { - "digest": "MCn6VCYaKu81nt3Azx9A31GtLmmmtfzuWnShjGXxBPC" + "digest": "53tg3FNtsBq9jFpgBiemKEYtj9qFZ5CZxbpJnsc5uAcY" } } } diff --git a/crates/iota-graphql-e2e-tests/tests/owner/downcasts.move b/crates/iota-graphql-e2e-tests/tests/owner/downcasts.move index 1213b5f0a0d..5e724b2490c 100644 --- a/crates/iota-graphql-e2e-tests/tests/owner/downcasts.move +++ b/crates/iota-graphql-e2e-tests/tests/owner/downcasts.move @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -//# init --protocol-version 1 --addresses P0=0x0 --accounts A --simulator +//# init --protocol-version 3 --addresses P0=0x0 --accounts A --simulator // Split off a gas coin, so we have an object to query //# programmable --sender A --inputs 1000 @A diff --git a/crates/iota-graphql-e2e-tests/tests/owner/root_version.exp b/crates/iota-graphql-e2e-tests/tests/owner/root_version.exp index 32e752065fb..78af306fc98 100644 --- a/crates/iota-graphql-e2e-tests/tests/owner/root_version.exp +++ b/crates/iota-graphql-e2e-tests/tests/owner/root_version.exp @@ -124,10 +124,10 @@ Response: { "version": 11, "contents": { "json": { - "id": "0x92649202a7ed897a62d638e17c21515c6a948ac7be20cc41060455601883cd00", + "id": "0xb5aecdb998631cc910744d437cb25748475a2a9e6230ca5953e8942b6994ab49", "count": "1", "wrapped": { - "id": "0xe49f0faf71c339f2bbcf1348bdc3b8ba4ece961691aed1a8d9309d400ef140e5", + "id": "0x4550d7846ec386e99c914c4e6b0ea63f9e5f61bf8fa6f3e6d44593666d107989", "count": "1" } } @@ -141,10 +141,10 @@ Response: { "version": 10, "contents": { "json": { - "id": "0x92649202a7ed897a62d638e17c21515c6a948ac7be20cc41060455601883cd00", + "id": "0xb5aecdb998631cc910744d437cb25748475a2a9e6230ca5953e8942b6994ab49", "count": "1", "wrapped": { - "id": "0xe49f0faf71c339f2bbcf1348bdc3b8ba4ece961691aed1a8d9309d400ef140e5", + "id": "0x4550d7846ec386e99c914c4e6b0ea63f9e5f61bf8fa6f3e6d44593666d107989", "count": "1" } } @@ -158,10 +158,10 @@ Response: { "version": 8, "contents": { "json": { - "id": "0x92649202a7ed897a62d638e17c21515c6a948ac7be20cc41060455601883cd00", + "id": "0xb5aecdb998631cc910744d437cb25748475a2a9e6230ca5953e8942b6994ab49", "count": "1", "wrapped": { - "id": "0xe49f0faf71c339f2bbcf1348bdc3b8ba4ece961691aed1a8d9309d400ef140e5", + "id": "0x4550d7846ec386e99c914c4e6b0ea63f9e5f61bf8fa6f3e6d44593666d107989", "count": "0" } } @@ -175,10 +175,10 @@ Response: { "version": 7, "contents": { "json": { - "id": "0x92649202a7ed897a62d638e17c21515c6a948ac7be20cc41060455601883cd00", + "id": "0xb5aecdb998631cc910744d437cb25748475a2a9e6230ca5953e8942b6994ab49", "count": "0", "wrapped": { - "id": "0xe49f0faf71c339f2bbcf1348bdc3b8ba4ece961691aed1a8d9309d400ef140e5", + "id": "0x4550d7846ec386e99c914c4e6b0ea63f9e5f61bf8fa6f3e6d44593666d107989", "count": "0" } } @@ -199,7 +199,7 @@ Response: { "version": 7, "contents": { "json": { - "id": "0x12b9cd665e2fba6d9cda7d1b651188c07f355ebb6258fab2fb07161606b4ab2a", + "id": "0x3e0b2966e7f0c0a706456cb99bb8421b32863f5a4524b02d338ff2b797804bc3", "count": "0" } } @@ -212,7 +212,7 @@ Response: { "version": 10, "contents": { "json": { - "id": "0x12b9cd665e2fba6d9cda7d1b651188c07f355ebb6258fab2fb07161606b4ab2a", + "id": "0x3e0b2966e7f0c0a706456cb99bb8421b32863f5a4524b02d338ff2b797804bc3", "count": "1" } } @@ -225,7 +225,7 @@ Response: { "version": 10, "contents": { "json": { - "id": "0x12b9cd665e2fba6d9cda7d1b651188c07f355ebb6258fab2fb07161606b4ab2a", + "id": "0x3e0b2966e7f0c0a706456cb99bb8421b32863f5a4524b02d338ff2b797804bc3", "count": "1" } } @@ -238,7 +238,7 @@ Response: { "version": 7, "contents": { "json": { - "id": "0x12b9cd665e2fba6d9cda7d1b651188c07f355ebb6258fab2fb07161606b4ab2a", + "id": "0x3e0b2966e7f0c0a706456cb99bb8421b32863f5a4524b02d338ff2b797804bc3", "count": "0" } } @@ -251,7 +251,7 @@ Response: { "version": 7, "contents": { "json": { - "id": "0x12b9cd665e2fba6d9cda7d1b651188c07f355ebb6258fab2fb07161606b4ab2a", + "id": "0x3e0b2966e7f0c0a706456cb99bb8421b32863f5a4524b02d338ff2b797804bc3", "count": "0" } } @@ -271,7 +271,7 @@ Response: { "version": 7, "contents": { "json": { - "id": "0xd466bb5f3baf46598ec3550987b3993d522e10758441b170fd2a4eab5f618320", + "id": "0x04f88b43d1ec09fb0141d0b9e699753c5cf49a45e62f9c1caa4ecf2090948bfb", "count": "0" } } @@ -284,7 +284,7 @@ Response: { "version": 11, "contents": { "json": { - "id": "0xd466bb5f3baf46598ec3550987b3993d522e10758441b170fd2a4eab5f618320", + "id": "0x04f88b43d1ec09fb0141d0b9e699753c5cf49a45e62f9c1caa4ecf2090948bfb", "count": "1" } } @@ -297,7 +297,7 @@ Response: { "version": 7, "contents": { "json": { - "id": "0xd466bb5f3baf46598ec3550987b3993d522e10758441b170fd2a4eab5f618320", + "id": "0x04f88b43d1ec09fb0141d0b9e699753c5cf49a45e62f9c1caa4ecf2090948bfb", "count": "0" } } diff --git a/crates/iota-graphql-e2e-tests/tests/owner/root_version.move b/crates/iota-graphql-e2e-tests/tests/owner/root_version.move index 843513267e6..75ac65d88f8 100644 --- a/crates/iota-graphql-e2e-tests/tests/owner/root_version.move +++ b/crates/iota-graphql-e2e-tests/tests/owner/root_version.move @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -//# init --protocol-version 1 --addresses P0=0x0 --accounts A --simulator +//# init --protocol-version 3 --addresses P0=0x0 --accounts A --simulator //# publish module P0::M { diff --git a/crates/iota-graphql-e2e-tests/tests/packages/datatypes.exp b/crates/iota-graphql-e2e-tests/tests/packages/datatypes.exp index 0b4e2611e4b..7304306a6d1 100644 --- a/crates/iota-graphql-e2e-tests/tests/packages/datatypes.exp +++ b/crates/iota-graphql-e2e-tests/tests/packages/datatypes.exp @@ -155,7 +155,7 @@ task 5, lines 73-97: Response: { "data": { "object": { - "address": "0x416f86a3ae5c3eae593a2f345346265988d2d4a5a981c9635e506ccdb5417d5b", + "address": "0x54eaef53a812cd11c23a201ef3f2920fb6a6461815e8258402193f35d0e7d8b9", "asMovePackage": { "module": { "datatypes": { @@ -190,7 +190,7 @@ task 6, lines 99-144: Response: { "data": { "object": { - "address": "0x416f86a3ae5c3eae593a2f345346265988d2d4a5a981c9635e506ccdb5417d5b", + "address": "0x54eaef53a812cd11c23a201ef3f2920fb6a6461815e8258402193f35d0e7d8b9", "asMovePackage": { "module": { "datatypes": { diff --git a/crates/iota-graphql-e2e-tests/tests/packages/datatypes.move b/crates/iota-graphql-e2e-tests/tests/packages/datatypes.move index 9c9cf1bf15c..384d1768633 100644 --- a/crates/iota-graphql-e2e-tests/tests/packages/datatypes.move +++ b/crates/iota-graphql-e2e-tests/tests/packages/datatypes.move @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -//# init --addresses P0=0x0 P1=0x0 --accounts A --simulator --protocol-version 1 +//# init --addresses P0=0x0 P1=0x0 --accounts A --simulator --protocol-version 3 //# run-graphql diff --git a/crates/iota-graphql-e2e-tests/tests/packages/enums.exp b/crates/iota-graphql-e2e-tests/tests/packages/enums.exp index 49ab62fee88..4c9b4d89409 100644 --- a/crates/iota-graphql-e2e-tests/tests/packages/enums.exp +++ b/crates/iota-graphql-e2e-tests/tests/packages/enums.exp @@ -25,13 +25,19 @@ Response: { "nodes": [ { "outputState": { - "address": "0x70d8121ec58cb9e0c1e7af1e2d2b255737dc0b9a63e845d1357d78d371f3b858", + "address": "0x18a5cb688685554c4b370c3f551466dba6fb25390920fa5836812a9fb66500c4", "asMovePackage": null } }, { "outputState": { - "address": "0xbf719126a219999498cda62d638ec3e5bafded8aeff2183e30876ba3f4b88870", + "address": "0x87c53ab5ea6379f82a592148afc619d80f05d498f04827f8ee7b3b09a19de8c3", + "asMovePackage": null + } + }, + { + "outputState": { + "address": "0xcc4c98e77e7e93b1e93e8def3fbc0edd188d3ce404c3f321316104825983ce8c", "asMovePackage": { "module": { "enum": { @@ -87,12 +93,6 @@ Response: { } } } - }, - { - "outputState": { - "address": "0xc69f1954c6d13e3630075f462966e06d9f05fec29846d3d781026187e5411431", - "asMovePackage": null - } } ] } @@ -125,13 +125,25 @@ Response: { "nodes": [ { "outputState": { - "address": "0x5f826526feff5ea347f55fc824285e273961ae527be45af5b4267fade97c6fa8", + "address": "0x18a5cb688685554c4b370c3f551466dba6fb25390920fa5836812a9fb66500c4", + "asMovePackage": null + } + }, + { + "outputState": { + "address": "0x87c53ab5ea6379f82a592148afc619d80f05d498f04827f8ee7b3b09a19de8c3", + "asMovePackage": null + } + }, + { + "outputState": { + "address": "0x87d6d716a945bd647ebfad919a11364eece57ca6c7f78ce90a652324f00a238c", "asMovePackage": { "module": { "s": { "module": { "package": { - "address": "0xbf719126a219999498cda62d638ec3e5bafded8aeff2183e30876ba3f4b88870" + "address": "0xcc4c98e77e7e93b1e93e8def3fbc0edd188d3ce404c3f321316104825983ce8c" } }, "name": "S", @@ -186,7 +198,7 @@ Response: { "t": { "module": { "package": { - "address": "0x5f826526feff5ea347f55fc824285e273961ae527be45af5b4267fade97c6fa8" + "address": "0x87d6d716a945bd647ebfad919a11364eece57ca6c7f78ce90a652324f00a238c" } }, "name": "T", @@ -216,12 +228,12 @@ Response: { { "name": "s", "type": { - "repr": "0xbf719126a219999498cda62d638ec3e5bafded8aeff2183e30876ba3f4b88870::m::S", + "repr": "0xcc4c98e77e7e93b1e93e8def3fbc0edd188d3ce404c3f321316104825983ce8c::m::S", "signature": { "ref": null, "body": { "datatype": { - "package": "0xbf719126a219999498cda62d638ec3e5bafded8aeff2183e30876ba3f4b88870", + "package": "0xcc4c98e77e7e93b1e93e8def3fbc0edd188d3ce404c3f321316104825983ce8c", "module": "m", "type": "S", "typeParameters": [] @@ -255,7 +267,7 @@ Response: { { "name": "t", "type": { - "repr": "0xbf719126a219999498cda62d638ec3e5bafded8aeff2183e30876ba3f4b88870::m::T<0xbf719126a219999498cda62d638ec3e5bafded8aeff2183e30876ba3f4b88870::m::S>" + "repr": "0xcc4c98e77e7e93b1e93e8def3fbc0edd188d3ce404c3f321316104825983ce8c::m::T<0xcc4c98e77e7e93b1e93e8def3fbc0edd188d3ce404c3f321316104825983ce8c::m::S>" } } ] @@ -265,18 +277,6 @@ Response: { } } } - }, - { - "outputState": { - "address": "0x70d8121ec58cb9e0c1e7af1e2d2b255737dc0b9a63e845d1357d78d371f3b858", - "asMovePackage": null - } - }, - { - "outputState": { - "address": "0xc69f1954c6d13e3630075f462966e06d9f05fec29846d3d781026187e5411431", - "asMovePackage": null - } } ] } @@ -297,6 +297,16 @@ Response: { "effects": { "objectChanges": { "nodes": [ + { + "outputState": { + "asMovePackage": null + } + }, + { + "outputState": { + "asMovePackage": null + } + }, { "outputState": { "asMovePackage": { @@ -316,16 +326,6 @@ Response: { } } } - }, - { - "outputState": { - "asMovePackage": null - } - }, - { - "outputState": { - "asMovePackage": null - } } ] } diff --git a/crates/iota-graphql-e2e-tests/tests/packages/enums.move b/crates/iota-graphql-e2e-tests/tests/packages/enums.move index 3c858b24aab..21b2ab9b3fc 100644 --- a/crates/iota-graphql-e2e-tests/tests/packages/enums.move +++ b/crates/iota-graphql-e2e-tests/tests/packages/enums.move @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -//# init --addresses P0=0x0 P1=0x0 --accounts A --simulator --protocol-version 1 +//# init --addresses P0=0x0 P1=0x0 --accounts A --simulator --protocol-version 3 //# publish --upgradeable --sender A diff --git a/crates/iota-graphql-e2e-tests/tests/packages/friends.exp b/crates/iota-graphql-e2e-tests/tests/packages/friends.exp index ad3f49f048c..51aaa0c74ee 100644 --- a/crates/iota-graphql-e2e-tests/tests/packages/friends.exp +++ b/crates/iota-graphql-e2e-tests/tests/packages/friends.exp @@ -23,6 +23,16 @@ Response: { "effects": { "objectChanges": { "nodes": [ + { + "outputState": { + "asMovePackage": null + } + }, + { + "outputState": { + "asMovePackage": null + } + }, { "outputState": { "asMovePackage": { @@ -96,16 +106,6 @@ Response: { } } } - }, - { - "outputState": { - "asMovePackage": null - } - }, - { - "outputState": { - "asMovePackage": null - } } ] } @@ -128,9 +128,7 @@ Response: { "nodes": [ { "outputState": { - "asMovePackage": { - "module": null - } + "asMovePackage": null } }, { @@ -140,7 +138,9 @@ Response: { }, { "outputState": { - "asMovePackage": null + "asMovePackage": { + "module": null + } } } ] @@ -166,7 +166,7 @@ Response: { "effects", "objectChanges", "nodes", - 0, + 2, "outputState", "asMovePackage", "module", @@ -189,6 +189,16 @@ Response: { "effects": { "objectChanges": { "nodes": [ + { + "outputState": { + "asMovePackage": null + } + }, + { + "outputState": { + "asMovePackage": null + } + }, { "outputState": { "asMovePackage": { @@ -264,16 +274,6 @@ Response: { } } } - }, - { - "outputState": { - "asMovePackage": null - } - }, - { - "outputState": { - "asMovePackage": null - } } ] } @@ -309,11 +309,6 @@ Response: { "asMovePackage": null } }, - { - "outputState": { - "asMovePackage": null - } - }, { "outputState": { "asMovePackage": { @@ -349,6 +344,11 @@ Response: { } } } + }, + { + "outputState": { + "asMovePackage": null + } } ] } diff --git a/crates/iota-graphql-e2e-tests/tests/packages/friends.move b/crates/iota-graphql-e2e-tests/tests/packages/friends.move index 457541c820e..d20b2d1cb71 100644 --- a/crates/iota-graphql-e2e-tests/tests/packages/friends.move +++ b/crates/iota-graphql-e2e-tests/tests/packages/friends.move @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -//# init --protocol-version 1 --addresses P0=0x0 P1=0x0 --accounts A --simulator +//# init --protocol-version 3 --addresses P0=0x0 P1=0x0 --accounts A --simulator //# publish --upgradeable --sender A diff --git a/crates/iota-graphql-e2e-tests/tests/packages/functions.exp b/crates/iota-graphql-e2e-tests/tests/packages/functions.exp index bb7442d617f..885e72d8399 100644 --- a/crates/iota-graphql-e2e-tests/tests/packages/functions.exp +++ b/crates/iota-graphql-e2e-tests/tests/packages/functions.exp @@ -95,19 +95,25 @@ Response: { "nodes": [ { "outputState": { - "address": "0x0d5aebe6f12ff71a237457c35211f4c584b2223a4f2702affa8d58975bc149c9", + "address": "0x18a5cb688685554c4b370c3f551466dba6fb25390920fa5836812a9fb66500c4", "asMovePackage": null } }, { "outputState": { - "address": "0x807e4a90bae0ebd4b5726bf685fedcd12877ab1a0feb7b67ecdc648e270356d4", + "address": "0x3a83f4839537a59d741dc28360d84b70e8d92abbecf377de4e2b82d259fbc632", + "asMovePackage": null + } + }, + { + "outputState": { + "address": "0xdbeae47ffd82a9b37300ad21bcb435145647c3026172a3067d4bd6194ad38bf2", "asMovePackage": { "module": { "function": { "module": { "package": { - "address": "0x807e4a90bae0ebd4b5726bf685fedcd12877ab1a0feb7b67ecdc648e270356d4" + "address": "0xdbeae47ffd82a9b37300ad21bcb435145647c3026172a3067d4bd6194ad38bf2" } }, "name": "f", @@ -137,12 +143,6 @@ Response: { } } } - }, - { - "outputState": { - "address": "0xc69f1954c6d13e3630075f462966e06d9f05fec29846d3d781026187e5411431", - "asMovePackage": null - } } ] } @@ -175,25 +175,25 @@ Response: { "nodes": [ { "outputState": { - "address": "0x0d5aebe6f12ff71a237457c35211f4c584b2223a4f2702affa8d58975bc149c9", + "address": "0x18a5cb688685554c4b370c3f551466dba6fb25390920fa5836812a9fb66500c4", "asMovePackage": null } }, { "outputState": { - "address": "0xc69f1954c6d13e3630075f462966e06d9f05fec29846d3d781026187e5411431", + "address": "0x3a83f4839537a59d741dc28360d84b70e8d92abbecf377de4e2b82d259fbc632", "asMovePackage": null } }, { "outputState": { - "address": "0xe57e6628d5170a1fc4209c1f4cf1cfb8bcf42f6874ab8f90fda217600741f46a", + "address": "0xe8ab1e0a297142a98aa0f732ed13f760e845c821b72b532d77c8094466b7ee3c", "asMovePackage": { "module": { "f": { "module": { "package": { - "address": "0xe57e6628d5170a1fc4209c1f4cf1cfb8bcf42f6874ab8f90fda217600741f46a" + "address": "0xe8ab1e0a297142a98aa0f732ed13f760e845c821b72b532d77c8094466b7ee3c" } }, "name": "f", @@ -223,7 +223,7 @@ Response: { "g": { "module": { "package": { - "address": "0xe57e6628d5170a1fc4209c1f4cf1cfb8bcf42f6874ab8f90fda217600741f46a" + "address": "0xe8ab1e0a297142a98aa0f732ed13f760e845c821b72b532d77c8094466b7ee3c" } }, "name": "g", diff --git a/crates/iota-graphql-e2e-tests/tests/packages/functions.move b/crates/iota-graphql-e2e-tests/tests/packages/functions.move index 775e9dcef5d..7de67e6eca5 100644 --- a/crates/iota-graphql-e2e-tests/tests/packages/functions.move +++ b/crates/iota-graphql-e2e-tests/tests/packages/functions.move @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -//# init --protocol-version 1 --addresses P0=0x0 P1=0x0 --accounts A --simulator +//# init --protocol-version 3 --addresses P0=0x0 P1=0x0 --accounts A --simulator //# run-graphql diff --git a/crates/iota-graphql-e2e-tests/tests/packages/modules.exp b/crates/iota-graphql-e2e-tests/tests/packages/modules.exp index 9351971dcea..a11451f5896 100644 --- a/crates/iota-graphql-e2e-tests/tests/packages/modules.exp +++ b/crates/iota-graphql-e2e-tests/tests/packages/modules.exp @@ -22,23 +22,23 @@ Response: { "nodes": [ { "outputState": { - "address": "0x3a391c29453c2e07af1eb0befd50b903f0cc1609df8826e1a79d3e1eceab6481", + "address": "0x3079bbb8be43087ea062afccaf9c251714e7917667a46202a1de549f7fbf06ec", "asMovePackage": { "module": { "name": "m", "package": { - "address": "0x3a391c29453c2e07af1eb0befd50b903f0cc1609df8826e1a79d3e1eceab6481" + "address": "0x3079bbb8be43087ea062afccaf9c251714e7917667a46202a1de549f7fbf06ec" }, "fileFormatVersion": 6, - "bytes": "oRzrCwYAAAAIAQAGAgYKAxARBCEEBSUfB0QkCGhADKgBMAAGAQMBBQEADAEAAQIBAgAABAABAQIAAgIBAAEHBQEBAAIEAAYCAwYLAAEJAAEDAQYLAAEIAQABCQABBgsAAQkAAQgBBENvaW4ESU9UQQNiYXIEY29pbgNmb28EaW90YQFtBXZhbHVlOjkcKUU8LgevHrC+/VC5A/DMFgnfiCbhp50+Hs6rZIEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgABAAADBQsBOAALABYCAQEAAAMIBioAAAAAAAAACgA4AQYrAAAAAAAAAAsAOAEYAgA=", - "disassembly": "// Move bytecode v6\nmodule 3a391c29453c2e07af1eb0befd50b903f0cc1609df8826e1a79d3e1eceab6481.m {\nuse 0000000000000000000000000000000000000000000000000000000000000002::coin;\nuse 0000000000000000000000000000000000000000000000000000000000000002::iota;\n\n\n\n\n\n\npublic foo(Arg0: u64, Arg1: &Coin): u64 {\nB0:\n\t0: MoveLoc[1](Arg1: &Coin)\n\t1: Call coin::value(&Coin): u64\n\t2: MoveLoc[0](Arg0: u64)\n\t3: Add\n\t4: Ret\n\n}\npublic bar(Arg0: &Coin): u64 {\nB0:\n\t0: LdU64(42)\n\t1: CopyLoc[0](Arg0: &Coin)\n\t2: Call foo(u64, &Coin): u64\n\t3: LdU64(43)\n\t4: MoveLoc[0](Arg0: &Coin)\n\t5: Call foo(u64, &Coin): u64\n\t6: Mul\n\t7: Ret\n\n}\n}" + "bytes": "oRzrCwYAAAAIAQAGAgYKAxARBCEEBSUfB0QkCGhADKgBMAAGAQMBBQEADAEAAQIBAgAABAABAQIAAgIBAAEHBQEBAAIEAAYCAwYLAAEJAAEDAQYLAAEIAQABCQABBgsAAQkAAQgBBENvaW4ESU9UQQNiYXIEY29pbgNmb28EaW90YQFtBXZhbHVlMHm7uL5DCH6gYq/Mr5wlFxTnkXZnpGICod5Un3+/BuwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgABAAADBQsBOAALABYCAQEAAAMIBioAAAAAAAAACgA4AQYrAAAAAAAAAAsAOAEYAgA=", + "disassembly": "// Move bytecode v6\nmodule 3079bbb8be43087ea062afccaf9c251714e7917667a46202a1de549f7fbf06ec.m {\nuse 0000000000000000000000000000000000000000000000000000000000000002::coin;\nuse 0000000000000000000000000000000000000000000000000000000000000002::iota;\n\n\n\n\n\n\npublic foo(Arg0: u64, Arg1: &Coin): u64 {\nB0:\n\t0: MoveLoc[1](Arg1: &Coin)\n\t1: Call coin::value(&Coin): u64\n\t2: MoveLoc[0](Arg0: u64)\n\t3: Add\n\t4: Ret\n\n}\npublic bar(Arg0: &Coin): u64 {\nB0:\n\t0: LdU64(42)\n\t1: CopyLoc[0](Arg0: &Coin)\n\t2: Call foo(u64, &Coin): u64\n\t3: LdU64(43)\n\t4: MoveLoc[0](Arg0: &Coin)\n\t5: Call foo(u64, &Coin): u64\n\t6: Mul\n\t7: Ret\n\n}\n}" } } } }, { "outputState": { - "address": "0xf22e2f7e20b84f57fdcf1f44c79c321533b922fa9488c23556356ae3f906b0bb", + "address": "0x5ba4893be3938566e676ec9ded7f006ac2f8a5cf9713ff00880f4d8a2bd24434", "asMovePackage": null } } @@ -63,7 +63,7 @@ Response: { "nodes": [ { "outputState": { - "address": "0x3a391c29453c2e07af1eb0befd50b903f0cc1609df8826e1a79d3e1eceab6481", + "address": "0x3079bbb8be43087ea062afccaf9c251714e7917667a46202a1de549f7fbf06ec", "asMovePackage": { "all": { "edges": [ @@ -136,7 +136,7 @@ Response: { }, { "outputState": { - "address": "0xf22e2f7e20b84f57fdcf1f44c79c321533b922fa9488c23556356ae3f906b0bb", + "address": "0x5ba4893be3938566e676ec9ded7f006ac2f8a5cf9713ff00880f4d8a2bd24434", "asMovePackage": null } } @@ -161,7 +161,7 @@ Response: { "nodes": [ { "outputState": { - "address": "0x3a391c29453c2e07af1eb0befd50b903f0cc1609df8826e1a79d3e1eceab6481", + "address": "0x3079bbb8be43087ea062afccaf9c251714e7917667a46202a1de549f7fbf06ec", "asMovePackage": { "prefix": { "edges": [ @@ -276,7 +276,7 @@ Response: { }, { "outputState": { - "address": "0xf22e2f7e20b84f57fdcf1f44c79c321533b922fa9488c23556356ae3f906b0bb", + "address": "0x5ba4893be3938566e676ec9ded7f006ac2f8a5cf9713ff00880f4d8a2bd24434", "asMovePackage": null } } diff --git a/crates/iota-graphql-e2e-tests/tests/packages/modules.move b/crates/iota-graphql-e2e-tests/tests/packages/modules.move index 5d060390370..2f94544273a 100644 --- a/crates/iota-graphql-e2e-tests/tests/packages/modules.move +++ b/crates/iota-graphql-e2e-tests/tests/packages/modules.move @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -//# init --protocol-version 1 --addresses pkg=0x0 --simulator +//# init --protocol-version 3 --addresses pkg=0x0 --simulator //# publish diff --git a/crates/iota-graphql-e2e-tests/tests/packages/structs.exp b/crates/iota-graphql-e2e-tests/tests/packages/structs.exp index 32e3769f08f..219a30ea5f7 100644 --- a/crates/iota-graphql-e2e-tests/tests/packages/structs.exp +++ b/crates/iota-graphql-e2e-tests/tests/packages/structs.exp @@ -154,19 +154,19 @@ Response: { "nodes": [ { "outputState": { - "address": "0x84c38f8d9019f1e508e97d3496da69da808df7482086053358996b7679e9e8b0", + "address": "0x18a5cb688685554c4b370c3f551466dba6fb25390920fa5836812a9fb66500c4", "asMovePackage": null } }, { "outputState": { - "address": "0xc69f1954c6d13e3630075f462966e06d9f05fec29846d3d781026187e5411431", + "address": "0x3d5f2563cf49bfa78c83aaa5d4c327b682046e151dd0bb6230a6bf0337e09394", "asMovePackage": null } }, { "outputState": { - "address": "0xfc8d5ed0a9e91f3edc482b1494ad1d010721fa25b3542147604d9dc4194c5b56", + "address": "0x7782861497fc6e7cfe33fa186e469d51323147f7c25ad0583c49d49f52da3208", "asMovePackage": { "module": { "struct": { @@ -224,13 +224,25 @@ Response: { "nodes": [ { "outputState": { - "address": "0x0fcbd15c6fc4129828bd9551a7c79b672a801b095eb2009787bd81372c91b7ed", + "address": "0x18a5cb688685554c4b370c3f551466dba6fb25390920fa5836812a9fb66500c4", + "asMovePackage": null + } + }, + { + "outputState": { + "address": "0x3d5f2563cf49bfa78c83aaa5d4c327b682046e151dd0bb6230a6bf0337e09394", + "asMovePackage": null + } + }, + { + "outputState": { + "address": "0x60963c987e0b206d400a3b2a3a0e5ec3a182f1d4b5b52bbac9c2c2b92bfab908", "asMovePackage": { "module": { "s": { "module": { "package": { - "address": "0xfc8d5ed0a9e91f3edc482b1494ad1d010721fa25b3542147604d9dc4194c5b56" + "address": "0x7782861497fc6e7cfe33fa186e469d51323147f7c25ad0583c49d49f52da3208" } }, "name": "S", @@ -255,7 +267,7 @@ Response: { "t": { "module": { "package": { - "address": "0x0fcbd15c6fc4129828bd9551a7c79b672a801b095eb2009787bd81372c91b7ed" + "address": "0x60963c987e0b206d400a3b2a3a0e5ec3a182f1d4b5b52bbac9c2c2b92bfab908" } }, "name": "T", @@ -282,12 +294,12 @@ Response: { { "name": "s", "type": { - "repr": "0xfc8d5ed0a9e91f3edc482b1494ad1d010721fa25b3542147604d9dc4194c5b56::m::S", + "repr": "0x7782861497fc6e7cfe33fa186e469d51323147f7c25ad0583c49d49f52da3208::m::S", "signature": { "ref": null, "body": { "datatype": { - "package": "0xfc8d5ed0a9e91f3edc482b1494ad1d010721fa25b3542147604d9dc4194c5b56", + "package": "0x7782861497fc6e7cfe33fa186e469d51323147f7c25ad0583c49d49f52da3208", "module": "m", "type": "S", "typeParameters": [] @@ -316,7 +328,7 @@ Response: { { "name": "t", "type": { - "repr": "0xfc8d5ed0a9e91f3edc482b1494ad1d010721fa25b3542147604d9dc4194c5b56::m::T<0xfc8d5ed0a9e91f3edc482b1494ad1d010721fa25b3542147604d9dc4194c5b56::m::S>" + "repr": "0x7782861497fc6e7cfe33fa186e469d51323147f7c25ad0583c49d49f52da3208::m::T<0x7782861497fc6e7cfe33fa186e469d51323147f7c25ad0583c49d49f52da3208::m::S>" } } ] @@ -324,18 +336,6 @@ Response: { } } } - }, - { - "outputState": { - "address": "0x84c38f8d9019f1e508e97d3496da69da808df7482086053358996b7679e9e8b0", - "asMovePackage": null - } - }, - { - "outputState": { - "address": "0xc69f1954c6d13e3630075f462966e06d9f05fec29846d3d781026187e5411431", - "asMovePackage": null - } } ] } @@ -356,6 +356,16 @@ Response: { "effects": { "objectChanges": { "nodes": [ + { + "outputState": { + "asMovePackage": null + } + }, + { + "outputState": { + "asMovePackage": null + } + }, { "outputState": { "asMovePackage": { @@ -375,16 +385,6 @@ Response: { } } } - }, - { - "outputState": { - "asMovePackage": null - } - }, - { - "outputState": { - "asMovePackage": null - } } ] } diff --git a/crates/iota-graphql-e2e-tests/tests/packages/structs.move b/crates/iota-graphql-e2e-tests/tests/packages/structs.move index abbe608e644..490897b2084 100644 --- a/crates/iota-graphql-e2e-tests/tests/packages/structs.move +++ b/crates/iota-graphql-e2e-tests/tests/packages/structs.move @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -//# init --protocol-version 1 --addresses P0=0x0 P1=0x0 --accounts A --simulator +//# init --protocol-version 3 --addresses P0=0x0 P1=0x0 --accounts A --simulator //# run-graphql diff --git a/crates/iota-graphql-e2e-tests/tests/packages/types.exp b/crates/iota-graphql-e2e-tests/tests/packages/types.exp index f8cbbd79690..44f9dea3c65 100644 --- a/crates/iota-graphql-e2e-tests/tests/packages/types.exp +++ b/crates/iota-graphql-e2e-tests/tests/packages/types.exp @@ -275,7 +275,7 @@ Response: { "data": null, "errors": [ { - "message": "Internal error occurred while processing request: Error calculating layout for 0xe61abd7728c5a61dbd0ee1088e5686724388708bfd5bdc55e1e546a1e4cf92fd::m::S1: Type layout nesting exceeded limit of 128", + "message": "Internal error occurred while processing request: Error calculating layout for 0xb0f5f76d189b2ca371e1ea1ea11cecbaf049dd9b7782567aff1d024e02ac6f1a::m::S1: Type layout nesting exceeded limit of 128", "locations": [ { "line": 4, diff --git a/crates/iota-graphql-e2e-tests/tests/packages/types.move b/crates/iota-graphql-e2e-tests/tests/packages/types.move index 654aeba5954..2f547fbb9c3 100644 --- a/crates/iota-graphql-e2e-tests/tests/packages/types.move +++ b/crates/iota-graphql-e2e-tests/tests/packages/types.move @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -//# init --protocol-version 1 --addresses P0=0x0 --simulator +//# init --protocol-version 3 --addresses P0=0x0 --simulator //# run-graphql # Happy path -- valid type, get everything diff --git a/crates/iota-graphql-e2e-tests/tests/packages/versioning.exp b/crates/iota-graphql-e2e-tests/tests/packages/versioning.exp index 9c380f32b9f..a4b64f00feb 100644 --- a/crates/iota-graphql-e2e-tests/tests/packages/versioning.exp +++ b/crates/iota-graphql-e2e-tests/tests/packages/versioning.exp @@ -31,14 +31,14 @@ Response: { "packageVersions": { "nodes": [ { - "address": "0xb9a97ea1dd36f9c94f0c363c663258dfe85c540c6f276d77e93421ad41bf8bcb", + "address": "0x3fb2634b6fd1f0c24c7c89776985e2713b0cab61b7f0c3bad3fa537c98b2ad8d", "version": 1 } ] } }, "firstPackage": { - "address": "0xb9a97ea1dd36f9c94f0c363c663258dfe85c540c6f276d77e93421ad41bf8bcb", + "address": "0x3fb2634b6fd1f0c24c7c89776985e2713b0cab61b7f0c3bad3fa537c98b2ad8d", "version": 1, "module": { "functions": { @@ -52,7 +52,7 @@ Response: { "packageVersions": { "nodes": [ { - "address": "0xb9a97ea1dd36f9c94f0c363c663258dfe85c540c6f276d77e93421ad41bf8bcb", + "address": "0x3fb2634b6fd1f0c24c7c89776985e2713b0cab61b7f0c3bad3fa537c98b2ad8d", "version": 1 } ] @@ -81,7 +81,7 @@ Response: { "version": 1 }, { - "address": "0xb9a97ea1dd36f9c94f0c363c663258dfe85c540c6f276d77e93421ad41bf8bcb", + "address": "0x3fb2634b6fd1f0c24c7c89776985e2713b0cab61b7f0c3bad3fa537c98b2ad8d", "version": 1 } ] @@ -120,18 +120,18 @@ Response: { "packageVersions": { "nodes": [ { - "address": "0xb9a97ea1dd36f9c94f0c363c663258dfe85c540c6f276d77e93421ad41bf8bcb", + "address": "0x3fb2634b6fd1f0c24c7c89776985e2713b0cab61b7f0c3bad3fa537c98b2ad8d", "version": 1 }, { - "address": "0x0f5c2c0da4e480bb873754b7c89ab178e2c328995b6cf89b836f08a164745acb", + "address": "0x9a446cce0055448dbf60df25fda9f0524967e073754b8273223f649199895388", "version": 2 } ] } }, "firstPackage": { - "address": "0xb9a97ea1dd36f9c94f0c363c663258dfe85c540c6f276d77e93421ad41bf8bcb", + "address": "0x3fb2634b6fd1f0c24c7c89776985e2713b0cab61b7f0c3bad3fa537c98b2ad8d", "version": 1, "module": { "functions": { @@ -145,11 +145,11 @@ Response: { "packageVersions": { "nodes": [ { - "address": "0xb9a97ea1dd36f9c94f0c363c663258dfe85c540c6f276d77e93421ad41bf8bcb", + "address": "0x3fb2634b6fd1f0c24c7c89776985e2713b0cab61b7f0c3bad3fa537c98b2ad8d", "version": 1 }, { - "address": "0x0f5c2c0da4e480bb873754b7c89ab178e2c328995b6cf89b836f08a164745acb", + "address": "0x9a446cce0055448dbf60df25fda9f0524967e073754b8273223f649199895388", "version": 2 } ] @@ -178,11 +178,11 @@ Response: { "version": 1 }, { - "address": "0xb9a97ea1dd36f9c94f0c363c663258dfe85c540c6f276d77e93421ad41bf8bcb", + "address": "0x3fb2634b6fd1f0c24c7c89776985e2713b0cab61b7f0c3bad3fa537c98b2ad8d", "version": 1 }, { - "address": "0x0f5c2c0da4e480bb873754b7c89ab178e2c328995b6cf89b836f08a164745acb", + "address": "0x9a446cce0055448dbf60df25fda9f0524967e073754b8273223f649199895388", "version": 2 } ] @@ -224,22 +224,22 @@ Response: { "packageVersions": { "nodes": [ { - "address": "0xb9a97ea1dd36f9c94f0c363c663258dfe85c540c6f276d77e93421ad41bf8bcb", + "address": "0x3fb2634b6fd1f0c24c7c89776985e2713b0cab61b7f0c3bad3fa537c98b2ad8d", "version": 1 }, { - "address": "0x0f5c2c0da4e480bb873754b7c89ab178e2c328995b6cf89b836f08a164745acb", + "address": "0x9a446cce0055448dbf60df25fda9f0524967e073754b8273223f649199895388", "version": 2 }, { - "address": "0xb4d563e260d9c18a8d6c929bb330e0dc1abfd55023e6b3e1d47524919b24e732", + "address": "0xe3d0bbdf8ce2be8a32ea519d8b62362a6e52288dfa2cb47fa7954b047b469c22", "version": 3 } ] } }, "firstPackage": { - "address": "0xb9a97ea1dd36f9c94f0c363c663258dfe85c540c6f276d77e93421ad41bf8bcb", + "address": "0x3fb2634b6fd1f0c24c7c89776985e2713b0cab61b7f0c3bad3fa537c98b2ad8d", "version": 1, "module": { "functions": { @@ -253,15 +253,15 @@ Response: { "packageVersions": { "nodes": [ { - "address": "0xb9a97ea1dd36f9c94f0c363c663258dfe85c540c6f276d77e93421ad41bf8bcb", + "address": "0x3fb2634b6fd1f0c24c7c89776985e2713b0cab61b7f0c3bad3fa537c98b2ad8d", "version": 1 }, { - "address": "0x0f5c2c0da4e480bb873754b7c89ab178e2c328995b6cf89b836f08a164745acb", + "address": "0x9a446cce0055448dbf60df25fda9f0524967e073754b8273223f649199895388", "version": 2 }, { - "address": "0xb4d563e260d9c18a8d6c929bb330e0dc1abfd55023e6b3e1d47524919b24e732", + "address": "0xe3d0bbdf8ce2be8a32ea519d8b62362a6e52288dfa2cb47fa7954b047b469c22", "version": 3 } ] @@ -290,15 +290,15 @@ Response: { "version": 1 }, { - "address": "0xb9a97ea1dd36f9c94f0c363c663258dfe85c540c6f276d77e93421ad41bf8bcb", + "address": "0x3fb2634b6fd1f0c24c7c89776985e2713b0cab61b7f0c3bad3fa537c98b2ad8d", "version": 1 }, { - "address": "0x0f5c2c0da4e480bb873754b7c89ab178e2c328995b6cf89b836f08a164745acb", + "address": "0x9a446cce0055448dbf60df25fda9f0524967e073754b8273223f649199895388", "version": 2 }, { - "address": "0xb4d563e260d9c18a8d6c929bb330e0dc1abfd55023e6b3e1d47524919b24e732", + "address": "0xe3d0bbdf8ce2be8a32ea519d8b62362a6e52288dfa2cb47fa7954b047b469c22", "version": 3 } ] @@ -715,7 +715,7 @@ Response: { "after": { "nodes": [ { - "address": "0x0f5c2c0da4e480bb873754b7c89ab178e2c328995b6cf89b836f08a164745acb", + "address": "0x9a446cce0055448dbf60df25fda9f0524967e073754b8273223f649199895388", "version": 2, "previousTransactionBlock": { "effects": { @@ -726,7 +726,7 @@ Response: { } }, { - "address": "0xb4d563e260d9c18a8d6c929bb330e0dc1abfd55023e6b3e1d47524919b24e732", + "address": "0xe3d0bbdf8ce2be8a32ea519d8b62362a6e52288dfa2cb47fa7954b047b469c22", "version": 3, "previousTransactionBlock": { "effects": { @@ -741,7 +741,7 @@ Response: { "between": { "nodes": [ { - "address": "0x0f5c2c0da4e480bb873754b7c89ab178e2c328995b6cf89b836f08a164745acb", + "address": "0x9a446cce0055448dbf60df25fda9f0524967e073754b8273223f649199895388", "version": 2, "previousTransactionBlock": { "effects": { @@ -763,15 +763,15 @@ Response: { "packageVersions": { "nodes": [ { - "address": "0xb9a97ea1dd36f9c94f0c363c663258dfe85c540c6f276d77e93421ad41bf8bcb", + "address": "0x3fb2634b6fd1f0c24c7c89776985e2713b0cab61b7f0c3bad3fa537c98b2ad8d", "version": 1 }, { - "address": "0x0f5c2c0da4e480bb873754b7c89ab178e2c328995b6cf89b836f08a164745acb", + "address": "0x9a446cce0055448dbf60df25fda9f0524967e073754b8273223f649199895388", "version": 2 }, { - "address": "0xb4d563e260d9c18a8d6c929bb330e0dc1abfd55023e6b3e1d47524919b24e732", + "address": "0xe3d0bbdf8ce2be8a32ea519d8b62362a6e52288dfa2cb47fa7954b047b469c22", "version": 3 } ] @@ -779,11 +779,11 @@ Response: { "after": { "nodes": [ { - "address": "0x0f5c2c0da4e480bb873754b7c89ab178e2c328995b6cf89b836f08a164745acb", + "address": "0x9a446cce0055448dbf60df25fda9f0524967e073754b8273223f649199895388", "version": 2 }, { - "address": "0xb4d563e260d9c18a8d6c929bb330e0dc1abfd55023e6b3e1d47524919b24e732", + "address": "0xe3d0bbdf8ce2be8a32ea519d8b62362a6e52288dfa2cb47fa7954b047b469c22", "version": 3 } ] @@ -791,11 +791,11 @@ Response: { "before": { "nodes": [ { - "address": "0xb9a97ea1dd36f9c94f0c363c663258dfe85c540c6f276d77e93421ad41bf8bcb", + "address": "0x3fb2634b6fd1f0c24c7c89776985e2713b0cab61b7f0c3bad3fa537c98b2ad8d", "version": 1 }, { - "address": "0x0f5c2c0da4e480bb873754b7c89ab178e2c328995b6cf89b836f08a164745acb", + "address": "0x9a446cce0055448dbf60df25fda9f0524967e073754b8273223f649199895388", "version": 2 } ] @@ -803,7 +803,7 @@ Response: { "between": { "nodes": [ { - "address": "0x0f5c2c0da4e480bb873754b7c89ab178e2c328995b6cf89b836f08a164745acb", + "address": "0x9a446cce0055448dbf60df25fda9f0524967e073754b8273223f649199895388", "version": 2 } ] diff --git a/crates/iota-graphql-e2e-tests/tests/packages/versioning.move b/crates/iota-graphql-e2e-tests/tests/packages/versioning.move index 21c88bce38e..02cd7c5e802 100644 --- a/crates/iota-graphql-e2e-tests/tests/packages/versioning.move +++ b/crates/iota-graphql-e2e-tests/tests/packages/versioning.move @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -//# init --protocol-version 1 --addresses P0=0x0 P1=0x0 P2=0x0 --accounts A --simulator +//# init --protocol-version 3 --addresses P0=0x0 P1=0x0 P2=0x0 --accounts A --simulator //# publish --upgradeable --sender A module P0::m { diff --git a/crates/iota-graphql-e2e-tests/tests/transaction_block_effects/balance_changes.exp b/crates/iota-graphql-e2e-tests/tests/transaction_block_effects/balance_changes.exp index 397cfbbfa29..1f7fe20f748 100644 --- a/crates/iota-graphql-e2e-tests/tests/transaction_block_effects/balance_changes.exp +++ b/crates/iota-graphql-e2e-tests/tests/transaction_block_effects/balance_changes.exp @@ -48,7 +48,7 @@ Response: { "edges": [ { "node": { - "amount": "3000" + "amount": "5000" }, "cursor": "eyJpIjowLCJjIjoyfQ" }, @@ -66,19 +66,19 @@ Response: { }, { "node": { - "amount": "5000" + "amount": "3000" }, "cursor": "eyJpIjozLCJjIjoyfQ" }, { "node": { - "amount": "2000" + "amount": "4000" }, "cursor": "eyJpIjo0LCJjIjoyfQ" }, { "node": { - "amount": "4000" + "amount": "2000" }, "cursor": "eyJpIjo1LCJjIjoyfQ" } @@ -111,13 +111,13 @@ Response: { "edges": [ { "node": { - "amount": "5000" + "amount": "3000" }, "cursor": "eyJpIjozLCJjIjoxfQ" }, { "node": { - "amount": "2000" + "amount": "4000" }, "cursor": "eyJpIjo0LCJjIjoxfQ" } @@ -150,7 +150,7 @@ Response: { "edges": [ { "node": { - "amount": "3000" + "amount": "5000" }, "cursor": "eyJpIjowLCJjIjoxfQ" }, diff --git a/crates/iota-graphql-e2e-tests/tests/transaction_block_effects/balance_changes.move b/crates/iota-graphql-e2e-tests/tests/transaction_block_effects/balance_changes.move index 1b4157401ca..a769cc47a93 100644 --- a/crates/iota-graphql-e2e-tests/tests/transaction_block_effects/balance_changes.move +++ b/crates/iota-graphql-e2e-tests/tests/transaction_block_effects/balance_changes.move @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -//# init --protocol-version 1 --simulator --accounts C O P Q R S +//# init --protocol-version 3 --simulator --accounts C O P Q R S //# programmable --sender C --inputs @C 1000 2000 3000 4000 5000 //> SplitCoins(Gas, [Input(1), Input(2), Input(3), Input(4), Input(5)]); diff --git a/crates/iota-graphql-e2e-tests/tests/transaction_block_effects/dependencies.exp b/crates/iota-graphql-e2e-tests/tests/transaction_block_effects/dependencies.exp index 2419d46d870..e9d9840d7af 100644 --- a/crates/iota-graphql-e2e-tests/tests/transaction_block_effects/dependencies.exp +++ b/crates/iota-graphql-e2e-tests/tests/transaction_block_effects/dependencies.exp @@ -65,7 +65,7 @@ Response: { "transactionBlocks": { "nodes": [ { - "digest": "Nj6ihexZgq92WRmwPhTFoHW5LqE8YKDYgBNj6uRve5S", + "digest": "6b1Kn6ooPLtqbcHyoHYneKUFwZ8Y2vgfwxnzYVscb3jx", "effects": { "dependencies": { "pageInfo": { @@ -78,26 +78,15 @@ Response: { { "cursor": "eyJpIjowLCJjIjoxfQ", "node": { - "digest": "5vV7Am92rPPM9VLDV2oqA6SzNTrMLt8V3yiCkWGYeYtb", + "digest": "CmL9WCz3trGP76o155Yi4nyAB3wVpxyLPnDbPu6jkeXQ", "kind": { "__typename": "ProgrammableTransactionBlock", "transactions": { "nodes": [ + {}, { - "module": "M1", - "functionName": "sum" - }, - { - "module": "M1", - "functionName": "sum" - }, - { - "module": "M1", - "functionName": "sum" - }, - { - "module": "M1", - "functionName": "create" + "module": "package", + "functionName": "make_immutable" } ] } @@ -107,15 +96,26 @@ Response: { { "cursor": "eyJpIjoxLCJjIjoxfQ", "node": { - "digest": "7DzPqWyTbh35vX6NZriBXftsRotmqRueMd7uib8VBrFt", + "digest": "E79gYn9CMr8F2TFJ5KjFsL6xLKTexVXz9Y1VQSecm9ap", "kind": { "__typename": "ProgrammableTransactionBlock", "transactions": { "nodes": [ - {}, { - "module": "package", - "functionName": "make_immutable" + "module": "M1", + "functionName": "sum" + }, + { + "module": "M1", + "functionName": "sum" + }, + { + "module": "M1", + "functionName": "sum" + }, + { + "module": "M1", + "functionName": "create" } ] } @@ -138,7 +138,7 @@ Response: { "transactionBlocks": { "nodes": [ { - "digest": "Nj6ihexZgq92WRmwPhTFoHW5LqE8YKDYgBNj6uRve5S", + "digest": "6b1Kn6ooPLtqbcHyoHYneKUFwZ8Y2vgfwxnzYVscb3jx", "effects": { "dependencies": { "pageInfo": { @@ -151,15 +151,26 @@ Response: { { "cursor": "eyJpIjoxLCJjIjoxfQ", "node": { - "digest": "7DzPqWyTbh35vX6NZriBXftsRotmqRueMd7uib8VBrFt", + "digest": "E79gYn9CMr8F2TFJ5KjFsL6xLKTexVXz9Y1VQSecm9ap", "kind": { "__typename": "ProgrammableTransactionBlock", "transactions": { "nodes": [ - {}, { - "module": "package", - "functionName": "make_immutable" + "module": "M1", + "functionName": "sum" + }, + { + "module": "M1", + "functionName": "sum" + }, + { + "module": "M1", + "functionName": "sum" + }, + { + "module": "M1", + "functionName": "create" } ] } diff --git a/crates/iota-graphql-e2e-tests/tests/transaction_block_effects/dependencies.move b/crates/iota-graphql-e2e-tests/tests/transaction_block_effects/dependencies.move index 2c880894ee6..12304eb3052 100644 --- a/crates/iota-graphql-e2e-tests/tests/transaction_block_effects/dependencies.move +++ b/crates/iota-graphql-e2e-tests/tests/transaction_block_effects/dependencies.move @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -//# init --protocol-version 1 --addresses Test=0x0 --accounts A --simulator +//# init --protocol-version 3 --addresses Test=0x0 --accounts A --simulator //# publish module Test::M1 { diff --git a/crates/iota-graphql-e2e-tests/tests/transaction_block_effects/events.move b/crates/iota-graphql-e2e-tests/tests/transaction_block_effects/events.move index 3561024bf53..0ebbb8ee5ec 100644 --- a/crates/iota-graphql-e2e-tests/tests/transaction_block_effects/events.move +++ b/crates/iota-graphql-e2e-tests/tests/transaction_block_effects/events.move @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -//# init --protocol-version 1 --addresses Test=0x0 --accounts A --simulator +//# init --protocol-version 3 --addresses Test=0x0 --accounts A --simulator //# publish module Test::M1 { diff --git a/crates/iota-graphql-e2e-tests/tests/transaction_block_effects/object_changes.move b/crates/iota-graphql-e2e-tests/tests/transaction_block_effects/object_changes.move index fb1adec95d0..6953a8c0e4a 100644 --- a/crates/iota-graphql-e2e-tests/tests/transaction_block_effects/object_changes.move +++ b/crates/iota-graphql-e2e-tests/tests/transaction_block_effects/object_changes.move @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -//# init --protocol-version 1 --addresses Test=0x0 A=0x42 --simulator --custom-validator-account --reference-gas-price 234 --default-gas-price 1000 +//# init --protocol-version 3 --addresses Test=0x0 A=0x42 --simulator --custom-validator-account --reference-gas-price 234 --default-gas-price 1000 //# publish module Test::M1 { diff --git a/crates/iota-graphql-e2e-tests/tests/transactions/at_checkpoint.exp b/crates/iota-graphql-e2e-tests/tests/transactions/at_checkpoint.exp index 3bafc470eb3..a1a493ba525 100644 --- a/crates/iota-graphql-e2e-tests/tests/transactions/at_checkpoint.exp +++ b/crates/iota-graphql-e2e-tests/tests/transactions/at_checkpoint.exp @@ -30,7 +30,7 @@ Response: { "c0": { "nodes": [ { - "digest": "Bg37EsAT4gAL589upKSw92NUKGpxHk1ejmfkUoXdJzMo", + "digest": "HMpUemPGq81ZKbabWFBBberZ97ZQzZyd2ufocFpgaKxF", "kind": { "__typename": "GenesisTransaction" } @@ -46,7 +46,7 @@ Response: { } }, { - "digest": "973SQ6oCuqnAVPYxHBfki8ZbCj1fNLjoakbS3VjvTaPa", + "digest": "77LwCSZqEqoXZdYW5eAP1Zowenc5uFiXNUroLQqre8qW", "kind": { "__typename": "ProgrammableTransactionBlock" } @@ -87,7 +87,7 @@ Response: { "transactionBlocks": { "nodes": [ { - "digest": "Bg37EsAT4gAL589upKSw92NUKGpxHk1ejmfkUoXdJzMo", + "digest": "HMpUemPGq81ZKbabWFBBberZ97ZQzZyd2ufocFpgaKxF", "kind": { "__typename": "GenesisTransaction" } @@ -105,7 +105,7 @@ Response: { } }, { - "digest": "973SQ6oCuqnAVPYxHBfki8ZbCj1fNLjoakbS3VjvTaPa", + "digest": "77LwCSZqEqoXZdYW5eAP1Zowenc5uFiXNUroLQqre8qW", "kind": { "__typename": "ProgrammableTransactionBlock" } @@ -154,7 +154,7 @@ Response: { "transactionBlocks": { "nodes": [ { - "digest": "Bg37EsAT4gAL589upKSw92NUKGpxHk1ejmfkUoXdJzMo", + "digest": "HMpUemPGq81ZKbabWFBBberZ97ZQzZyd2ufocFpgaKxF", "kind": { "__typename": "GenesisTransaction" } @@ -172,7 +172,7 @@ Response: { } }, { - "digest": "973SQ6oCuqnAVPYxHBfki8ZbCj1fNLjoakbS3VjvTaPa", + "digest": "77LwCSZqEqoXZdYW5eAP1Zowenc5uFiXNUroLQqre8qW", "kind": { "__typename": "ProgrammableTransactionBlock" } diff --git a/crates/iota-graphql-e2e-tests/tests/transactions/at_checkpoint.move b/crates/iota-graphql-e2e-tests/tests/transactions/at_checkpoint.move index ff2dd79fa5f..7bce26d1d5b 100644 --- a/crates/iota-graphql-e2e-tests/tests/transactions/at_checkpoint.move +++ b/crates/iota-graphql-e2e-tests/tests/transactions/at_checkpoint.move @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -//# init --protocol-version 1 --accounts A --simulator +//# init --protocol-version 3 --accounts A --simulator // Limiting transactions by the checkpoint they are in diff --git a/crates/iota-graphql-e2e-tests/tests/transactions/errors.exp b/crates/iota-graphql-e2e-tests/tests/transactions/errors.exp index 5515b71fcc6..3a13572bcc0 100644 --- a/crates/iota-graphql-e2e-tests/tests/transactions/errors.exp +++ b/crates/iota-graphql-e2e-tests/tests/transactions/errors.exp @@ -25,7 +25,7 @@ Response: { { "effects": { "status": "FAILURE", - "errors": "Error in 1st command, from '0xb7d000e6ce024756ce5f7f7a50dc9ab34f9727d72b0ff528917b08087360bfed::m::boom' (instruction 1), abort code: 42" + "errors": "Error in 1st command, from '0x29bf31ca5680f5b89f41d9b5fac1c4bed644aa6a4d2ce5816ad0a97457204726::m::boom' (instruction 1), abort code: 42" } } ] @@ -54,7 +54,7 @@ Response: { { "effects": { "status": "FAILURE", - "errors": "Error in 3rd command, from '0xb7d000e6ce024756ce5f7f7a50dc9ab34f9727d72b0ff528917b08087360bfed::m::boom' (instruction 1), abort code: 42" + "errors": "Error in 3rd command, from '0x29bf31ca5680f5b89f41d9b5fac1c4bed644aa6a4d2ce5816ad0a97457204726::m::boom' (instruction 1), abort code: 42" } } ] diff --git a/crates/iota-graphql-e2e-tests/tests/transactions/errors.move b/crates/iota-graphql-e2e-tests/tests/transactions/errors.move index af45de174f4..3ff8e57c1f1 100644 --- a/crates/iota-graphql-e2e-tests/tests/transactions/errors.move +++ b/crates/iota-graphql-e2e-tests/tests/transactions/errors.move @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -//# init --protocol-version 1 --addresses P0=0x0 --simulator +//# init --protocol-version 3 --addresses P0=0x0 --simulator //# publish diff --git a/crates/iota-graphql-e2e-tests/tests/transactions/filters/kind.exp b/crates/iota-graphql-e2e-tests/tests/transactions/filters/kind.exp index ddb946f16fd..69c0ae28be8 100644 --- a/crates/iota-graphql-e2e-tests/tests/transactions/filters/kind.exp +++ b/crates/iota-graphql-e2e-tests/tests/transactions/filters/kind.exp @@ -60,7 +60,7 @@ Response: { }, "nodes": [ { - "digest": "DyfoVXSwG2QBCqLzozzoUBpcBzMtyqbeqxtrx16kKJ75", + "digest": "9KeLUgtFqgMkY9xSS3urrrzwNQcf2HKP4P7wjxauQANh", "effects": { "checkpoint": { "sequenceNumber": 2 @@ -68,7 +68,7 @@ Response: { } }, { - "digest": "7aGyUPRRVEVDWCLuAhY56ZW8BrkWqkRhVo1jG2zbFdJw", + "digest": "4qdp62pQtjfoWHvNLQUXEsKyVEg85kEr2WRyQDoa5UKh", "effects": { "checkpoint": { "sequenceNumber": 2 @@ -76,7 +76,7 @@ Response: { } }, { - "digest": "64FRv4LtnfGQ5fSQ3VsFmVdCyhU3Fm5rpsb3aYmEAwP4", + "digest": "C414Xw6dcKm2Wx1J7AeWmut3a5XQ33zuQWf4KdVwqyUF", "effects": { "checkpoint": { "sequenceNumber": 2 @@ -84,7 +84,7 @@ Response: { } }, { - "digest": "EQHDejPTtkNQUbqmNrcyruptdePpxhBXoWxkrZJ1eS7r", + "digest": "8vA9JdWS1h1LEeHt494QPnhfxZdrS4nWYHLVmkJh49D6", "effects": { "checkpoint": { "sequenceNumber": 2 @@ -92,7 +92,7 @@ Response: { } }, { - "digest": "GikQy5k3EytSDpKEdQLLzXyZmpzCAejQPyiBJJLJ8az4", + "digest": "FTLi7hzMz8uwbUvUJexJmbA4V4sKUc2XmM7sDcM9YYwd", "effects": { "checkpoint": { "sequenceNumber": 2 @@ -117,7 +117,7 @@ Response: { }, "nodes": [ { - "digest": "DyfoVXSwG2QBCqLzozzoUBpcBzMtyqbeqxtrx16kKJ75", + "digest": "9KeLUgtFqgMkY9xSS3urrrzwNQcf2HKP4P7wjxauQANh", "effects": { "checkpoint": { "sequenceNumber": 2 @@ -142,7 +142,7 @@ Response: { }, "nodes": [ { - "digest": "7aGyUPRRVEVDWCLuAhY56ZW8BrkWqkRhVo1jG2zbFdJw", + "digest": "4qdp62pQtjfoWHvNLQUXEsKyVEg85kEr2WRyQDoa5UKh", "effects": { "checkpoint": { "sequenceNumber": 2 @@ -167,7 +167,7 @@ Response: { }, "nodes": [ { - "digest": "64FRv4LtnfGQ5fSQ3VsFmVdCyhU3Fm5rpsb3aYmEAwP4", + "digest": "C414Xw6dcKm2Wx1J7AeWmut3a5XQ33zuQWf4KdVwqyUF", "effects": { "checkpoint": { "sequenceNumber": 2 @@ -192,7 +192,7 @@ Response: { }, "nodes": [ { - "digest": "EQHDejPTtkNQUbqmNrcyruptdePpxhBXoWxkrZJ1eS7r", + "digest": "8vA9JdWS1h1LEeHt494QPnhfxZdrS4nWYHLVmkJh49D6", "effects": { "checkpoint": { "sequenceNumber": 2 @@ -217,7 +217,7 @@ Response: { }, "nodes": [ { - "digest": "GikQy5k3EytSDpKEdQLLzXyZmpzCAejQPyiBJJLJ8az4", + "digest": "FTLi7hzMz8uwbUvUJexJmbA4V4sKUc2XmM7sDcM9YYwd", "effects": { "checkpoint": { "sequenceNumber": 2 diff --git a/crates/iota-graphql-e2e-tests/tests/transactions/filters/kind.move b/crates/iota-graphql-e2e-tests/tests/transactions/filters/kind.move index f93b8bc6345..99daec6dc4c 100644 --- a/crates/iota-graphql-e2e-tests/tests/transactions/filters/kind.move +++ b/crates/iota-graphql-e2e-tests/tests/transactions/filters/kind.move @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -//# init --protocol-version 1 --addresses Test=0x0 --accounts A B C D E --simulator +//# init --protocol-version 3 --addresses Test=0x0 --accounts A B C D E --simulator //# publish module Test::M1 { diff --git a/crates/iota-graphql-e2e-tests/tests/transactions/filters/transaction_ids.move b/crates/iota-graphql-e2e-tests/tests/transactions/filters/transaction_ids.move index 230fd6afb29..996d3a3ea7d 100644 --- a/crates/iota-graphql-e2e-tests/tests/transactions/filters/transaction_ids.move +++ b/crates/iota-graphql-e2e-tests/tests/transactions/filters/transaction_ids.move @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -//# init --protocol-version 1 --addresses Test=0x0 --accounts A --simulator +//# init --protocol-version 3 --addresses Test=0x0 --accounts A --simulator //# publish module Test::M1 { diff --git a/crates/iota-graphql-e2e-tests/tests/transactions/programmable.exp b/crates/iota-graphql-e2e-tests/tests/transactions/programmable.exp index ece5d01d0ae..466778a4d77 100644 --- a/crates/iota-graphql-e2e-tests/tests/transactions/programmable.exp +++ b/crates/iota-graphql-e2e-tests/tests/transactions/programmable.exp @@ -20,12 +20,12 @@ Response: { "transactionBlocks": { "nodes": [ { - "digest": "tvDgE7mmbtwGC6Kg1tyUptAZyjVxSxCpLPYmSSv7tLe", + "digest": "DStVeow9xBNhy4nZWSiMP4WZGsNaNFZQhWUzPHGnynyo", "sender": { "address": "0x8cca4e1ce0ba5904cea61df9242da2f7d29e3ef328fb7ec07c086b3bf47ca61a" }, "signatures": [ - "ABKf28j4W1zD01A94qW7ugvONKCQo3SWIeU025zhQFzKq5EI7FvY8fKAnxBlFfRM0SBj9V0+F5xflied0rGECQJ/UUY663bYjcm3XmNyULIgxJz1t5Z9vxfB+fp8WUoJKA==" + "ACWH/ZLI0uFUs4vyM4EJzhNIis0YFhMKDXsnOs0nUaywj7aPjj0udDW6A6IbAaJDeDsr9qrR6ZtcLNT5amXATgJ/UUY663bYjcm3XmNyULIgxJz1t5Z9vxfB+fp8WUoJKA==" ], "gasInput": { "gasSponsor": { @@ -34,7 +34,7 @@ Response: { "gasPayment": { "nodes": [ { - "address": "0xc69f1954c6d13e3630075f462966e06d9f05fec29846d3d781026187e5411431" + "address": "0x18a5cb688685554c4b370c3f551466dba6fb25390920fa5836812a9fb66500c4" } ] }, @@ -96,7 +96,7 @@ Response: { "dependencies": { "nodes": [ { - "digest": "Bg37EsAT4gAL589upKSw92NUKGpxHk1ejmfkUoXdJzMo" + "digest": "HMpUemPGq81ZKbabWFBBberZ97ZQzZyd2ufocFpgaKxF" } ] }, @@ -116,37 +116,37 @@ Response: { "objectChanges": { "nodes": [ { - "address": "0x1b0961cd4993fc5cdc89e30b433a4de9cde01b12e15c8e2fb88754d653992822", - "idCreated": true, + "address": "0x18a5cb688685554c4b370c3f551466dba6fb25390920fa5836812a9fb66500c4", + "idCreated": false, "idDeleted": false, "outputState": { - "address": "0x1b0961cd4993fc5cdc89e30b433a4de9cde01b12e15c8e2fb88754d653992822", - "digest": "6C9ZpyBYqwBB1xzcMkoSmGybPA7FsStqMHgW6zEo1Snm" + "address": "0x18a5cb688685554c4b370c3f551466dba6fb25390920fa5836812a9fb66500c4", + "digest": "9et93fzXWULZboG1jbmPUY4Pjy5fdzYkXbZ2Tk3fff3Q" } }, { - "address": "0xc69f1954c6d13e3630075f462966e06d9f05fec29846d3d781026187e5411431", - "idCreated": false, + "address": "0xa76aca10126d5d229060b1363c338e695a191c318bbbf54007151d6918134d65", + "idCreated": true, "idDeleted": false, "outputState": { - "address": "0xc69f1954c6d13e3630075f462966e06d9f05fec29846d3d781026187e5411431", - "digest": "CpcjnZm8q5CZHgyAGAAQM6HaTcKtPiEUv7wBk44gpCh9" + "address": "0xa76aca10126d5d229060b1363c338e695a191c318bbbf54007151d6918134d65", + "digest": "2dSPbPpCYNgxAwhN35rNfZveTSjKRJiS7ndDWm3AsuRd" } }, { - "address": "0xfb3eadec34edec1ac979b6f1752b399ddc68480ffc15dcbe7163b0acc89c548e", + "address": "0xfa4b58cc517cbb110c3ff16e66b45e273d0d9c63ef70c5e7981a74b505136c1c", "idCreated": true, "idDeleted": false, "outputState": { - "address": "0xfb3eadec34edec1ac979b6f1752b399ddc68480ffc15dcbe7163b0acc89c548e", - "digest": "Eq9cwQBnFuUphwJmmkJnzMKdSDMG7TejrjjRbm8Pxrxk" + "address": "0xfa4b58cc517cbb110c3ff16e66b45e273d0d9c63ef70c5e7981a74b505136c1c", + "digest": "6SGX3tGkm1Mwo6XTCqAEyubcGgkfqvmqXYMq8XTxT5vu" } } ] }, "gasEffects": { "gasObject": { - "address": "0xc69f1954c6d13e3630075f462966e06d9f05fec29846d3d781026187e5411431" + "address": "0x18a5cb688685554c4b370c3f551466dba6fb25390920fa5836812a9fb66500c4" }, "gasSummary": { "computationCost": "1000000", @@ -163,7 +163,7 @@ Response: { "sequenceNumber": 1 }, "transactionBlock": { - "digest": "tvDgE7mmbtwGC6Kg1tyUptAZyjVxSxCpLPYmSSv7tLe" + "digest": "DStVeow9xBNhy4nZWSiMP4WZGsNaNFZQhWUzPHGnynyo" } }, "expiration": null @@ -190,12 +190,12 @@ Response: { "transactionBlocks": { "nodes": [ { - "digest": "JCZvDpBa2RK5ypkUY5bwY2nTpTCpHUCc8DEz62B8nzL", + "digest": "AgriF36Cqis1HgoJTfpiCufw2R3cadyZaXqJiqWDhLzL", "sender": { "address": "0x8cca4e1ce0ba5904cea61df9242da2f7d29e3ef328fb7ec07c086b3bf47ca61a" }, "signatures": [ - "AATfZcSufT+0WT8TPvA21GyB7SWGr4L84+OZDLnfNILU446/Y4FUXZRfA8ZAlK83T23HuTDJM51bvufBlH3LJg1/UUY663bYjcm3XmNyULIgxJz1t5Z9vxfB+fp8WUoJKA==" + "AAYhpMoy694z8sKoB9lcxyPQqdxC9/T2Qe5F93FMA5HmjXHjn3drH+xngIIMqxWsqulu9VXnV300w+C7L7+IjA5/UUY663bYjcm3XmNyULIgxJz1t5Z9vxfB+fp8WUoJKA==" ], "gasInput": { "gasSponsor": { @@ -204,7 +204,7 @@ Response: { "gasPayment": { "nodes": [ { - "address": "0xc69f1954c6d13e3630075f462966e06d9f05fec29846d3d781026187e5411431" + "address": "0x18a5cb688685554c4b370c3f551466dba6fb25390920fa5836812a9fb66500c4" } ] }, @@ -219,21 +219,21 @@ Response: { "cursor": "eyJpIjowLCJjIjoyfQ", "node": { "__typename": "OwnedOrImmutable", - "address": "0xfb3eadec34edec1ac979b6f1752b399ddc68480ffc15dcbe7163b0acc89c548e", + "address": "0xfa4b58cc517cbb110c3ff16e66b45e273d0d9c63ef70c5e7981a74b505136c1c", "version": 2, - "digest": "Eq9cwQBnFuUphwJmmkJnzMKdSDMG7TejrjjRbm8Pxrxk", + "digest": "6SGX3tGkm1Mwo6XTCqAEyubcGgkfqvmqXYMq8XTxT5vu", "object": { - "address": "0xfb3eadec34edec1ac979b6f1752b399ddc68480ffc15dcbe7163b0acc89c548e", + "address": "0xfa4b58cc517cbb110c3ff16e66b45e273d0d9c63ef70c5e7981a74b505136c1c", "version": 2, - "digest": "Eq9cwQBnFuUphwJmmkJnzMKdSDMG7TejrjjRbm8Pxrxk", + "digest": "6SGX3tGkm1Mwo6XTCqAEyubcGgkfqvmqXYMq8XTxT5vu", "asMoveObject": { "contents": { "type": { "repr": "0x0000000000000000000000000000000000000000000000000000000000000002::package::UpgradeCap" }, "json": { - "id": "0xfb3eadec34edec1ac979b6f1752b399ddc68480ffc15dcbe7163b0acc89c548e", - "package": "0x1b0961cd4993fc5cdc89e30b433a4de9cde01b12e15c8e2fb88754d653992822", + "id": "0xfa4b58cc517cbb110c3ff16e66b45e273d0d9c63ef70c5e7981a74b505136c1c", + "package": "0xa76aca10126d5d229060b1363c338e695a191c318bbbf54007151d6918134d65", "version": "1", "policy": 0 } @@ -315,7 +315,7 @@ Response: { "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000002" ], - "currentPackage": "0x1b0961cd4993fc5cdc89e30b433a4de9cde01b12e15c8e2fb88754d653992822", + "currentPackage": "0xa76aca10126d5d229060b1363c338e695a191c318bbbf54007151d6918134d65", "upgradeTicket": { "__typename": "Result", "cmd": 0, @@ -367,10 +367,10 @@ Response: { "dependencies": { "nodes": [ { - "digest": "tvDgE7mmbtwGC6Kg1tyUptAZyjVxSxCpLPYmSSv7tLe" + "digest": "DStVeow9xBNhy4nZWSiMP4WZGsNaNFZQhWUzPHGnynyo" }, { - "digest": "Bg37EsAT4gAL589upKSw92NUKGpxHk1ejmfkUoXdJzMo" + "digest": "HMpUemPGq81ZKbabWFBBberZ97ZQzZyd2ufocFpgaKxF" } ] }, @@ -390,37 +390,37 @@ Response: { "objectChanges": { "nodes": [ { - "address": "0xc4d534b3b62e9e99d3b8a20abc757dccfc3b7a32f6fff8e47cf8cf1cd906cf64", - "idCreated": true, + "address": "0x18a5cb688685554c4b370c3f551466dba6fb25390920fa5836812a9fb66500c4", + "idCreated": false, "idDeleted": false, "outputState": { - "address": "0xc4d534b3b62e9e99d3b8a20abc757dccfc3b7a32f6fff8e47cf8cf1cd906cf64", - "digest": "2NMQpbTkNrUxaTApQHYhN8z4jJj9bs8DFC4g7Pb5psoP" + "address": "0x18a5cb688685554c4b370c3f551466dba6fb25390920fa5836812a9fb66500c4", + "digest": "8c2bwMXrgv7wXFLN16zvdAdzsUffBb5UmP1cyfzswLu6" } }, { - "address": "0xc69f1954c6d13e3630075f462966e06d9f05fec29846d3d781026187e5411431", - "idCreated": false, + "address": "0x92307478b83faee47dae9846622016f8c5d86bec5d72333b5d75c739b986c025", + "idCreated": true, "idDeleted": false, "outputState": { - "address": "0xc69f1954c6d13e3630075f462966e06d9f05fec29846d3d781026187e5411431", - "digest": "HSn5KHX97NhZi1ovsPZQbRgYdfYnTwmE6aamc6o2bxYq" + "address": "0x92307478b83faee47dae9846622016f8c5d86bec5d72333b5d75c739b986c025", + "digest": "RnXt4c1zEop2mo3eGaCVVYqJmNBvXLSsa5cozxAnnWY" } }, { - "address": "0xfb3eadec34edec1ac979b6f1752b399ddc68480ffc15dcbe7163b0acc89c548e", + "address": "0xfa4b58cc517cbb110c3ff16e66b45e273d0d9c63ef70c5e7981a74b505136c1c", "idCreated": false, "idDeleted": false, "outputState": { - "address": "0xfb3eadec34edec1ac979b6f1752b399ddc68480ffc15dcbe7163b0acc89c548e", - "digest": "HH96DACodGczUapLY4eCrByvdAzg5iadrjtadPtj6EXw" + "address": "0xfa4b58cc517cbb110c3ff16e66b45e273d0d9c63ef70c5e7981a74b505136c1c", + "digest": "D6bV2KX6nqdty574rDYjKoigVfDB7UUPGqd4mCLV4WXD" } } ] }, "gasEffects": { "gasObject": { - "address": "0xc69f1954c6d13e3630075f462966e06d9f05fec29846d3d781026187e5411431" + "address": "0x18a5cb688685554c4b370c3f551466dba6fb25390920fa5836812a9fb66500c4" }, "gasSummary": { "computationCost": "1000000", @@ -437,7 +437,7 @@ Response: { "sequenceNumber": 2 }, "transactionBlock": { - "digest": "JCZvDpBa2RK5ypkUY5bwY2nTpTCpHUCc8DEz62B8nzL" + "digest": "AgriF36Cqis1HgoJTfpiCufw2R3cadyZaXqJiqWDhLzL" } }, "expiration": null @@ -482,12 +482,12 @@ Response: { "transactionBlocks": { "nodes": [ { - "digest": "FiPjt6NaBmwTXNSQJDPvTEfwoWJQ1tfpe8P87ajeKfn4", + "digest": "72hb62Xx8UCvvfvsDpQntCUnr9EGFPHUVohx8YpN5iGS", "sender": { "address": "0x8cca4e1ce0ba5904cea61df9242da2f7d29e3ef328fb7ec07c086b3bf47ca61a" }, "signatures": [ - "AImFtPn31VRGRTd3pkm8Ho2hfbGtkyJHUyPyDFPCw5wSYbc4DK0zM2CfP4znyyquxSTZrkbhdc68v6DBVrGc0wN/UUY663bYjcm3XmNyULIgxJz1t5Z9vxfB+fp8WUoJKA==" + "AME48u1BDowW3Jv0BjdpKnIe1a7m2cGL5B4Ig7E25EQ0FoH+8jF4k6qzPHTn9+Et1gbTLBJ9MAE2JWPmbhHaEAV/UUY663bYjcm3XmNyULIgxJz1t5Z9vxfB+fp8WUoJKA==" ], "gasInput": { "gasSponsor": { @@ -496,7 +496,7 @@ Response: { "gasPayment": { "nodes": [ { - "address": "0xc69f1954c6d13e3630075f462966e06d9f05fec29846d3d781026187e5411431" + "address": "0x18a5cb688685554c4b370c3f551466dba6fb25390920fa5836812a9fb66500c4" } ] }, @@ -591,7 +591,7 @@ Response: { "cursor": "eyJpIjozLCJjIjozfQ", "node": { "__typename": "MoveCallTransaction", - "package": "0xc4d534b3b62e9e99d3b8a20abc757dccfc3b7a32f6fff8e47cf8cf1cd906cf64", + "package": "0x92307478b83faee47dae9846622016f8c5d86bec5d72333b5d75c739b986c025", "module": "m", "functionName": "new", "typeArguments": [], @@ -615,7 +615,7 @@ Response: { ], "return": [ { - "repr": "0x1b0961cd4993fc5cdc89e30b433a4de9cde01b12e15c8e2fb88754d653992822::m::Foo" + "repr": "0xa76aca10126d5d229060b1363c338e695a191c318bbbf54007151d6918134d65::m::Foo" } ] } @@ -642,7 +642,7 @@ Response: { "cursor": "eyJpIjo1LCJjIjozfQ", "node": { "__typename": "MoveCallTransaction", - "package": "0xc4d534b3b62e9e99d3b8a20abc757dccfc3b7a32f6fff8e47cf8cf1cd906cf64", + "package": "0x92307478b83faee47dae9846622016f8c5d86bec5d72333b5d75c739b986c025", "module": "m", "functionName": "new", "typeArguments": [], @@ -666,7 +666,7 @@ Response: { ], "return": [ { - "repr": "0x1b0961cd4993fc5cdc89e30b433a4de9cde01b12e15c8e2fb88754d653992822::m::Foo" + "repr": "0xa76aca10126d5d229060b1363c338e695a191c318bbbf54007151d6918134d65::m::Foo" } ] } @@ -676,7 +676,7 @@ Response: { "cursor": "eyJpIjo2LCJjIjozfQ", "node": { "__typename": "MoveCallTransaction", - "package": "0xc4d534b3b62e9e99d3b8a20abc757dccfc3b7a32f6fff8e47cf8cf1cd906cf64", + "package": "0x92307478b83faee47dae9846622016f8c5d86bec5d72333b5d75c739b986c025", "module": "m", "functionName": "burn", "typeArguments": [], @@ -692,7 +692,7 @@ Response: { "typeParameters": [], "parameters": [ { - "repr": "0x1b0961cd4993fc5cdc89e30b433a4de9cde01b12e15c8e2fb88754d653992822::m::Foo" + "repr": "0xa76aca10126d5d229060b1363c338e695a191c318bbbf54007151d6918134d65::m::Foo" } ], "return": [] @@ -744,10 +744,10 @@ Response: { "dependencies": { "nodes": [ { - "digest": "JCZvDpBa2RK5ypkUY5bwY2nTpTCpHUCc8DEz62B8nzL" + "digest": "8yToACVC5ZQqVbjeTvjwSMugbuw1gBbngHmVcJiy6Wfh" }, { - "digest": "GhnCeKNzadasPxvEHpaNqHYrBn72Ge9vYoFU3h4tAeBv" + "digest": "AgriF36Cqis1HgoJTfpiCufw2R3cadyZaXqJiqWDhLzL" } ] }, @@ -767,19 +767,19 @@ Response: { "objectChanges": { "nodes": [ { - "address": "0xb4e14ddd214a4ddb9acca83017dc8fd05f8ad433e4d7e6676087e6c0368e68a0", + "address": "0x04df2cc664f044d04926fdd64a874053746e122278680308150f60b567b20940", "idCreated": true, "idDeleted": false, "outputState": { - "address": "0xb4e14ddd214a4ddb9acca83017dc8fd05f8ad433e4d7e6676087e6c0368e68a0", - "digest": "8qv3yd7bS9w4MqkxCgjzGe6QHzWnqBYC7yu84FLJi1G1", + "address": "0x04df2cc664f044d04926fdd64a874053746e122278680308150f60b567b20940", + "digest": "2xZhu1r8zVrrjx6dTGmhyd3hUspYCmLURzNT9vGGM5nC", "asMoveObject": { "contents": { "type": { "repr": "0x0000000000000000000000000000000000000000000000000000000000000002::coin::Coin<0x0000000000000000000000000000000000000000000000000000000000000002::iota::IOTA>" }, "json": { - "id": "0xb4e14ddd214a4ddb9acca83017dc8fd05f8ad433e4d7e6676087e6c0368e68a0", + "id": "0x04df2cc664f044d04926fdd64a874053746e122278680308150f60b567b20940", "balance": { "value": "2000" } @@ -789,45 +789,45 @@ Response: { } }, { - "address": "0xb83a5a53f7d1dd5b87d9d829da34ef11375bf8acae96f8ca7fe5dfbf49c87d14", - "idCreated": true, + "address": "0x18a5cb688685554c4b370c3f551466dba6fb25390920fa5836812a9fb66500c4", + "idCreated": false, "idDeleted": false, "outputState": { - "address": "0xb83a5a53f7d1dd5b87d9d829da34ef11375bf8acae96f8ca7fe5dfbf49c87d14", - "digest": "7DJMVrZRXv1iuuVTNmv8LEuuMBSoTLw9h6AHxFGHbWE7", + "address": "0x18a5cb688685554c4b370c3f551466dba6fb25390920fa5836812a9fb66500c4", + "digest": "BvV2DJy7JAHKjTFgTFri7GrHN6GnEEjZovCBMpdGuMXC", "asMoveObject": { "contents": { "type": { - "repr": "0x1b0961cd4993fc5cdc89e30b433a4de9cde01b12e15c8e2fb88754d653992822::m::Foo" + "repr": "0x0000000000000000000000000000000000000000000000000000000000000002::coin::Coin<0x0000000000000000000000000000000000000000000000000000000000000002::iota::IOTA>" }, "json": { - "id": "0xb83a5a53f7d1dd5b87d9d829da34ef11375bf8acae96f8ca7fe5dfbf49c87d14", - "xs": [ - "42", - "43" - ] + "id": "0x18a5cb688685554c4b370c3f551466dba6fb25390920fa5836812a9fb66500c4", + "balance": { + "value": "299999982120400" + } } } } } }, { - "address": "0xc69f1954c6d13e3630075f462966e06d9f05fec29846d3d781026187e5411431", - "idCreated": false, + "address": "0x223be7efd160093e62a1b704b39bf7c0b99ef9a213eb12766693c18829eb8358", + "idCreated": true, "idDeleted": false, "outputState": { - "address": "0xc69f1954c6d13e3630075f462966e06d9f05fec29846d3d781026187e5411431", - "digest": "739cLjqpEeSvaT8Ta9qXAVV2bAFRXcmf9F6Zt3cCnXij", + "address": "0x223be7efd160093e62a1b704b39bf7c0b99ef9a213eb12766693c18829eb8358", + "digest": "n1Vsn9aEWScvXM5LdPHt5i4x9dz27TND53bvgVvZP8g", "asMoveObject": { "contents": { "type": { - "repr": "0x0000000000000000000000000000000000000000000000000000000000000002::coin::Coin<0x0000000000000000000000000000000000000000000000000000000000000002::iota::IOTA>" + "repr": "0xa76aca10126d5d229060b1363c338e695a191c318bbbf54007151d6918134d65::m::Foo" }, "json": { - "id": "0xc69f1954c6d13e3630075f462966e06d9f05fec29846d3d781026187e5411431", - "balance": { - "value": "299999982120400" - } + "id": "0x223be7efd160093e62a1b704b39bf7c0b99ef9a213eb12766693c18829eb8358", + "xs": [ + "42", + "43" + ] } } } @@ -837,7 +837,7 @@ Response: { }, "gasEffects": { "gasObject": { - "address": "0xc69f1954c6d13e3630075f462966e06d9f05fec29846d3d781026187e5411431" + "address": "0x18a5cb688685554c4b370c3f551466dba6fb25390920fa5836812a9fb66500c4" }, "gasSummary": { "computationCost": "1000000", @@ -854,7 +854,7 @@ Response: { "sequenceNumber": 3 }, "transactionBlock": { - "digest": "FiPjt6NaBmwTXNSQJDPvTEfwoWJQ1tfpe8P87ajeKfn4" + "digest": "72hb62Xx8UCvvfvsDpQntCUnr9EGFPHUVohx8YpN5iGS" } }, "expiration": null @@ -881,12 +881,12 @@ Response: { "transactionBlocks": { "nodes": [ { - "digest": "65qUXtK1a5gysqwhVKmxj5VQd3YndguWE1q9V7dZyVez", + "digest": "Ffp1DhEFmSMobvN7x83LN18dsj4qH8Tv6f74vqntrA32", "sender": { "address": "0x8cca4e1ce0ba5904cea61df9242da2f7d29e3ef328fb7ec07c086b3bf47ca61a" }, "signatures": [ - "ANpvkSQpMbmKm+dKBWFWsUa1GUaKYomXv9GXi3cfVe4ek3G9xb0AzX27HMyl7Odsbw+wyYuW30RoRH0tmBjXwQl/UUY663bYjcm3XmNyULIgxJz1t5Z9vxfB+fp8WUoJKA==" + "ALH9L5nJjP7Cz9X1aqT2ZsV1Ry2wZ7+0bhQFcAm3OB8dLGtEu75zArMTz/28KfjFC5tzJ86m/vO2T+nXaaly3Qh/UUY663bYjcm3XmNyULIgxJz1t5Z9vxfB+fp8WUoJKA==" ], "gasInput": { "gasSponsor": { @@ -895,7 +895,7 @@ Response: { "gasPayment": { "nodes": [ { - "address": "0xc69f1954c6d13e3630075f462966e06d9f05fec29846d3d781026187e5411431" + "address": "0x18a5cb688685554c4b370c3f551466dba6fb25390920fa5836812a9fb66500c4" } ] }, @@ -942,7 +942,7 @@ Response: { "dependencies": { "nodes": [ { - "digest": "FiPjt6NaBmwTXNSQJDPvTEfwoWJQ1tfpe8P87ajeKfn4" + "digest": "72hb62Xx8UCvvfvsDpQntCUnr9EGFPHUVohx8YpN5iGS" } ] }, @@ -962,19 +962,19 @@ Response: { "objectChanges": { "nodes": [ { - "address": "0xc69f1954c6d13e3630075f462966e06d9f05fec29846d3d781026187e5411431", + "address": "0x18a5cb688685554c4b370c3f551466dba6fb25390920fa5836812a9fb66500c4", "idCreated": false, "idDeleted": false, "outputState": { - "address": "0xc69f1954c6d13e3630075f462966e06d9f05fec29846d3d781026187e5411431", - "digest": "EXucdLBcKqADNerCwsbSi5PjvyFRjYn4wLB5Binbc4jZ" + "address": "0x18a5cb688685554c4b370c3f551466dba6fb25390920fa5836812a9fb66500c4", + "digest": "5ysmth2HaqLv1xLbCMQUnhd8qVZtEvyhRZ4M8mPMF9qc" } } ] }, "gasEffects": { "gasObject": { - "address": "0xc69f1954c6d13e3630075f462966e06d9f05fec29846d3d781026187e5411431" + "address": "0x18a5cb688685554c4b370c3f551466dba6fb25390920fa5836812a9fb66500c4" }, "gasSummary": { "computationCost": "1000000", @@ -991,7 +991,7 @@ Response: { "sequenceNumber": 4 }, "transactionBlock": { - "digest": "65qUXtK1a5gysqwhVKmxj5VQd3YndguWE1q9V7dZyVez" + "digest": "Ffp1DhEFmSMobvN7x83LN18dsj4qH8Tv6f74vqntrA32" } }, "expiration": null diff --git a/crates/iota-graphql-e2e-tests/tests/transactions/programmable.move b/crates/iota-graphql-e2e-tests/tests/transactions/programmable.move index 5ebb235513f..e760cce72e5 100644 --- a/crates/iota-graphql-e2e-tests/tests/transactions/programmable.move +++ b/crates/iota-graphql-e2e-tests/tests/transactions/programmable.move @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -//# init --protocol-version 1 --addresses P0=0x0 P1=0x0 --accounts A --simulator +//# init --protocol-version 3 --addresses P0=0x0 P1=0x0 --accounts A --simulator //# publish --upgradeable --sender A module P0::m { diff --git a/crates/iota-graphql-e2e-tests/tests/transactions/random.exp b/crates/iota-graphql-e2e-tests/tests/transactions/random.exp index a8828476838..602d0f9713f 100644 --- a/crates/iota-graphql-e2e-tests/tests/transactions/random.exp +++ b/crates/iota-graphql-e2e-tests/tests/transactions/random.exp @@ -19,7 +19,7 @@ Response: { "json": { "id": "0x0000000000000000000000000000000000000000000000000000000000000008", "inner": { - "id": "0x3f92eceed239ba443daf612dcdf621f85feba71f3698d53c9f2a6e4b4246b1c6", + "id": "0x087e07e48f02e1757a9a06af5c2be59dfc1a5717fe305d79fd77c5b3350426bc", "version": "1" } } diff --git a/crates/iota-graphql-e2e-tests/tests/transactions/random.move b/crates/iota-graphql-e2e-tests/tests/transactions/random.move index fe4523fba2e..df163923132 100644 --- a/crates/iota-graphql-e2e-tests/tests/transactions/random.move +++ b/crates/iota-graphql-e2e-tests/tests/transactions/random.move @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -//# init --protocol-version 1 --simulator +//# init --protocol-version 3 --simulator //# create-checkpoint diff --git a/crates/iota-graphql-e2e-tests/tests/transactions/scan_limit/alternating.exp b/crates/iota-graphql-e2e-tests/tests/transactions/scan_limit/alternating.exp index 157691e81c5..2cdfabfbb75 100644 --- a/crates/iota-graphql-e2e-tests/tests/transactions/scan_limit/alternating.exp +++ b/crates/iota-graphql-e2e-tests/tests/transactions/scan_limit/alternating.exp @@ -96,7 +96,7 @@ Response: { { "cursor": "eyJjIjozLCJ0IjoyLCJpIjpmYWxzZX0", "node": { - "digest": "EnWpFFgRUBm3LbuTfjJ6oF3RXVcnzpth6L9nn4Q18RNk", + "digest": "HaHDjFPNFmzEzGV15jqjHArnNQYN3wFCehawzgSjTPDC", "effects": { "checkpoint": { "sequenceNumber": 2 @@ -124,7 +124,7 @@ Response: { { "cursor": "eyJjIjozLCJ0Ijo0LCJpIjpmYWxzZX0", "node": { - "digest": "613degbde4DuvwwAZcQngGJzZkZ6GZJ9g8CwygpA1s1a", + "digest": "5p4zvwg7nsiUAUdYdzoB9swbX49YkwxfoCVLYvyUQvw5", "effects": { "checkpoint": { "sequenceNumber": 2 @@ -135,7 +135,7 @@ Response: { { "cursor": "eyJjIjozLCJ0Ijo2LCJpIjpmYWxzZX0", "node": { - "digest": "AYmLYSfPbk4sVdBLcV76UmZgPTETP7XsVCaNKHTJ5qzs", + "digest": "57kQ1GWYJ16691C3z6roPwP9zoH4ZZXXcopwdp5E3jn2", "effects": { "checkpoint": { "sequenceNumber": 2 @@ -163,7 +163,7 @@ Response: { { "cursor": "eyJjIjozLCJ0Ijo0LCJpIjpmYWxzZX0", "node": { - "digest": "613degbde4DuvwwAZcQngGJzZkZ6GZJ9g8CwygpA1s1a", + "digest": "5p4zvwg7nsiUAUdYdzoB9swbX49YkwxfoCVLYvyUQvw5", "effects": { "checkpoint": { "sequenceNumber": 2 @@ -191,7 +191,7 @@ Response: { { "cursor": "eyJjIjozLCJ0Ijo4LCJpIjpmYWxzZX0", "node": { - "digest": "4kA8BHJRwCdE8BjFTpTfSGt9nvoii37twZRM91uxMuvi", + "digest": "HmHRDzEysmLNnMmwwFfehYukrz8hBKdV35W27g2dGcA6", "effects": { "checkpoint": { "sequenceNumber": 3 @@ -219,7 +219,7 @@ Response: { { "cursor": "eyJjIjozLCJ0Ijo2LCJpIjpmYWxzZX0", "node": { - "digest": "AYmLYSfPbk4sVdBLcV76UmZgPTETP7XsVCaNKHTJ5qzs", + "digest": "57kQ1GWYJ16691C3z6roPwP9zoH4ZZXXcopwdp5E3jn2", "effects": { "checkpoint": { "sequenceNumber": 2 @@ -230,7 +230,7 @@ Response: { { "cursor": "eyJjIjozLCJ0Ijo4LCJpIjpmYWxzZX0", "node": { - "digest": "4kA8BHJRwCdE8BjFTpTfSGt9nvoii37twZRM91uxMuvi", + "digest": "HmHRDzEysmLNnMmwwFfehYukrz8hBKdV35W27g2dGcA6", "effects": { "checkpoint": { "sequenceNumber": 3 @@ -258,7 +258,7 @@ Response: { { "cursor": "eyJjIjozLCJ0IjoxMCwiaSI6ZmFsc2V9", "node": { - "digest": "Dqi2D27TQ531EiXzEonQGrANt8kJh9w5JZ6SMtmRpm9b", + "digest": "Ftg9H88N7ioz51UuwfzvksAwaKnD6izS6kZKVLs5kPoh", "effects": { "checkpoint": { "sequenceNumber": 3 @@ -286,7 +286,7 @@ Response: { { "cursor": "eyJjIjozLCJ0IjoxMCwiaSI6ZmFsc2V9", "node": { - "digest": "Dqi2D27TQ531EiXzEonQGrANt8kJh9w5JZ6SMtmRpm9b", + "digest": "Ftg9H88N7ioz51UuwfzvksAwaKnD6izS6kZKVLs5kPoh", "effects": { "checkpoint": { "sequenceNumber": 3 diff --git a/crates/iota-graphql-e2e-tests/tests/transactions/scan_limit/alternating.move b/crates/iota-graphql-e2e-tests/tests/transactions/scan_limit/alternating.move index e5fafe88635..003c0ed37d1 100644 --- a/crates/iota-graphql-e2e-tests/tests/transactions/scan_limit/alternating.move +++ b/crates/iota-graphql-e2e-tests/tests/transactions/scan_limit/alternating.move @@ -4,7 +4,7 @@ // Testing behavior of alternating between a scan-limited and normal query -//# init --protocol-version 1 --addresses Test=0x0 --accounts A B --simulator +//# init --protocol-version 3 --addresses Test=0x0 --accounts A B --simulator //# publish module Test::M1 { diff --git a/crates/iota-graphql-e2e-tests/tests/transactions/scan_limit/both_cursors.exp b/crates/iota-graphql-e2e-tests/tests/transactions/scan_limit/both_cursors.exp index 00684e0720f..92dae435b70 100644 --- a/crates/iota-graphql-e2e-tests/tests/transactions/scan_limit/both_cursors.exp +++ b/crates/iota-graphql-e2e-tests/tests/transactions/scan_limit/both_cursors.exp @@ -96,7 +96,7 @@ Response: { { "cursor": "eyJjIjo0LCJ0Ijo0LCJpIjpmYWxzZX0", "node": { - "digest": "CQYnSfH6y3QuQjbzBYRDRYPr8sNMYp34tLf2NES2SdGm", + "digest": "5FvPDk1jtQos4igBEUNxZJyLUC475rXDuvTviKvYiy6i", "effects": { "checkpoint": { "sequenceNumber": 2 @@ -124,7 +124,7 @@ Response: { { "cursor": "eyJjIjo0LCJ0Ijo0LCJpIjpmYWxzZX0", "node": { - "digest": "CQYnSfH6y3QuQjbzBYRDRYPr8sNMYp34tLf2NES2SdGm", + "digest": "5FvPDk1jtQos4igBEUNxZJyLUC475rXDuvTviKvYiy6i", "effects": { "checkpoint": { "sequenceNumber": 2 @@ -135,7 +135,7 @@ Response: { { "cursor": "eyJjIjo0LCJ0Ijo2LCJpIjpmYWxzZX0", "node": { - "digest": "7jDvB5qNfUzvhzSer2KBHYwYvuXwfRemZ6TjpUZvcEjA", + "digest": "DwrJyK3daKxKED9MdN6EK1qeEUsrM2q88dgfPHJ4SqyJ", "effects": { "checkpoint": { "sequenceNumber": 2 @@ -163,7 +163,7 @@ Response: { { "cursor": "eyJjIjo0LCJ0Ijo1LCJpIjpmYWxzZX0", "node": { - "digest": "6hvDK848GxrWavhtQx6613ALsYctTEayGjqJw6z1qDvJ", + "digest": "5XRZD7sWxeBri7eWzrG9y4gWq75zX66dnzU4g82BcSea", "effects": { "checkpoint": { "sequenceNumber": 2 diff --git a/crates/iota-graphql-e2e-tests/tests/transactions/scan_limit/both_cursors.move b/crates/iota-graphql-e2e-tests/tests/transactions/scan_limit/both_cursors.move index 1361c415061..46bc2fae2df 100644 --- a/crates/iota-graphql-e2e-tests/tests/transactions/scan_limit/both_cursors.move +++ b/crates/iota-graphql-e2e-tests/tests/transactions/scan_limit/both_cursors.move @@ -5,7 +5,7 @@ // Tests paginating forwards where first and scanLimit are equal. The 1st, 3rd, 5th, and 7th through // 10th transactions will match the filtering criteria. -//# init --protocol-version 1 --addresses Test=0x0 --accounts A B --simulator +//# init --protocol-version 3 --addresses Test=0x0 --accounts A B --simulator //# publish module Test::M1 { diff --git a/crates/iota-graphql-e2e-tests/tests/transactions/scan_limit/equal/first.exp b/crates/iota-graphql-e2e-tests/tests/transactions/scan_limit/equal/first.exp index 4f313117c03..3ceb7dba444 100644 --- a/crates/iota-graphql-e2e-tests/tests/transactions/scan_limit/equal/first.exp +++ b/crates/iota-graphql-e2e-tests/tests/transactions/scan_limit/equal/first.exp @@ -96,7 +96,7 @@ Response: { { "cursor": "eyJjIjozLCJ0IjoyLCJpIjpmYWxzZX0", "node": { - "digest": "ABweY1pDPKFhZX77kk48ofYU9KpAvXHBZUYyPK8JZf8p", + "digest": "EbDGGG7J7UrDdsn6F1C8puthPhTAyCbP8zJamEmXrvH4", "effects": { "checkpoint": { "sequenceNumber": 2 @@ -107,7 +107,7 @@ Response: { { "cursor": "eyJjIjozLCJ0Ijo0LCJpIjpmYWxzZX0", "node": { - "digest": "CQYnSfH6y3QuQjbzBYRDRYPr8sNMYp34tLf2NES2SdGm", + "digest": "5FvPDk1jtQos4igBEUNxZJyLUC475rXDuvTviKvYiy6i", "effects": { "checkpoint": { "sequenceNumber": 2 @@ -118,7 +118,7 @@ Response: { { "cursor": "eyJjIjozLCJ0Ijo2LCJpIjpmYWxzZX0", "node": { - "digest": "7jDvB5qNfUzvhzSer2KBHYwYvuXwfRemZ6TjpUZvcEjA", + "digest": "DwrJyK3daKxKED9MdN6EK1qeEUsrM2q88dgfPHJ4SqyJ", "effects": { "checkpoint": { "sequenceNumber": 2 @@ -129,7 +129,7 @@ Response: { { "cursor": "eyJjIjozLCJ0IjoxMCwiaSI6ZmFsc2V9", "node": { - "digest": "66KKZQ7bxz9uM5Jhc651Txh57S4s9xJMDJs6dmBkeDUz", + "digest": "CAuCiWwxT74gQYmGNLM3irCjw7AQ8dpNL9kgtRu9MrZm", "effects": { "checkpoint": { "sequenceNumber": 3 @@ -140,7 +140,7 @@ Response: { { "cursor": "eyJjIjozLCJ0IjoxMSwiaSI6ZmFsc2V9", "node": { - "digest": "78g29WY1ZjXGJmRjGWQNKnowtmDvftTDsQd9HbpUBn7g", + "digest": "3Xzrd8CC4UpV1fiPCc3VyBJC93HAAwL872CgtTNM3hyj", "effects": { "checkpoint": { "sequenceNumber": 3 @@ -168,7 +168,7 @@ Response: { { "cursor": "eyJjIjozLCJ0IjoyLCJpIjpmYWxzZX0", "node": { - "digest": "ABweY1pDPKFhZX77kk48ofYU9KpAvXHBZUYyPK8JZf8p", + "digest": "EbDGGG7J7UrDdsn6F1C8puthPhTAyCbP8zJamEmXrvH4", "effects": { "checkpoint": { "sequenceNumber": 2 @@ -196,7 +196,7 @@ Response: { { "cursor": "eyJjIjo0LCJ0Ijo0LCJpIjpmYWxzZX0", "node": { - "digest": "CQYnSfH6y3QuQjbzBYRDRYPr8sNMYp34tLf2NES2SdGm", + "digest": "5FvPDk1jtQos4igBEUNxZJyLUC475rXDuvTviKvYiy6i", "effects": { "checkpoint": { "sequenceNumber": 2 @@ -224,7 +224,7 @@ Response: { { "cursor": "eyJjIjo0LCJ0Ijo2LCJpIjpmYWxzZX0", "node": { - "digest": "7jDvB5qNfUzvhzSer2KBHYwYvuXwfRemZ6TjpUZvcEjA", + "digest": "DwrJyK3daKxKED9MdN6EK1qeEUsrM2q88dgfPHJ4SqyJ", "effects": { "checkpoint": { "sequenceNumber": 2 @@ -268,7 +268,7 @@ Response: { { "cursor": "eyJjIjo0LCJ0IjoxMCwiaSI6ZmFsc2V9", "node": { - "digest": "66KKZQ7bxz9uM5Jhc651Txh57S4s9xJMDJs6dmBkeDUz", + "digest": "CAuCiWwxT74gQYmGNLM3irCjw7AQ8dpNL9kgtRu9MrZm", "effects": { "checkpoint": { "sequenceNumber": 3 @@ -279,7 +279,7 @@ Response: { { "cursor": "eyJjIjo0LCJ0IjoxMSwiaSI6ZmFsc2V9", "node": { - "digest": "78g29WY1ZjXGJmRjGWQNKnowtmDvftTDsQd9HbpUBn7g", + "digest": "3Xzrd8CC4UpV1fiPCc3VyBJC93HAAwL872CgtTNM3hyj", "effects": { "checkpoint": { "sequenceNumber": 3 @@ -333,7 +333,7 @@ Response: { { "cursor": "eyJjIjo0LCJ0IjoxMCwiaSI6ZmFsc2V9", "node": { - "digest": "66KKZQ7bxz9uM5Jhc651Txh57S4s9xJMDJs6dmBkeDUz", + "digest": "CAuCiWwxT74gQYmGNLM3irCjw7AQ8dpNL9kgtRu9MrZm", "effects": { "checkpoint": { "sequenceNumber": 3 @@ -344,7 +344,7 @@ Response: { { "cursor": "eyJjIjo0LCJ0IjoxMSwiaSI6ZmFsc2V9", "node": { - "digest": "78g29WY1ZjXGJmRjGWQNKnowtmDvftTDsQd9HbpUBn7g", + "digest": "3Xzrd8CC4UpV1fiPCc3VyBJC93HAAwL872CgtTNM3hyj", "effects": { "checkpoint": { "sequenceNumber": 3 diff --git a/crates/iota-graphql-e2e-tests/tests/transactions/scan_limit/equal/first.move b/crates/iota-graphql-e2e-tests/tests/transactions/scan_limit/equal/first.move index 2a2277647cc..2c19d64df48 100644 --- a/crates/iota-graphql-e2e-tests/tests/transactions/scan_limit/equal/first.move +++ b/crates/iota-graphql-e2e-tests/tests/transactions/scan_limit/equal/first.move @@ -5,7 +5,7 @@ // Tests paginating forwards where first and scanLimit are equal. The 1st, 3rd, 5th, and 7th through // 10th transactions will match the filtering criteria. -//# init --protocol-version 1 --addresses Test=0x0 --accounts A B --simulator +//# init --protocol-version 3 --addresses Test=0x0 --accounts A B --simulator //# publish module Test::M1 { diff --git a/crates/iota-graphql-e2e-tests/tests/transactions/scan_limit/equal/last.exp b/crates/iota-graphql-e2e-tests/tests/transactions/scan_limit/equal/last.exp index f70d192b281..7b02f4f3725 100644 --- a/crates/iota-graphql-e2e-tests/tests/transactions/scan_limit/equal/last.exp +++ b/crates/iota-graphql-e2e-tests/tests/transactions/scan_limit/equal/last.exp @@ -96,7 +96,7 @@ Response: { { "cursor": "eyJjIjozLCJ0IjoyLCJpIjpmYWxzZX0", "node": { - "digest": "ABweY1pDPKFhZX77kk48ofYU9KpAvXHBZUYyPK8JZf8p", + "digest": "EbDGGG7J7UrDdsn6F1C8puthPhTAyCbP8zJamEmXrvH4", "effects": { "checkpoint": { "sequenceNumber": 2 @@ -107,7 +107,7 @@ Response: { { "cursor": "eyJjIjozLCJ0IjozLCJpIjpmYWxzZX0", "node": { - "digest": "8v4rn79YoSv3Drbkqbz8ttsX7EJDPEoDNbvLXpZnNXvE", + "digest": "ovzzHxewTojtxtEmjJNWFJZuD8MuP6NDxUafmf4z8tf", "effects": { "checkpoint": { "sequenceNumber": 2 @@ -118,7 +118,7 @@ Response: { { "cursor": "eyJjIjozLCJ0Ijo3LCJpIjpmYWxzZX0", "node": { - "digest": "6ZXmX1p1yNyfqE4fhJKqQAjv1CFfM6qJoF5MwAFc578k", + "digest": "HwhPdVvSZy2tgdA7siWYSm1JcaMJ6Cjp6YhriCQhigsg", "effects": { "checkpoint": { "sequenceNumber": 3 @@ -129,7 +129,7 @@ Response: { { "cursor": "eyJjIjozLCJ0Ijo5LCJpIjpmYWxzZX0", "node": { - "digest": "EWYMoiDshwh4KMAXKQPcHUxfCHMx5zvsJ249L36moUWD", + "digest": "Az5dLVuYkHQ2T7b7ETHyLjye33TKnCRMmbxazpuBd9o1", "effects": { "checkpoint": { "sequenceNumber": 3 @@ -140,7 +140,7 @@ Response: { { "cursor": "eyJjIjozLCJ0IjoxMSwiaSI6ZmFsc2V9", "node": { - "digest": "BcK8vqpPuVeCkSM5LAEanttduQNAyhiK6psakqN8dyYY", + "digest": "BqVcj3fjjaNCaCsHF9MAfMok2MhDHnQkMKTVVtL5kRvb", "effects": { "checkpoint": { "sequenceNumber": 3 @@ -168,7 +168,7 @@ Response: { { "cursor": "eyJjIjozLCJ0IjoxMSwiaSI6ZmFsc2V9", "node": { - "digest": "BcK8vqpPuVeCkSM5LAEanttduQNAyhiK6psakqN8dyYY", + "digest": "BqVcj3fjjaNCaCsHF9MAfMok2MhDHnQkMKTVVtL5kRvb", "effects": { "checkpoint": { "sequenceNumber": 3 @@ -196,7 +196,7 @@ Response: { { "cursor": "eyJjIjo0LCJ0Ijo5LCJpIjpmYWxzZX0", "node": { - "digest": "EWYMoiDshwh4KMAXKQPcHUxfCHMx5zvsJ249L36moUWD", + "digest": "Az5dLVuYkHQ2T7b7ETHyLjye33TKnCRMmbxazpuBd9o1", "effects": { "checkpoint": { "sequenceNumber": 3 @@ -224,7 +224,7 @@ Response: { { "cursor": "eyJjIjo0LCJ0Ijo3LCJpIjpmYWxzZX0", "node": { - "digest": "6ZXmX1p1yNyfqE4fhJKqQAjv1CFfM6qJoF5MwAFc578k", + "digest": "HwhPdVvSZy2tgdA7siWYSm1JcaMJ6Cjp6YhriCQhigsg", "effects": { "checkpoint": { "sequenceNumber": 3 @@ -268,7 +268,7 @@ Response: { { "cursor": "eyJjIjo0LCJ0IjoyLCJpIjpmYWxzZX0", "node": { - "digest": "ABweY1pDPKFhZX77kk48ofYU9KpAvXHBZUYyPK8JZf8p", + "digest": "EbDGGG7J7UrDdsn6F1C8puthPhTAyCbP8zJamEmXrvH4", "effects": { "checkpoint": { "sequenceNumber": 2 @@ -279,7 +279,7 @@ Response: { { "cursor": "eyJjIjo0LCJ0IjozLCJpIjpmYWxzZX0", "node": { - "digest": "8v4rn79YoSv3Drbkqbz8ttsX7EJDPEoDNbvLXpZnNXvE", + "digest": "ovzzHxewTojtxtEmjJNWFJZuD8MuP6NDxUafmf4z8tf", "effects": { "checkpoint": { "sequenceNumber": 2 diff --git a/crates/iota-graphql-e2e-tests/tests/transactions/scan_limit/equal/last.move b/crates/iota-graphql-e2e-tests/tests/transactions/scan_limit/equal/last.move index 089a36ffc93..ad3c30a3549 100644 --- a/crates/iota-graphql-e2e-tests/tests/transactions/scan_limit/equal/last.move +++ b/crates/iota-graphql-e2e-tests/tests/transactions/scan_limit/equal/last.move @@ -4,7 +4,7 @@ // Mirrors scan_limit/equal/first.move, paginating backwards where first and scanLimit are equal. -//# init --protocol-version 1 --addresses Test=0x0 --accounts A B --simulator +//# init --protocol-version 3 --addresses Test=0x0 --accounts A B --simulator //# publish module Test::M1 { diff --git a/crates/iota-graphql-e2e-tests/tests/transactions/scan_limit/ge_page/first.exp b/crates/iota-graphql-e2e-tests/tests/transactions/scan_limit/ge_page/first.exp index ef865977112..3f98bcccf25 100644 --- a/crates/iota-graphql-e2e-tests/tests/transactions/scan_limit/ge_page/first.exp +++ b/crates/iota-graphql-e2e-tests/tests/transactions/scan_limit/ge_page/first.exp @@ -164,7 +164,7 @@ Response: { { "cursor": "eyJjIjo1LCJ0IjoyLCJpIjpmYWxzZX0", "node": { - "digest": "EnWpFFgRUBm3LbuTfjJ6oF3RXVcnzpth6L9nn4Q18RNk", + "digest": "HaHDjFPNFmzEzGV15jqjHArnNQYN3wFCehawzgSjTPDC", "effects": { "checkpoint": { "sequenceNumber": 2 @@ -175,7 +175,7 @@ Response: { { "cursor": "eyJjIjo1LCJ0IjozLCJpIjpmYWxzZX0", "node": { - "digest": "3fmkhmMgShCMM9HWgLR13ovdiBTy2Zoe6MgVfy8Wi8nt", + "digest": "FDiPztMqvdBBRZTteyNf6wKbryrRMrqSXtS3LpWxtKqZ", "effects": { "checkpoint": { "sequenceNumber": 2 @@ -186,7 +186,7 @@ Response: { { "cursor": "eyJjIjo1LCJ0IjoxNywiaSI6ZmFsc2V9", "node": { - "digest": "8NagxHteFzUuAvwvzjFAorD1dNfqfKnqwwviDaAt8j1z", + "digest": "DLGGXHtEkErS86wgoWD3AiLzWJqRWwpw4VCgE2XZJQUN", "effects": { "checkpoint": { "sequenceNumber": 5 @@ -197,7 +197,7 @@ Response: { { "cursor": "eyJjIjo1LCJ0IjoxOCwiaSI6ZmFsc2V9", "node": { - "digest": "Ep8Q9KBacxFkYEvaxsm7CJAUqQ85WUi5z6oZudBEyFSP", + "digest": "8vmaeHkAP6N612bY4bWhWiuoTjdJejuzCdrwQ2Sougu", "effects": { "checkpoint": { "sequenceNumber": 5 @@ -208,7 +208,7 @@ Response: { { "cursor": "eyJjIjo1LCJ0IjoyMSwiaSI6ZmFsc2V9", "node": { - "digest": "636Q9XJw6aZQ4RGEnej49Z99Nn21GgPBQDmCGGhNQ2Rm", + "digest": "CRPK78UpxQyyLXcizjY81vBG4bZNG6yQ9jbda9iaSnVy", "effects": { "checkpoint": { "sequenceNumber": 5 @@ -236,7 +236,7 @@ Response: { { "cursor": "eyJjIjo1LCJ0IjoyLCJpIjpmYWxzZX0", "node": { - "digest": "EnWpFFgRUBm3LbuTfjJ6oF3RXVcnzpth6L9nn4Q18RNk", + "digest": "HaHDjFPNFmzEzGV15jqjHArnNQYN3wFCehawzgSjTPDC", "effects": { "checkpoint": { "sequenceNumber": 2 @@ -264,7 +264,7 @@ Response: { { "cursor": "eyJjIjo3LCJ0IjozLCJpIjpmYWxzZX0", "node": { - "digest": "3fmkhmMgShCMM9HWgLR13ovdiBTy2Zoe6MgVfy8Wi8nt", + "digest": "FDiPztMqvdBBRZTteyNf6wKbryrRMrqSXtS3LpWxtKqZ", "effects": { "checkpoint": { "sequenceNumber": 2 @@ -308,7 +308,7 @@ Response: { { "cursor": "eyJjIjo3LCJ0IjoxNywiaSI6ZmFsc2V9", "node": { - "digest": "8NagxHteFzUuAvwvzjFAorD1dNfqfKnqwwviDaAt8j1z", + "digest": "DLGGXHtEkErS86wgoWD3AiLzWJqRWwpw4VCgE2XZJQUN", "effects": { "checkpoint": { "sequenceNumber": 5 @@ -336,7 +336,7 @@ Response: { { "cursor": "eyJjIjo3LCJ0IjoxOCwiaSI6ZmFsc2V9", "node": { - "digest": "Ep8Q9KBacxFkYEvaxsm7CJAUqQ85WUi5z6oZudBEyFSP", + "digest": "8vmaeHkAP6N612bY4bWhWiuoTjdJejuzCdrwQ2Sougu", "effects": { "checkpoint": { "sequenceNumber": 5 @@ -364,7 +364,7 @@ Response: { { "cursor": "eyJjIjo3LCJ0IjoyMSwiaSI6ZmFsc2V9", "node": { - "digest": "636Q9XJw6aZQ4RGEnej49Z99Nn21GgPBQDmCGGhNQ2Rm", + "digest": "CRPK78UpxQyyLXcizjY81vBG4bZNG6yQ9jbda9iaSnVy", "effects": { "checkpoint": { "sequenceNumber": 5 diff --git a/crates/iota-graphql-e2e-tests/tests/transactions/scan_limit/ge_page/first.move b/crates/iota-graphql-e2e-tests/tests/transactions/scan_limit/ge_page/first.move index 9269c040184..1bd0e83c3e8 100644 --- a/crates/iota-graphql-e2e-tests/tests/transactions/scan_limit/ge_page/first.move +++ b/crates/iota-graphql-e2e-tests/tests/transactions/scan_limit/ge_page/first.move @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -//# init --protocol-version 1 --addresses Test=0x0 --accounts A B --simulator +//# init --protocol-version 3 --addresses Test=0x0 --accounts A B --simulator //# publish module Test::M1 { diff --git a/crates/iota-graphql-e2e-tests/tests/transactions/scan_limit/ge_page/last.exp b/crates/iota-graphql-e2e-tests/tests/transactions/scan_limit/ge_page/last.exp index 237670042df..265137784bf 100644 --- a/crates/iota-graphql-e2e-tests/tests/transactions/scan_limit/ge_page/last.exp +++ b/crates/iota-graphql-e2e-tests/tests/transactions/scan_limit/ge_page/last.exp @@ -164,7 +164,7 @@ Response: { { "cursor": "eyJjIjo1LCJ0IjoyLCJpIjpmYWxzZX0", "node": { - "digest": "EnWpFFgRUBm3LbuTfjJ6oF3RXVcnzpth6L9nn4Q18RNk", + "digest": "HaHDjFPNFmzEzGV15jqjHArnNQYN3wFCehawzgSjTPDC", "effects": { "checkpoint": { "sequenceNumber": 2 @@ -175,7 +175,7 @@ Response: { { "cursor": "eyJjIjo1LCJ0IjozLCJpIjpmYWxzZX0", "node": { - "digest": "3fmkhmMgShCMM9HWgLR13ovdiBTy2Zoe6MgVfy8Wi8nt", + "digest": "FDiPztMqvdBBRZTteyNf6wKbryrRMrqSXtS3LpWxtKqZ", "effects": { "checkpoint": { "sequenceNumber": 2 @@ -186,7 +186,7 @@ Response: { { "cursor": "eyJjIjo1LCJ0IjoxNywiaSI6ZmFsc2V9", "node": { - "digest": "8NagxHteFzUuAvwvzjFAorD1dNfqfKnqwwviDaAt8j1z", + "digest": "DLGGXHtEkErS86wgoWD3AiLzWJqRWwpw4VCgE2XZJQUN", "effects": { "checkpoint": { "sequenceNumber": 5 @@ -197,7 +197,7 @@ Response: { { "cursor": "eyJjIjo1LCJ0IjoyMSwiaSI6ZmFsc2V9", "node": { - "digest": "9xCVVc6YyR55DpQifNUbt7ixYuficCkWkSreszCdHL1g", + "digest": "21ejBpRm4SSaoYgb2rvzno3vuFEfc7QjzPDmzZdJ5aFR", "effects": { "checkpoint": { "sequenceNumber": 5 @@ -225,7 +225,7 @@ Response: { { "cursor": "eyJjIjo1LCJ0IjoyMSwiaSI6ZmFsc2V9", "node": { - "digest": "9xCVVc6YyR55DpQifNUbt7ixYuficCkWkSreszCdHL1g", + "digest": "21ejBpRm4SSaoYgb2rvzno3vuFEfc7QjzPDmzZdJ5aFR", "effects": { "checkpoint": { "sequenceNumber": 5 @@ -253,7 +253,7 @@ Response: { { "cursor": "eyJjIjo3LCJ0IjoxNywiaSI6ZmFsc2V9", "node": { - "digest": "8NagxHteFzUuAvwvzjFAorD1dNfqfKnqwwviDaAt8j1z", + "digest": "DLGGXHtEkErS86wgoWD3AiLzWJqRWwpw4VCgE2XZJQUN", "effects": { "checkpoint": { "sequenceNumber": 5 @@ -313,7 +313,7 @@ Response: { { "cursor": "eyJjIjo3LCJ0IjozLCJpIjpmYWxzZX0", "node": { - "digest": "3fmkhmMgShCMM9HWgLR13ovdiBTy2Zoe6MgVfy8Wi8nt", + "digest": "FDiPztMqvdBBRZTteyNf6wKbryrRMrqSXtS3LpWxtKqZ", "effects": { "checkpoint": { "sequenceNumber": 2 @@ -341,7 +341,7 @@ Response: { { "cursor": "eyJjIjo3LCJ0IjoyLCJpIjpmYWxzZX0", "node": { - "digest": "EnWpFFgRUBm3LbuTfjJ6oF3RXVcnzpth6L9nn4Q18RNk", + "digest": "HaHDjFPNFmzEzGV15jqjHArnNQYN3wFCehawzgSjTPDC", "effects": { "checkpoint": { "sequenceNumber": 2 diff --git a/crates/iota-graphql-e2e-tests/tests/transactions/scan_limit/ge_page/last.move b/crates/iota-graphql-e2e-tests/tests/transactions/scan_limit/ge_page/last.move index 712859bdbc2..2cfcca7a8f8 100644 --- a/crates/iota-graphql-e2e-tests/tests/transactions/scan_limit/ge_page/last.move +++ b/crates/iota-graphql-e2e-tests/tests/transactions/scan_limit/ge_page/last.move @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -//# init --protocol-version 1 --addresses Test=0x0 --accounts A B --simulator +//# init --protocol-version 3 --addresses Test=0x0 --accounts A B --simulator //# publish module Test::M1 { diff --git a/crates/iota-graphql-e2e-tests/tests/transactions/scan_limit/invalid_limits.move b/crates/iota-graphql-e2e-tests/tests/transactions/scan_limit/invalid_limits.move index 71f05e500f7..0023fbfd17e 100644 --- a/crates/iota-graphql-e2e-tests/tests/transactions/scan_limit/invalid_limits.move +++ b/crates/iota-graphql-e2e-tests/tests/transactions/scan_limit/invalid_limits.move @@ -4,7 +4,7 @@ // For any instance where limit is 0 or scan limit is 0, we should return an empty result -//# init --protocol-version 1 --addresses Test=0x0 --accounts A B --simulator +//# init --protocol-version 3 --addresses Test=0x0 --accounts A B --simulator //# publish module Test::M1 { diff --git a/crates/iota-graphql-e2e-tests/tests/transactions/scan_limit/le_page/first.exp b/crates/iota-graphql-e2e-tests/tests/transactions/scan_limit/le_page/first.exp index 377000f6c75..dada5d2480d 100644 --- a/crates/iota-graphql-e2e-tests/tests/transactions/scan_limit/le_page/first.exp +++ b/crates/iota-graphql-e2e-tests/tests/transactions/scan_limit/le_page/first.exp @@ -96,7 +96,7 @@ Response: { { "cursor": "eyJjIjozLCJ0IjoyLCJpIjpmYWxzZX0", "node": { - "digest": "EnWpFFgRUBm3LbuTfjJ6oF3RXVcnzpth6L9nn4Q18RNk", + "digest": "HaHDjFPNFmzEzGV15jqjHArnNQYN3wFCehawzgSjTPDC", "effects": { "checkpoint": { "sequenceNumber": 2 @@ -107,7 +107,7 @@ Response: { { "cursor": "eyJjIjozLCJ0IjozLCJpIjpmYWxzZX0", "node": { - "digest": "GA1cT6FjP8qBTMegHadnXpjq7kTkD4Fw68jDJPci9C9r", + "digest": "DJzyBdq9ukZfiNYfRm9vWi7aXqW97F1YfwdrtTycEs1m", "effects": { "checkpoint": { "sequenceNumber": 2 @@ -118,7 +118,7 @@ Response: { { "cursor": "eyJjIjozLCJ0Ijo0LCJpIjpmYWxzZX0", "node": { - "digest": "613degbde4DuvwwAZcQngGJzZkZ6GZJ9g8CwygpA1s1a", + "digest": "5p4zvwg7nsiUAUdYdzoB9swbX49YkwxfoCVLYvyUQvw5", "effects": { "checkpoint": { "sequenceNumber": 2 @@ -129,7 +129,7 @@ Response: { { "cursor": "eyJjIjozLCJ0Ijo1LCJpIjpmYWxzZX0", "node": { - "digest": "GELgyKASGaZrZrgUw3C3TwaYjXwRme8StabM1zRrHDc7", + "digest": "AohmvfnFhqjmhMr4AvnEsVXHpuTne7xnFdNfZ98cEPP2", "effects": { "checkpoint": { "sequenceNumber": 2 @@ -140,7 +140,7 @@ Response: { { "cursor": "eyJjIjozLCJ0Ijo2LCJpIjpmYWxzZX0", "node": { - "digest": "AYmLYSfPbk4sVdBLcV76UmZgPTETP7XsVCaNKHTJ5qzs", + "digest": "57kQ1GWYJ16691C3z6roPwP9zoH4ZZXXcopwdp5E3jn2", "effects": { "checkpoint": { "sequenceNumber": 2 @@ -151,7 +151,7 @@ Response: { { "cursor": "eyJjIjozLCJ0Ijo3LCJpIjpmYWxzZX0", "node": { - "digest": "CkoEZRVMsPm3VJbX7gdwTrmfVMyHyNWDMk7tPKR6DdF2", + "digest": "89KDnhtw8jSB5ULTUJFrycuJ85D3owK5RGWtWRJmysRn", "effects": { "checkpoint": { "sequenceNumber": 3 @@ -162,7 +162,7 @@ Response: { { "cursor": "eyJjIjozLCJ0Ijo4LCJpIjpmYWxzZX0", "node": { - "digest": "4kA8BHJRwCdE8BjFTpTfSGt9nvoii37twZRM91uxMuvi", + "digest": "HmHRDzEysmLNnMmwwFfehYukrz8hBKdV35W27g2dGcA6", "effects": { "checkpoint": { "sequenceNumber": 3 @@ -173,7 +173,7 @@ Response: { { "cursor": "eyJjIjozLCJ0Ijo5LCJpIjpmYWxzZX0", "node": { - "digest": "ALqmnvW1wprABKAdtX8Zz49UYtTYshzXUC1fvsWx2ik9", + "digest": "BaKixTTzKMyJkmAndNNcfxFGz4gYmMJgu7GRk11zwYoi", "effects": { "checkpoint": { "sequenceNumber": 3 @@ -184,7 +184,7 @@ Response: { { "cursor": "eyJjIjozLCJ0IjoxMCwiaSI6ZmFsc2V9", "node": { - "digest": "Dqi2D27TQ531EiXzEonQGrANt8kJh9w5JZ6SMtmRpm9b", + "digest": "Ftg9H88N7ioz51UuwfzvksAwaKnD6izS6kZKVLs5kPoh", "effects": { "checkpoint": { "sequenceNumber": 3 @@ -195,7 +195,7 @@ Response: { { "cursor": "eyJjIjozLCJ0IjoxMSwiaSI6ZmFsc2V9", "node": { - "digest": "3Hs1AweW2BsmMaeicbKyhJ2DetgX5Q13Ev1S97wfBfHK", + "digest": "ANXXybMZSWDWK9pYe8Ztnxbh9GaiyX4dXA3wVdWZaxT1", "effects": { "checkpoint": { "sequenceNumber": 3 @@ -223,7 +223,7 @@ Response: { { "cursor": "eyJjIjozLCJ0IjoyLCJpIjpmYWxzZX0", "node": { - "digest": "EnWpFFgRUBm3LbuTfjJ6oF3RXVcnzpth6L9nn4Q18RNk", + "digest": "HaHDjFPNFmzEzGV15jqjHArnNQYN3wFCehawzgSjTPDC", "effects": { "checkpoint": { "sequenceNumber": 2 @@ -251,7 +251,7 @@ Response: { { "cursor": "eyJjIjo0LCJ0Ijo0LCJpIjpmYWxzZX0", "node": { - "digest": "613degbde4DuvwwAZcQngGJzZkZ6GZJ9g8CwygpA1s1a", + "digest": "5p4zvwg7nsiUAUdYdzoB9swbX49YkwxfoCVLYvyUQvw5", "effects": { "checkpoint": { "sequenceNumber": 2 @@ -279,7 +279,7 @@ Response: { { "cursor": "eyJjIjo0LCJ0Ijo2LCJpIjpmYWxzZX0", "node": { - "digest": "AYmLYSfPbk4sVdBLcV76UmZgPTETP7XsVCaNKHTJ5qzs", + "digest": "57kQ1GWYJ16691C3z6roPwP9zoH4ZZXXcopwdp5E3jn2", "effects": { "checkpoint": { "sequenceNumber": 2 @@ -290,7 +290,7 @@ Response: { { "cursor": "eyJjIjo0LCJ0Ijo4LCJpIjpmYWxzZX0", "node": { - "digest": "4kA8BHJRwCdE8BjFTpTfSGt9nvoii37twZRM91uxMuvi", + "digest": "HmHRDzEysmLNnMmwwFfehYukrz8hBKdV35W27g2dGcA6", "effects": { "checkpoint": { "sequenceNumber": 3 @@ -318,7 +318,7 @@ Response: { { "cursor": "eyJjIjo0LCJ0IjoxMCwiaSI6ZmFsc2V9", "node": { - "digest": "Dqi2D27TQ531EiXzEonQGrANt8kJh9w5JZ6SMtmRpm9b", + "digest": "Ftg9H88N7ioz51UuwfzvksAwaKnD6izS6kZKVLs5kPoh", "effects": { "checkpoint": { "sequenceNumber": 3 diff --git a/crates/iota-graphql-e2e-tests/tests/transactions/scan_limit/le_page/first.move b/crates/iota-graphql-e2e-tests/tests/transactions/scan_limit/le_page/first.move index 8f14ce91b19..58d741d581c 100644 --- a/crates/iota-graphql-e2e-tests/tests/transactions/scan_limit/le_page/first.move +++ b/crates/iota-graphql-e2e-tests/tests/transactions/scan_limit/le_page/first.move @@ -6,7 +6,7 @@ // However, because we have a scanLimit of 2, we'll be limited to filtering only two candidate // transactions per page, of which one will match the filtering criteria. -//# init --protocol-version 1 --addresses Test=0x0 --accounts A B --simulator +//# init --protocol-version 3 --addresses Test=0x0 --accounts A B --simulator //# publish module Test::M1 { diff --git a/crates/iota-graphql-e2e-tests/tests/transactions/scan_limit/le_page/last.exp b/crates/iota-graphql-e2e-tests/tests/transactions/scan_limit/le_page/last.exp index 3330dbf0293..e2b3ff0f032 100644 --- a/crates/iota-graphql-e2e-tests/tests/transactions/scan_limit/le_page/last.exp +++ b/crates/iota-graphql-e2e-tests/tests/transactions/scan_limit/le_page/last.exp @@ -96,7 +96,7 @@ Response: { { "cursor": "eyJjIjozLCJ0IjoyLCJpIjpmYWxzZX0", "node": { - "digest": "EnWpFFgRUBm3LbuTfjJ6oF3RXVcnzpth6L9nn4Q18RNk", + "digest": "HaHDjFPNFmzEzGV15jqjHArnNQYN3wFCehawzgSjTPDC", "effects": { "checkpoint": { "sequenceNumber": 2 @@ -107,7 +107,7 @@ Response: { { "cursor": "eyJjIjozLCJ0IjozLCJpIjpmYWxzZX0", "node": { - "digest": "GA1cT6FjP8qBTMegHadnXpjq7kTkD4Fw68jDJPci9C9r", + "digest": "DJzyBdq9ukZfiNYfRm9vWi7aXqW97F1YfwdrtTycEs1m", "effects": { "checkpoint": { "sequenceNumber": 2 @@ -118,7 +118,7 @@ Response: { { "cursor": "eyJjIjozLCJ0Ijo0LCJpIjpmYWxzZX0", "node": { - "digest": "613degbde4DuvwwAZcQngGJzZkZ6GZJ9g8CwygpA1s1a", + "digest": "5p4zvwg7nsiUAUdYdzoB9swbX49YkwxfoCVLYvyUQvw5", "effects": { "checkpoint": { "sequenceNumber": 2 @@ -129,7 +129,7 @@ Response: { { "cursor": "eyJjIjozLCJ0Ijo1LCJpIjpmYWxzZX0", "node": { - "digest": "GELgyKASGaZrZrgUw3C3TwaYjXwRme8StabM1zRrHDc7", + "digest": "AohmvfnFhqjmhMr4AvnEsVXHpuTne7xnFdNfZ98cEPP2", "effects": { "checkpoint": { "sequenceNumber": 2 @@ -140,7 +140,7 @@ Response: { { "cursor": "eyJjIjozLCJ0Ijo2LCJpIjpmYWxzZX0", "node": { - "digest": "AYmLYSfPbk4sVdBLcV76UmZgPTETP7XsVCaNKHTJ5qzs", + "digest": "57kQ1GWYJ16691C3z6roPwP9zoH4ZZXXcopwdp5E3jn2", "effects": { "checkpoint": { "sequenceNumber": 2 @@ -151,7 +151,7 @@ Response: { { "cursor": "eyJjIjozLCJ0Ijo3LCJpIjpmYWxzZX0", "node": { - "digest": "CkoEZRVMsPm3VJbX7gdwTrmfVMyHyNWDMk7tPKR6DdF2", + "digest": "89KDnhtw8jSB5ULTUJFrycuJ85D3owK5RGWtWRJmysRn", "effects": { "checkpoint": { "sequenceNumber": 3 @@ -162,7 +162,7 @@ Response: { { "cursor": "eyJjIjozLCJ0Ijo4LCJpIjpmYWxzZX0", "node": { - "digest": "4kA8BHJRwCdE8BjFTpTfSGt9nvoii37twZRM91uxMuvi", + "digest": "HmHRDzEysmLNnMmwwFfehYukrz8hBKdV35W27g2dGcA6", "effects": { "checkpoint": { "sequenceNumber": 3 @@ -173,7 +173,7 @@ Response: { { "cursor": "eyJjIjozLCJ0Ijo5LCJpIjpmYWxzZX0", "node": { - "digest": "ALqmnvW1wprABKAdtX8Zz49UYtTYshzXUC1fvsWx2ik9", + "digest": "BaKixTTzKMyJkmAndNNcfxFGz4gYmMJgu7GRk11zwYoi", "effects": { "checkpoint": { "sequenceNumber": 3 @@ -184,7 +184,7 @@ Response: { { "cursor": "eyJjIjozLCJ0IjoxMCwiaSI6ZmFsc2V9", "node": { - "digest": "Dqi2D27TQ531EiXzEonQGrANt8kJh9w5JZ6SMtmRpm9b", + "digest": "Ftg9H88N7ioz51UuwfzvksAwaKnD6izS6kZKVLs5kPoh", "effects": { "checkpoint": { "sequenceNumber": 3 @@ -195,7 +195,7 @@ Response: { { "cursor": "eyJjIjozLCJ0IjoxMSwiaSI6ZmFsc2V9", "node": { - "digest": "3Hs1AweW2BsmMaeicbKyhJ2DetgX5Q13Ev1S97wfBfHK", + "digest": "ANXXybMZSWDWK9pYe8Ztnxbh9GaiyX4dXA3wVdWZaxT1", "effects": { "checkpoint": { "sequenceNumber": 3 @@ -223,7 +223,7 @@ Response: { { "cursor": "eyJjIjozLCJ0IjoxMCwiaSI6ZmFsc2V9", "node": { - "digest": "Dqi2D27TQ531EiXzEonQGrANt8kJh9w5JZ6SMtmRpm9b", + "digest": "Ftg9H88N7ioz51UuwfzvksAwaKnD6izS6kZKVLs5kPoh", "effects": { "checkpoint": { "sequenceNumber": 3 @@ -251,7 +251,7 @@ Response: { { "cursor": "eyJjIjo0LCJ0Ijo4LCJpIjpmYWxzZX0", "node": { - "digest": "4kA8BHJRwCdE8BjFTpTfSGt9nvoii37twZRM91uxMuvi", + "digest": "HmHRDzEysmLNnMmwwFfehYukrz8hBKdV35W27g2dGcA6", "effects": { "checkpoint": { "sequenceNumber": 3 @@ -279,7 +279,7 @@ Response: { { "cursor": "eyJjIjo0LCJ0Ijo2LCJpIjpmYWxzZX0", "node": { - "digest": "AYmLYSfPbk4sVdBLcV76UmZgPTETP7XsVCaNKHTJ5qzs", + "digest": "57kQ1GWYJ16691C3z6roPwP9zoH4ZZXXcopwdp5E3jn2", "effects": { "checkpoint": { "sequenceNumber": 2 @@ -307,7 +307,7 @@ Response: { { "cursor": "eyJjIjo0LCJ0Ijo0LCJpIjpmYWxzZX0", "node": { - "digest": "613degbde4DuvwwAZcQngGJzZkZ6GZJ9g8CwygpA1s1a", + "digest": "5p4zvwg7nsiUAUdYdzoB9swbX49YkwxfoCVLYvyUQvw5", "effects": { "checkpoint": { "sequenceNumber": 2 @@ -335,7 +335,7 @@ Response: { { "cursor": "eyJjIjo0LCJ0IjoyLCJpIjpmYWxzZX0", "node": { - "digest": "EnWpFFgRUBm3LbuTfjJ6oF3RXVcnzpth6L9nn4Q18RNk", + "digest": "HaHDjFPNFmzEzGV15jqjHArnNQYN3wFCehawzgSjTPDC", "effects": { "checkpoint": { "sequenceNumber": 2 diff --git a/crates/iota-graphql-e2e-tests/tests/transactions/scan_limit/le_page/last.move b/crates/iota-graphql-e2e-tests/tests/transactions/scan_limit/le_page/last.move index cd4d79a008f..ed80d9c5878 100644 --- a/crates/iota-graphql-e2e-tests/tests/transactions/scan_limit/le_page/last.move +++ b/crates/iota-graphql-e2e-tests/tests/transactions/scan_limit/le_page/last.move @@ -6,7 +6,7 @@ // However, because we have a scanLimit of 2, we'll be limited to filtering only two candidate // transactions per page, of which one will match the filtering criteria. -//# init --protocol-version 1 --addresses Test=0x0 --accounts A B --simulator +//# init --protocol-version 3 --addresses Test=0x0 --accounts A B --simulator //# publish module Test::M1 { diff --git a/crates/iota-graphql-e2e-tests/tests/transactions/scan_limit/require.exp b/crates/iota-graphql-e2e-tests/tests/transactions/scan_limit/require.exp index f3a557539a2..9256ba2af53 100644 --- a/crates/iota-graphql-e2e-tests/tests/transactions/scan_limit/require.exp +++ b/crates/iota-graphql-e2e-tests/tests/transactions/scan_limit/require.exp @@ -94,7 +94,7 @@ Response: { }, "nodes": [ { - "digest": "ABweY1pDPKFhZX77kk48ofYU9KpAvXHBZUYyPK8JZf8p", + "digest": "EbDGGG7J7UrDdsn6F1C8puthPhTAyCbP8zJamEmXrvH4", "effects": { "checkpoint": { "sequenceNumber": 2 @@ -102,7 +102,7 @@ Response: { } }, { - "digest": "8v4rn79YoSv3Drbkqbz8ttsX7EJDPEoDNbvLXpZnNXvE", + "digest": "ovzzHxewTojtxtEmjJNWFJZuD8MuP6NDxUafmf4z8tf", "effects": { "checkpoint": { "sequenceNumber": 2 @@ -110,7 +110,7 @@ Response: { } }, { - "digest": "DeaCABc78S9mn6vSdNcNpabxYuazUfc1gsb87KMKbcyk", + "digest": "3EEE6qLkWUHTKao12yX2Z5Wa24xpArFuXXdxUm8bACqf", "effects": { "checkpoint": { "sequenceNumber": 2 @@ -118,7 +118,7 @@ Response: { } }, { - "digest": "6YBm7aNbGN3XrFBmateAnVZ1tCdi2sattswFEHJztyrB", + "digest": "F7z3hxsjWK8Rwh1ATL55HLJE6K3vS2V8n2JipmXGiu8d", "effects": { "checkpoint": { "sequenceNumber": 2 @@ -126,7 +126,7 @@ Response: { } }, { - "digest": "Gb2DhrKwqpXxHGt7q8XN5arTdGHf1fBKu8h8a86KYWR7", + "digest": "J7DwztQx1iKJdpmaSjt2PEJCM8VZXJMxVFpTcLPyCE8q", "effects": { "checkpoint": { "sequenceNumber": 2 @@ -134,7 +134,7 @@ Response: { } }, { - "digest": "DigC9u79Qh7rJB9jkthYucTwZmrrnB9j9Ggf7r8wZZYZ", + "digest": "7ef7k6w9ML8t4ifRD9eMNoDGbFxRqsGttupE3opzkKjM", "effects": { "checkpoint": { "sequenceNumber": 3 @@ -142,7 +142,7 @@ Response: { } }, { - "digest": "CMWP39HwdMdEhgHh54EonhUkmG3B5xTBdsxy493DfAxa", + "digest": "7XbbNMaQUR1R3ZujV2LKJA73HpBG8s9vAy2JTXRMgcxe", "effects": { "checkpoint": { "sequenceNumber": 3 @@ -150,7 +150,7 @@ Response: { } }, { - "digest": "k7uqYEVDRKmcSV51NiyNASiTM6SnrFGSV4DmvWvPt2R", + "digest": "FUioT54RTwJ3UbXfUF9TTZFDU7PsuNzZsBH7Z9egjNg4", "effects": { "checkpoint": { "sequenceNumber": 3 @@ -158,7 +158,7 @@ Response: { } }, { - "digest": "3FjYZKGUcbVYqHKSvzPuWJBTBtZHQMkVC6e23dPBLkxy", + "digest": "GPUnTY7eUNa6Uopm6oqtwuRAjNV4JyBPwGT61U6dK8A6", "effects": { "checkpoint": { "sequenceNumber": 3 @@ -166,7 +166,7 @@ Response: { } }, { - "digest": "9c34rk4iWpmURFjPQNXCHCTFZXXwYwDXgBKn22q674jE", + "digest": "2vpWJcdbASSzWB5febpoC9Qi6kX9fF2rHJCsnzzgs6sN", "effects": { "checkpoint": { "sequenceNumber": 3 @@ -191,7 +191,7 @@ Response: { }, "nodes": [ { - "digest": "ABweY1pDPKFhZX77kk48ofYU9KpAvXHBZUYyPK8JZf8p", + "digest": "EbDGGG7J7UrDdsn6F1C8puthPhTAyCbP8zJamEmXrvH4", "effects": { "checkpoint": { "sequenceNumber": 2 @@ -199,7 +199,7 @@ Response: { } }, { - "digest": "8v4rn79YoSv3Drbkqbz8ttsX7EJDPEoDNbvLXpZnNXvE", + "digest": "ovzzHxewTojtxtEmjJNWFJZuD8MuP6NDxUafmf4z8tf", "effects": { "checkpoint": { "sequenceNumber": 2 @@ -207,7 +207,7 @@ Response: { } }, { - "digest": "DeaCABc78S9mn6vSdNcNpabxYuazUfc1gsb87KMKbcyk", + "digest": "3EEE6qLkWUHTKao12yX2Z5Wa24xpArFuXXdxUm8bACqf", "effects": { "checkpoint": { "sequenceNumber": 2 @@ -215,7 +215,7 @@ Response: { } }, { - "digest": "6YBm7aNbGN3XrFBmateAnVZ1tCdi2sattswFEHJztyrB", + "digest": "F7z3hxsjWK8Rwh1ATL55HLJE6K3vS2V8n2JipmXGiu8d", "effects": { "checkpoint": { "sequenceNumber": 2 @@ -223,7 +223,7 @@ Response: { } }, { - "digest": "Gb2DhrKwqpXxHGt7q8XN5arTdGHf1fBKu8h8a86KYWR7", + "digest": "J7DwztQx1iKJdpmaSjt2PEJCM8VZXJMxVFpTcLPyCE8q", "effects": { "checkpoint": { "sequenceNumber": 2 @@ -231,7 +231,7 @@ Response: { } }, { - "digest": "DigC9u79Qh7rJB9jkthYucTwZmrrnB9j9Ggf7r8wZZYZ", + "digest": "7ef7k6w9ML8t4ifRD9eMNoDGbFxRqsGttupE3opzkKjM", "effects": { "checkpoint": { "sequenceNumber": 3 @@ -239,7 +239,7 @@ Response: { } }, { - "digest": "CMWP39HwdMdEhgHh54EonhUkmG3B5xTBdsxy493DfAxa", + "digest": "7XbbNMaQUR1R3ZujV2LKJA73HpBG8s9vAy2JTXRMgcxe", "effects": { "checkpoint": { "sequenceNumber": 3 @@ -247,7 +247,7 @@ Response: { } }, { - "digest": "k7uqYEVDRKmcSV51NiyNASiTM6SnrFGSV4DmvWvPt2R", + "digest": "FUioT54RTwJ3UbXfUF9TTZFDU7PsuNzZsBH7Z9egjNg4", "effects": { "checkpoint": { "sequenceNumber": 3 @@ -255,7 +255,7 @@ Response: { } }, { - "digest": "3FjYZKGUcbVYqHKSvzPuWJBTBtZHQMkVC6e23dPBLkxy", + "digest": "GPUnTY7eUNa6Uopm6oqtwuRAjNV4JyBPwGT61U6dK8A6", "effects": { "checkpoint": { "sequenceNumber": 3 @@ -263,7 +263,7 @@ Response: { } }, { - "digest": "9c34rk4iWpmURFjPQNXCHCTFZXXwYwDXgBKn22q674jE", + "digest": "2vpWJcdbASSzWB5febpoC9Qi6kX9fF2rHJCsnzzgs6sN", "effects": { "checkpoint": { "sequenceNumber": 3 @@ -311,7 +311,7 @@ Response: { }, "nodes": [ { - "digest": "ABweY1pDPKFhZX77kk48ofYU9KpAvXHBZUYyPK8JZf8p", + "digest": "EbDGGG7J7UrDdsn6F1C8puthPhTAyCbP8zJamEmXrvH4", "effects": { "checkpoint": { "sequenceNumber": 2 @@ -319,7 +319,7 @@ Response: { } }, { - "digest": "8v4rn79YoSv3Drbkqbz8ttsX7EJDPEoDNbvLXpZnNXvE", + "digest": "ovzzHxewTojtxtEmjJNWFJZuD8MuP6NDxUafmf4z8tf", "effects": { "checkpoint": { "sequenceNumber": 2 @@ -327,7 +327,7 @@ Response: { } }, { - "digest": "DeaCABc78S9mn6vSdNcNpabxYuazUfc1gsb87KMKbcyk", + "digest": "3EEE6qLkWUHTKao12yX2Z5Wa24xpArFuXXdxUm8bACqf", "effects": { "checkpoint": { "sequenceNumber": 2 @@ -335,7 +335,7 @@ Response: { } }, { - "digest": "6YBm7aNbGN3XrFBmateAnVZ1tCdi2sattswFEHJztyrB", + "digest": "F7z3hxsjWK8Rwh1ATL55HLJE6K3vS2V8n2JipmXGiu8d", "effects": { "checkpoint": { "sequenceNumber": 2 @@ -343,7 +343,7 @@ Response: { } }, { - "digest": "Gb2DhrKwqpXxHGt7q8XN5arTdGHf1fBKu8h8a86KYWR7", + "digest": "J7DwztQx1iKJdpmaSjt2PEJCM8VZXJMxVFpTcLPyCE8q", "effects": { "checkpoint": { "sequenceNumber": 2 @@ -351,7 +351,7 @@ Response: { } }, { - "digest": "DigC9u79Qh7rJB9jkthYucTwZmrrnB9j9Ggf7r8wZZYZ", + "digest": "7ef7k6w9ML8t4ifRD9eMNoDGbFxRqsGttupE3opzkKjM", "effects": { "checkpoint": { "sequenceNumber": 3 @@ -359,7 +359,7 @@ Response: { } }, { - "digest": "CMWP39HwdMdEhgHh54EonhUkmG3B5xTBdsxy493DfAxa", + "digest": "7XbbNMaQUR1R3ZujV2LKJA73HpBG8s9vAy2JTXRMgcxe", "effects": { "checkpoint": { "sequenceNumber": 3 @@ -367,7 +367,7 @@ Response: { } }, { - "digest": "k7uqYEVDRKmcSV51NiyNASiTM6SnrFGSV4DmvWvPt2R", + "digest": "FUioT54RTwJ3UbXfUF9TTZFDU7PsuNzZsBH7Z9egjNg4", "effects": { "checkpoint": { "sequenceNumber": 3 @@ -375,7 +375,7 @@ Response: { } }, { - "digest": "3FjYZKGUcbVYqHKSvzPuWJBTBtZHQMkVC6e23dPBLkxy", + "digest": "GPUnTY7eUNa6Uopm6oqtwuRAjNV4JyBPwGT61U6dK8A6", "effects": { "checkpoint": { "sequenceNumber": 3 @@ -383,7 +383,7 @@ Response: { } }, { - "digest": "9c34rk4iWpmURFjPQNXCHCTFZXXwYwDXgBKn22q674jE", + "digest": "2vpWJcdbASSzWB5febpoC9Qi6kX9fF2rHJCsnzzgs6sN", "effects": { "checkpoint": { "sequenceNumber": 3 @@ -431,7 +431,7 @@ Response: { }, "nodes": [ { - "digest": "ABweY1pDPKFhZX77kk48ofYU9KpAvXHBZUYyPK8JZf8p", + "digest": "EbDGGG7J7UrDdsn6F1C8puthPhTAyCbP8zJamEmXrvH4", "effects": { "checkpoint": { "sequenceNumber": 2 @@ -439,7 +439,7 @@ Response: { } }, { - "digest": "8v4rn79YoSv3Drbkqbz8ttsX7EJDPEoDNbvLXpZnNXvE", + "digest": "ovzzHxewTojtxtEmjJNWFJZuD8MuP6NDxUafmf4z8tf", "effects": { "checkpoint": { "sequenceNumber": 2 @@ -447,7 +447,7 @@ Response: { } }, { - "digest": "DeaCABc78S9mn6vSdNcNpabxYuazUfc1gsb87KMKbcyk", + "digest": "3EEE6qLkWUHTKao12yX2Z5Wa24xpArFuXXdxUm8bACqf", "effects": { "checkpoint": { "sequenceNumber": 2 @@ -455,7 +455,7 @@ Response: { } }, { - "digest": "6YBm7aNbGN3XrFBmateAnVZ1tCdi2sattswFEHJztyrB", + "digest": "F7z3hxsjWK8Rwh1ATL55HLJE6K3vS2V8n2JipmXGiu8d", "effects": { "checkpoint": { "sequenceNumber": 2 @@ -463,7 +463,7 @@ Response: { } }, { - "digest": "Gb2DhrKwqpXxHGt7q8XN5arTdGHf1fBKu8h8a86KYWR7", + "digest": "J7DwztQx1iKJdpmaSjt2PEJCM8VZXJMxVFpTcLPyCE8q", "effects": { "checkpoint": { "sequenceNumber": 2 @@ -471,7 +471,7 @@ Response: { } }, { - "digest": "DigC9u79Qh7rJB9jkthYucTwZmrrnB9j9Ggf7r8wZZYZ", + "digest": "7ef7k6w9ML8t4ifRD9eMNoDGbFxRqsGttupE3opzkKjM", "effects": { "checkpoint": { "sequenceNumber": 3 @@ -479,7 +479,7 @@ Response: { } }, { - "digest": "CMWP39HwdMdEhgHh54EonhUkmG3B5xTBdsxy493DfAxa", + "digest": "7XbbNMaQUR1R3ZujV2LKJA73HpBG8s9vAy2JTXRMgcxe", "effects": { "checkpoint": { "sequenceNumber": 3 @@ -487,7 +487,7 @@ Response: { } }, { - "digest": "k7uqYEVDRKmcSV51NiyNASiTM6SnrFGSV4DmvWvPt2R", + "digest": "FUioT54RTwJ3UbXfUF9TTZFDU7PsuNzZsBH7Z9egjNg4", "effects": { "checkpoint": { "sequenceNumber": 3 @@ -495,7 +495,7 @@ Response: { } }, { - "digest": "3FjYZKGUcbVYqHKSvzPuWJBTBtZHQMkVC6e23dPBLkxy", + "digest": "GPUnTY7eUNa6Uopm6oqtwuRAjNV4JyBPwGT61U6dK8A6", "effects": { "checkpoint": { "sequenceNumber": 3 @@ -503,7 +503,7 @@ Response: { } }, { - "digest": "9c34rk4iWpmURFjPQNXCHCTFZXXwYwDXgBKn22q674jE", + "digest": "2vpWJcdbASSzWB5febpoC9Qi6kX9fF2rHJCsnzzgs6sN", "effects": { "checkpoint": { "sequenceNumber": 3 @@ -592,7 +592,7 @@ Response: { { "cursor": "eyJjIjozLCJ0IjoyLCJpIjpmYWxzZX0", "node": { - "digest": "ABweY1pDPKFhZX77kk48ofYU9KpAvXHBZUYyPK8JZf8p", + "digest": "EbDGGG7J7UrDdsn6F1C8puthPhTAyCbP8zJamEmXrvH4", "effects": { "checkpoint": { "sequenceNumber": 2 diff --git a/crates/iota-graphql-e2e-tests/tests/transactions/scan_limit/require.move b/crates/iota-graphql-e2e-tests/tests/transactions/scan_limit/require.move index ecd32122627..a2eadb876c5 100644 --- a/crates/iota-graphql-e2e-tests/tests/transactions/scan_limit/require.move +++ b/crates/iota-graphql-e2e-tests/tests/transactions/scan_limit/require.move @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -//# init --protocol-version 1 --addresses Test=0x0 --accounts A B --simulator +//# init --protocol-version 3 --addresses Test=0x0 --accounts A B --simulator //# publish module Test::M1 { diff --git a/crates/iota-graphql-e2e-tests/tests/transactions/shared.exp b/crates/iota-graphql-e2e-tests/tests/transactions/shared.exp index 13ed627e781..6c35b3ee6c9 100644 --- a/crates/iota-graphql-e2e-tests/tests/transactions/shared.exp +++ b/crates/iota-graphql-e2e-tests/tests/transactions/shared.exp @@ -42,7 +42,7 @@ Response: { "transactions": { "nodes": [ { - "package": "0xf40350dd9cb77160579b0e2511443ac8079495baf4a63202dc7a62b1a383a181", + "package": "0x0f785d8315ad19c0ad6f7415b518d775e963dc5457df45e92c3ba2fcca766537", "module": "m", "functionName": "get" } @@ -55,17 +55,17 @@ Response: { "nodes": [ { "__typename": "SharedObjectRead", - "address": "0xa2f6f4538016aceca519479b3992959c2bb84f2a95db0cff1415422fa499ddbe", + "address": "0x6f07b78ba9141b1a7a6b729880fc9b63b12e557313134c722f2b04169c853a1a", "version": 2, - "digest": "53nzg2NiA6eZd4BxKfy88MmasZSGRat3313Azf266AfJ", + "digest": "bLhuLwagCRxcGmFWMCg9GDDziJhA9u5zqKfpQ81Tn2g", "object": { "asMoveObject": { "contents": { "type": { - "repr": "0xf40350dd9cb77160579b0e2511443ac8079495baf4a63202dc7a62b1a383a181::m::Foo" + "repr": "0x0f785d8315ad19c0ad6f7415b518d775e963dc5457df45e92c3ba2fcca766537::m::Foo" }, "json": { - "id": "0xa2f6f4538016aceca519479b3992959c2bb84f2a95db0cff1415422fa499ddbe", + "id": "0x6f07b78ba9141b1a7a6b729880fc9b63b12e557313134c722f2b04169c853a1a", "x": "0" } } @@ -82,7 +82,7 @@ Response: { "transactions": { "nodes": [ { - "package": "0xf40350dd9cb77160579b0e2511443ac8079495baf4a63202dc7a62b1a383a181", + "package": "0x0f785d8315ad19c0ad6f7415b518d775e963dc5457df45e92c3ba2fcca766537", "module": "m", "functionName": "inc" } @@ -102,12 +102,12 @@ Response: { "transactions": { "nodes": [ { - "package": "0xf40350dd9cb77160579b0e2511443ac8079495baf4a63202dc7a62b1a383a181", + "package": "0x0f785d8315ad19c0ad6f7415b518d775e963dc5457df45e92c3ba2fcca766537", "module": "m", "functionName": "get" }, { - "package": "0xf40350dd9cb77160579b0e2511443ac8079495baf4a63202dc7a62b1a383a181", + "package": "0x0f785d8315ad19c0ad6f7415b518d775e963dc5457df45e92c3ba2fcca766537", "module": "m", "functionName": "inc" } diff --git a/crates/iota-graphql-e2e-tests/tests/transactions/shared.move b/crates/iota-graphql-e2e-tests/tests/transactions/shared.move index ccccc98a607..cfde0386747 100644 --- a/crates/iota-graphql-e2e-tests/tests/transactions/shared.move +++ b/crates/iota-graphql-e2e-tests/tests/transactions/shared.move @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -//# init --protocol-version 1 --addresses P0=0x0 --simulator +//# init --protocol-version 3 --addresses P0=0x0 --simulator //# publish module P0::m { diff --git a/crates/iota-graphql-e2e-tests/tests/transactions/system.exp b/crates/iota-graphql-e2e-tests/tests/transactions/system.exp index bdad7857c2f..e7fec8f39e5 100644 --- a/crates/iota-graphql-e2e-tests/tests/transactions/system.exp +++ b/crates/iota-graphql-e2e-tests/tests/transactions/system.exp @@ -7,7 +7,7 @@ Response: { "transactionBlocks": { "nodes": [ { - "digest": "EjxArvXVR7U8yu5Yi2oDmELwV74gwJFinZKhnPuTKj83", + "digest": "HA4up8t27PnLk1un1DvTbctYWMRp2AMzkMbJLDeGVopQ", "sender": null, "signatures": [ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==" @@ -407,7 +407,7 @@ Response: { "json": { "id": "0x0000000000000000000000000000000000000000000000000000000000000008", "inner": { - "id": "0x3f92eceed239ba443daf612dcdf621f85feba71f3698d53c9f2a6e4b4246b1c6", + "id": "0x087e07e48f02e1757a9a06af5c2be59dfc1a5717fe305d79fd77c5b3350426bc", "version": "1" } } @@ -489,7 +489,7 @@ Response: { "json": { "id": "0x0000000000000000000000000000000000000000000000000000000000000403", "lists": { - "id": "0x799c22e253a384f3545724b35277ac6b27595603f051828e5f4cece335c1cf1c", + "id": "0xd221ff85aa726e3a39d3d1d3969341c10000dd4cf7a550e0319d6424bc755f95", "size": "0" } } @@ -586,18 +586,18 @@ Response: { { "cursor": "eyJpIjo5LCJjIjowfQ", "node": { - "address": "0x1b19651d3c2723e7f6c1eca23c13b72cd7f274524223391e75994dad311828df", + "address": "0x2c7f8520eacbe6e27a4a61d113ba4baf08de78c9a1e50fee95763451d410f0c6", "asMoveObject": { "contents": { "type": { - "repr": "0x0000000000000000000000000000000000000000000000000000000000000002::dynamic_field::Field" + "repr": "0x0000000000000000000000000000000000000000000000000000000000000003::staking_pool::StakedIota" }, "json": { - "id": "0x1b19651d3c2723e7f6c1eca23c13b72cd7f274524223391e75994dad311828df", - "name": "0", - "value": { - "iota_amount": "0", - "pool_token_amount": "0" + "id": "0x2c7f8520eacbe6e27a4a61d113ba4baf08de78c9a1e50fee95763451d410f0c6", + "pool_id": "0x05c2a0cbbad1a47da3d5ec68021869986e9dd70b57d9e64f020bb138dbe842c8", + "stake_activation_epoch": "0", + "principal": { + "value": "1500000000000000" } } } @@ -608,14 +608,92 @@ Response: { { "cursor": "eyJpIjoxMCwiYyI6MH0", "node": { - "address": "0x27982f48a697a9f61e3f738993c2d00e16b89938eedb74af1849ba6c6d82303b", + "address": "0x36b1836eb54ee1b5e86133199c8f9d75b7bc99f7b5d88f574a2a210f4288d0b4", + "asMoveObject": { + "contents": { + "type": { + "repr": "0x0000000000000000000000000000000000000000000000000000000000000002::coin::CoinMetadata<0x0000000000000000000000000000000000000000000000000000000000000002::iota::IOTA>" + }, + "json": { + "id": "0x36b1836eb54ee1b5e86133199c8f9d75b7bc99f7b5d88f574a2a210f4288d0b4", + "decimals": 9, + "name": "IOTA", + "symbol": "IOTA", + "description": "The main (gas)token of the IOTA Network.", + "icon_url": { + "url": "https://iota.org/logo.png" + } + } + } + }, + "asMovePackage": null + } + }, + { + "cursor": "eyJpIjoxMSwiYyI6MH0", + "node": { + "address": "0x398a1aa5ea188a9410153911506f47d0800414543bded1724e5db9b6ef7bcd0a", + "asMoveObject": { + "contents": { + "type": { + "repr": "0x0000000000000000000000000000000000000000000000000000000000000002::display::Display<0x000000000000000000000000000000000000000000000000000000000000107a::nft::Nft>" + }, + "json": { + "id": "0x398a1aa5ea188a9410153911506f47d0800414543bded1724e5db9b6ef7bcd0a", + "fields": { + "contents": [ + { + "key": "name", + "value": "{immutable_metadata.name}" + }, + { + "key": "image_url", + "value": "{immutable_metadata.uri}" + }, + { + "key": "description", + "value": "{immutable_metadata.description}" + }, + { + "key": "creator", + "value": "{immutable_metadata.issuer_name}" + }, + { + "key": "version", + "value": "{immutable_metadata.version}" + }, + { + "key": "media_type", + "value": "{immutable_metadata.media_type}" + }, + { + "key": "collection_name", + "value": "{immutable_metadata.collection_name}" + }, + { + "key": "immutable_issuer", + "value": "{immutable_issuer}" + } + ] + }, + "version": 1 + } + } + }, + "asMovePackage": null + } + }, + { + "cursor": "eyJpIjoxMiwiYyI6MH0", + "node": { + "address": "0x59960c037f5355cceb1ed7d285234b35012fbe18dbb7921ce3a518e15d807dea", "asMoveObject": { "contents": { "type": { "repr": "0x0000000000000000000000000000000000000000000000000000000000000002::coin::Coin<0x0000000000000000000000000000000000000000000000000000000000000002::iota::IOTA>" }, "json": { - "id": "0x27982f48a697a9f61e3f738993c2d00e16b89938eedb74af1849ba6c6d82303b", + "id": "0x59960c037f5355cceb1ed7d285234b35012fbe18dbb7921ce3a518e15d807dea", "balance": { "value": "30000000000000000" } @@ -626,7 +704,27 @@ Response: { } }, { - "cursor": "eyJpIjoxMSwiYyI6MH0", + "cursor": "eyJpIjoxMywiYyI6MH0", + "node": { + "address": "0x5ba4893be3938566e676ec9ded7f006ac2f8a5cf9713ff00880f4d8a2bd24434", + "asMoveObject": { + "contents": { + "type": { + "repr": "0x0000000000000000000000000000000000000000000000000000000000000002::coin::Coin<0x0000000000000000000000000000000000000000000000000000000000000002::iota::IOTA>" + }, + "json": { + "id": "0x5ba4893be3938566e676ec9ded7f006ac2f8a5cf9713ff00880f4d8a2bd24434", + "balance": { + "value": "300000000000000" + } + } + } + }, + "asMovePackage": null + } + }, + { + "cursor": "eyJpIjoxNCwiYyI6MH0", "node": { "address": "0x6af2a2b7ca60bf76174adfd3e9c4957f8e937759603182f9b46c7f6c5f19c6d2", "asMoveObject": { @@ -639,11 +737,11 @@ Response: { "name": "1", "value": { "epoch": "0", - "protocol_version": "1", + "protocol_version": "3", "system_state_version": "1", "iota_treasury_cap": { "inner": { - "id": "0x509e22a8bb835eeb98bed81a1a50c196383345279d4238f47714f2301c9bfbe6", + "id": "0xc15f6e44edf5e6fac2777ae0d03718609673544fc01c4b6ddcfe9ed29b3bfc16", "total_supply": { "value": "31800000000000000" } @@ -890,15 +988,15 @@ Response: { "next_epoch_p2p_address": null, "next_epoch_primary_address": null, "extra_fields": { - "id": "0x6c8759462593f9ef531bbec3f6402e9a9d53e369ecb7982b59635843471eb271", + "id": "0xeb22f95292675630311381ac30b8035d3d34e5b13706b14aef83f56fb5219104", "size": "0" } }, "voting_power": "10000", - "operation_cap_id": "0xa0f947f895ffe5715ab529ed16659e9c099bee48524f56c8d5a2eab8e842bd99", + "operation_cap_id": "0x9359d1eae7919936b04321b147376bb2c4d0e5a580544ccb85e88f57fb3bfe06", "gas_price": "1000", "staking_pool": { - "id": "0x7aea65806e468642f39bb0a0f7a40a4b16afc9588d1980e8d9a9d20936541b7e", + "id": "0x05c2a0cbbad1a47da3d5ec68021869986e9dd70b57d9e64f020bb138dbe842c8", "activation_epoch": "0", "deactivation_epoch": null, "iota_balance": "1500000000000000", @@ -907,14 +1005,14 @@ Response: { }, "pool_token_balance": "1500000000000000", "exchange_rates": { - "id": "0x044bc64e9c5eaa0143019c38bea813b1c288dc66272d74cf8a1821bf0eeac85f", + "id": "0x7a91f6ef9ac734a5fd196148b31dea99a6382bb60a51d254b49a1ae58971d3d0", "size": "1" }, "pending_stake": "0", "pending_total_iota_withdraw": "0", "pending_pool_token_withdraw": "0", "extra_fields": { - "id": "0xcc8c44fff5e1f3fdc63bd2597685dba922cce4809e2f960c8128dcbcb76c3712", + "id": "0x43ef1b2999e8c2138782f7c7256e7a7328a087d1ca54d436bad1e612ff3895d7", "size": "0" } }, @@ -923,35 +1021,35 @@ Response: { "next_epoch_gas_price": "1000", "next_epoch_commission_rate": "200", "extra_fields": { - "id": "0x9a75ea182d4788588f2e81034a8a57034da6284a66159cd3289cb352e3a845aa", + "id": "0x46905279408a6ebdc8d6f376ed34b4a7653e701214874c764d0b240bc3233e56", "size": "0" } } ], "pending_active_validators": { "contents": { - "id": "0x31b89b7b349cf41a62274ebd1ef2c2789fa86b68270d9feefb7a62741d1f8e86", + "id": "0xa292cc32e3ef38fc736bf882953228f189e57e6102dff74ac640ab20d0a97b68", "size": "0" } }, "pending_removals": [], "staking_pool_mappings": { - "id": "0x6025058d2b6287ffad433b714c9a573fe15ba477a4f47862b5088ca5938cded3", + "id": "0x7306811a2d1ccba1979366cfac72b6e0bbb25830621beb3a763d82c8432c2548", "size": "1" }, "inactive_validators": { - "id": "0xaaf430f2910eb82232f946c1bda701ecb8f2c1f6928a9099ae80f5afc85fb69c", + "id": "0x4577cd777ee8f12d682dd4d86b4316d88920d01641a35fdd912c281c3918ec19", "size": "0" }, "validator_candidates": { - "id": "0xd2789ba6e8f5c3241a6d12bedc3055e57aeac6e92bf182ef7737c6533d7a22f9", + "id": "0xe08408f1bfb39d546b658cde0ab9ca8363a13a64e8aa943c37c29e2cd0ac2af7", "size": "0" }, "at_risk_validators": { "contents": [] }, "extra_fields": { - "id": "0x62d408b9b0b3c458c8424f68a6622c534d3023ce93368b5a412bd4dc665a8ebf", + "id": "0x504a9178ee1993dfc19e1cdf815cc71e78a11e3dd4cba609c407b0d8873b2be0", "size": "0" } }, @@ -972,7 +1070,7 @@ Response: { "validator_very_low_stake_threshold": "1000000000000000", "validator_low_stake_grace_period": "7", "extra_fields": { - "id": "0x61b4baf4a2f43504215e4131c43852e24775aa0afeef0628a113228ef41c7813", + "id": "0x0c77a159e1ae881ab41774c7c14c684b9385dd9cde74150bc3c80160583ccb2f", "size": "0" } }, @@ -994,7 +1092,7 @@ Response: { "safe_mode_non_refundable_storage_fee": "0", "epoch_start_timestamp_ms": "0", "extra_fields": { - "id": "0x5dc4c87d84a69a6b0f51a38b24cd4c9833b79c2a2e249dc1f24794961bfc76c1", + "id": "0x117ad5f40111d3a0c25a0ac46c76070270e52648085320c0e81d1124a8f03d3a", "size": "0" } } @@ -1005,35 +1103,17 @@ Response: { } }, { - "cursor": "eyJpIjoxMiwiYyI6MH0", - "node": { - "address": "0xa0f947f895ffe5715ab529ed16659e9c099bee48524f56c8d5a2eab8e842bd99", - "asMoveObject": { - "contents": { - "type": { - "repr": "0x0000000000000000000000000000000000000000000000000000000000000003::validator_cap::UnverifiedValidatorOperationCap" - }, - "json": { - "id": "0xa0f947f895ffe5715ab529ed16659e9c099bee48524f56c8d5a2eab8e842bd99", - "authorizer_validator_address": "0x28f02a953f3553f51a9365593c7d4bd0643d2085f004b18c6ca9de51682b2c80" - } - } - }, - "asMovePackage": null - } - }, - { - "cursor": "eyJpIjoxMywiYyI6MH0", + "cursor": "eyJpIjoxNSwiYyI6MH0", "node": { - "address": "0xbb5caa62668e66be9dd0a5a74534814bf789fd6ab6335e08eff62a58ee1f287e", + "address": "0x7640a5451f1ceb353262d82aa933eef348c6800c4d37d1a113d1d31124240580", "asMoveObject": { "contents": { "type": { "repr": "0x0000000000000000000000000000000000000000000000000000000000000002::dynamic_field::Field<0x0000000000000000000000000000000000000000000000000000000000000002::object::ID,address>" }, "json": { - "id": "0xbb5caa62668e66be9dd0a5a74534814bf789fd6ab6335e08eff62a58ee1f287e", - "name": "0x7aea65806e468642f39bb0a0f7a40a4b16afc9588d1980e8d9a9d20936541b7e", + "id": "0x7640a5451f1ceb353262d82aa933eef348c6800c4d37d1a113d1d31124240580", + "name": "0x05c2a0cbbad1a47da3d5ec68021869986e9dd70b57d9e64f020bb138dbe842c8", "value": "0x28f02a953f3553f51a9365593c7d4bd0643d2085f004b18c6ca9de51682b2c80" } } @@ -1042,77 +1122,17 @@ Response: { } }, { - "cursor": "eyJpIjoxNCwiYyI6MH0", - "node": { - "address": "0xc28024efc650d31011065697e676b6738732dad9f709e54a13b116672c298f25", - "asMoveObject": { - "contents": { - "type": { - "repr": "0x0000000000000000000000000000000000000000000000000000000000000002::coin::CoinMetadata<0x0000000000000000000000000000000000000000000000000000000000000002::iota::IOTA>" - }, - "json": { - "id": "0xc28024efc650d31011065697e676b6738732dad9f709e54a13b116672c298f25", - "decimals": 9, - "name": "IOTA", - "symbol": "IOTA", - "description": "The main (gas)token of the IOTA Network.", - "icon_url": { - "url": "https://iota.org/logo.png" - } - } - } - }, - "asMovePackage": null - } - }, - { - "cursor": "eyJpIjoxNSwiYyI6MH0", + "cursor": "eyJpIjoxNiwiYyI6MH0", "node": { - "address": "0xc928f6f78781333f87efac974403df5a8565e3accb3c16a891a60a18dd2f2f42", + "address": "0x9359d1eae7919936b04321b147376bb2c4d0e5a580544ccb85e88f57fb3bfe06", "asMoveObject": { "contents": { "type": { - "repr": "0x0000000000000000000000000000000000000000000000000000000000000002::display::Display<0x000000000000000000000000000000000000000000000000000000000000107a::nft::Nft>" + "repr": "0x0000000000000000000000000000000000000000000000000000000000000003::validator_cap::UnverifiedValidatorOperationCap" }, "json": { - "id": "0xc928f6f78781333f87efac974403df5a8565e3accb3c16a891a60a18dd2f2f42", - "fields": { - "contents": [ - { - "key": "name", - "value": "{immutable_metadata.name}" - }, - { - "key": "image_url", - "value": "{immutable_metadata.uri}" - }, - { - "key": "description", - "value": "{immutable_metadata.description}" - }, - { - "key": "creator", - "value": "{immutable_metadata.issuer_name}" - }, - { - "key": "version", - "value": "{immutable_metadata.version}" - }, - { - "key": "media_type", - "value": "{immutable_metadata.media_type}" - }, - { - "key": "collection_name", - "value": "{immutable_metadata.collection_name}" - }, - { - "key": "immutable_issuer", - "value": "{immutable_issuer}" - } - ] - }, - "version": 1 + "id": "0x9359d1eae7919936b04321b147376bb2c4d0e5a580544ccb85e88f57fb3bfe06", + "authorizer_validator_address": "0x28f02a953f3553f51a9365593c7d4bd0643d2085f004b18c6ca9de51682b2c80" } } }, @@ -1120,20 +1140,20 @@ Response: { } }, { - "cursor": "eyJpIjoxNiwiYyI6MH0", + "cursor": "eyJpIjoxNywiYyI6MH0", "node": { - "address": "0xdd6b3a50df67a765e8c59bd37030224138f36bba296535846f490d8dede3c502", + "address": "0xaf46abe6b9b499da57800fe44fb6be5625b46905f87d865eff3906e33f1de65a", "asMoveObject": { "contents": { "type": { - "repr": "0x0000000000000000000000000000000000000000000000000000000000000003::staking_pool::StakedIota" + "repr": "0x0000000000000000000000000000000000000000000000000000000000000002::dynamic_field::Field" }, "json": { - "id": "0xdd6b3a50df67a765e8c59bd37030224138f36bba296535846f490d8dede3c502", - "pool_id": "0x7aea65806e468642f39bb0a0f7a40a4b16afc9588d1980e8d9a9d20936541b7e", - "stake_activation_epoch": "0", - "principal": { - "value": "1500000000000000" + "id": "0xaf46abe6b9b499da57800fe44fb6be5625b46905f87d865eff3906e33f1de65a", + "name": "0", + "value": { + "iota_amount": "0", + "pool_token_amount": "0" } } } @@ -1142,16 +1162,16 @@ Response: { } }, { - "cursor": "eyJpIjoxNywiYyI6MH0", + "cursor": "eyJpIjoxOCwiYyI6MH0", "node": { - "address": "0xe9ee601e69a2f4274ca5f23c16190823a7af496b5b9f2eac0d2c2645634b2737", + "address": "0xfcd138dc779f2208287655fb49de71e66cda1e8dba0624407c3a9fad28cdb944", "asMoveObject": { "contents": { "type": { "repr": "0x0000000000000000000000000000000000000000000000000000000000000002::dynamic_field::Field" }, "json": { - "id": "0xe9ee601e69a2f4274ca5f23c16190823a7af496b5b9f2eac0d2c2645634b2737", + "id": "0xfcd138dc779f2208287655fb49de71e66cda1e8dba0624407c3a9fad28cdb944", "name": "1", "value": { "version": "1", @@ -1164,26 +1184,6 @@ Response: { }, "asMovePackage": null } - }, - { - "cursor": "eyJpIjoxOCwiYyI6MH0", - "node": { - "address": "0xf22e2f7e20b84f57fdcf1f44c79c321533b922fa9488c23556356ae3f906b0bb", - "asMoveObject": { - "contents": { - "type": { - "repr": "0x0000000000000000000000000000000000000000000000000000000000000002::coin::Coin<0x0000000000000000000000000000000000000000000000000000000000000002::iota::IOTA>" - }, - "json": { - "id": "0xf22e2f7e20b84f57fdcf1f44c79c321533b922fa9488c23556356ae3f906b0bb", - "balance": { - "value": "300000000000000" - } - } - } - }, - "asMovePackage": null - } } ] } @@ -1225,7 +1225,7 @@ Response: { "idDeleted": false, "outputState": { "address": "0x0000000000000000000000000000000000000000000000000000000000000001", - "digest": "BWPzkyHoTWnZGNLBbza1xvEYP9hgm7dogXoi1DUjtpM7" + "digest": "7UFySuwUYdH2zABgJdY1psQjEczEfPvY9FrrNQagGnCp" } }, { @@ -1234,7 +1234,7 @@ Response: { "idDeleted": false, "outputState": { "address": "0x0000000000000000000000000000000000000000000000000000000000000002", - "digest": "63DagAxEDkLwscMq1tGaPAhLR9dCYKwMTRFZugpfDiMq" + "digest": "7Jhmz7CEjB6ndNqws1uZPG29ts1nH5tDTXwJvks2HJCL" } }, { @@ -1243,7 +1243,7 @@ Response: { "idDeleted": false, "outputState": { "address": "0x0000000000000000000000000000000000000000000000000000000000000003", - "digest": "3X6wUAwmH2pcVR5yHWcUMoJKs5gwhxfCRh42jq7xVZM3" + "digest": "5DgTiPyNzZGqxutLnJc58N2iLNdH2Asow723sSBWi1gA" } }, { @@ -1252,7 +1252,7 @@ Response: { "idDeleted": false, "outputState": { "address": "0x0000000000000000000000000000000000000000000000000000000000000005", - "digest": "6XeCa8r3ai3FXCgp2kcz85fDjW4rJ5FZLeQJf2Nzwm75" + "digest": "6F2JQrphEGNPFDmMoZUW3VtNsQ38P2xEqbYfwtgAzdUo" } }, { @@ -1261,7 +1261,7 @@ Response: { "idDeleted": false, "outputState": { "address": "0x0000000000000000000000000000000000000000000000000000000000000006", - "digest": "gCx8m8h2RGFjajzMdfBdk4MyevRi34XxhWobMZVRyZV" + "digest": "BrE9YtjinR8WtmugqQZyUa2myDu38zH3DcRTjLoyedFk" } }, { @@ -1270,7 +1270,7 @@ Response: { "idDeleted": false, "outputState": { "address": "0x0000000000000000000000000000000000000000000000000000000000000008", - "digest": "3oxqmiP9tw1RZ5idND2hZ6sQ7bCM8qU3MT7PYS8wWEuB" + "digest": "9UkS39k2xgNCu1W47nmUmaBkkjDJ9xzf7g7fT9ERRKdL" } }, { @@ -1279,7 +1279,7 @@ Response: { "idDeleted": false, "outputState": { "address": "0x000000000000000000000000000000000000000000000000000000000000000b", - "digest": "8m58ysCbvvBpAN54w4fww8Y6nXm4GAQfovuswD1vGFFP" + "digest": "AuzCeVavBdmNpRTcEqAEDnAJApbtGkUtVhpwZgmNy3Rq" } }, { @@ -1288,7 +1288,7 @@ Response: { "idDeleted": false, "outputState": { "address": "0x0000000000000000000000000000000000000000000000000000000000000403", - "digest": "Eg1CzeQBR3AGwxnDq8TJo8A9gHSZjFpXNMk8zeMc5jXe" + "digest": "9um7GQp72yV7a4J8Wvrhh8bpLJU7TDz64QhptKB8h9E2" } }, { @@ -1297,97 +1297,97 @@ Response: { "idDeleted": false, "outputState": { "address": "0x000000000000000000000000000000000000000000000000000000000000107a", - "digest": "Ds3kGXwgK3MWzFVW6wHPEDoPzLtU3mtRnvxF1PC7WTWp" + "digest": "tCFpGw6qvC3oDFBCXLvC8qbm4mxjAf2UjxbxytNoBXt" } }, { - "address": "0x1b19651d3c2723e7f6c1eca23c13b72cd7f274524223391e75994dad311828df", + "address": "0x2c7f8520eacbe6e27a4a61d113ba4baf08de78c9a1e50fee95763451d410f0c6", "idCreated": true, "idDeleted": false, "outputState": { - "address": "0x1b19651d3c2723e7f6c1eca23c13b72cd7f274524223391e75994dad311828df", - "digest": "EPdNi4i16VS8Ji3xn4DAPVAJ5xi4pZHpCXGuKbqeNkzz" + "address": "0x2c7f8520eacbe6e27a4a61d113ba4baf08de78c9a1e50fee95763451d410f0c6", + "digest": "FfPSmLHq4BSAvatR1zGxx7bLNdLbBKtLFcj7pLboJZyH" } }, { - "address": "0x27982f48a697a9f61e3f738993c2d00e16b89938eedb74af1849ba6c6d82303b", + "address": "0x36b1836eb54ee1b5e86133199c8f9d75b7bc99f7b5d88f574a2a210f4288d0b4", "idCreated": true, "idDeleted": false, "outputState": { - "address": "0x27982f48a697a9f61e3f738993c2d00e16b89938eedb74af1849ba6c6d82303b", - "digest": "GdkVYasCkoM1F9zBqytqzNtU5oKBsJnt7bvNeM7BQESg" + "address": "0x36b1836eb54ee1b5e86133199c8f9d75b7bc99f7b5d88f574a2a210f4288d0b4", + "digest": "APLnCXgk93zNmvjsDLvB7YVPQ5Hhw6vGhaTqnvVApVdj" } }, { - "address": "0x6af2a2b7ca60bf76174adfd3e9c4957f8e937759603182f9b46c7f6c5f19c6d2", + "address": "0x398a1aa5ea188a9410153911506f47d0800414543bded1724e5db9b6ef7bcd0a", "idCreated": true, "idDeleted": false, "outputState": { - "address": "0x6af2a2b7ca60bf76174adfd3e9c4957f8e937759603182f9b46c7f6c5f19c6d2", - "digest": "96gSoSvev5VaU8BfPEYSBpXkTfSLEhMjzcLtk3PAxBzn" + "address": "0x398a1aa5ea188a9410153911506f47d0800414543bded1724e5db9b6ef7bcd0a", + "digest": "5ZF9Rejpbm6bwMSHbYubwfzTmuqC5z5pkdk8Je5Ky7sT" } }, { - "address": "0xa0f947f895ffe5715ab529ed16659e9c099bee48524f56c8d5a2eab8e842bd99", + "address": "0x59960c037f5355cceb1ed7d285234b35012fbe18dbb7921ce3a518e15d807dea", "idCreated": true, "idDeleted": false, "outputState": { - "address": "0xa0f947f895ffe5715ab529ed16659e9c099bee48524f56c8d5a2eab8e842bd99", - "digest": "BNLVZMqwpvMRqGDAvLXND3zWvHJ3tcbfn5LgC1FvmNw7" + "address": "0x59960c037f5355cceb1ed7d285234b35012fbe18dbb7921ce3a518e15d807dea", + "digest": "7eSPEvysMcragu4j3jz232Yzq2k4KeZZukSD9PBzJmre" } }, { - "address": "0xbb5caa62668e66be9dd0a5a74534814bf789fd6ab6335e08eff62a58ee1f287e", + "address": "0x5ba4893be3938566e676ec9ded7f006ac2f8a5cf9713ff00880f4d8a2bd24434", "idCreated": true, "idDeleted": false, "outputState": { - "address": "0xbb5caa62668e66be9dd0a5a74534814bf789fd6ab6335e08eff62a58ee1f287e", - "digest": "713ee9qPuf6j6nXZVs6jQNaURCHXprZfwwbFnmuVRBDu" + "address": "0x5ba4893be3938566e676ec9ded7f006ac2f8a5cf9713ff00880f4d8a2bd24434", + "digest": "74Ahxwfe4tu6bANF1dhKmrUnFzzCY3AkHsRGpYK2jyJr" } }, { - "address": "0xc28024efc650d31011065697e676b6738732dad9f709e54a13b116672c298f25", + "address": "0x6af2a2b7ca60bf76174adfd3e9c4957f8e937759603182f9b46c7f6c5f19c6d2", "idCreated": true, "idDeleted": false, "outputState": { - "address": "0xc28024efc650d31011065697e676b6738732dad9f709e54a13b116672c298f25", - "digest": "BEPbAyocJgB6QtEAKQQUgyfYFf8RkWPWUpvRpuwobNHC" + "address": "0x6af2a2b7ca60bf76174adfd3e9c4957f8e937759603182f9b46c7f6c5f19c6d2", + "digest": "A37ZgmnXCRdm5v3yAkG56bP7hbkYjUj81VTgCCgXQGCm" } }, { - "address": "0xc928f6f78781333f87efac974403df5a8565e3accb3c16a891a60a18dd2f2f42", + "address": "0x7640a5451f1ceb353262d82aa933eef348c6800c4d37d1a113d1d31124240580", "idCreated": true, "idDeleted": false, "outputState": { - "address": "0xc928f6f78781333f87efac974403df5a8565e3accb3c16a891a60a18dd2f2f42", - "digest": "FzFjGUJ3FBJRZ4eVE7y9F3LRqxWyDY4JT1pmg7g1BU4X" + "address": "0x7640a5451f1ceb353262d82aa933eef348c6800c4d37d1a113d1d31124240580", + "digest": "2Uet64wgf5yqMNELAkYTsVqHb7yxuh9caD6yCVm7B2dc" } }, { - "address": "0xdd6b3a50df67a765e8c59bd37030224138f36bba296535846f490d8dede3c502", + "address": "0x9359d1eae7919936b04321b147376bb2c4d0e5a580544ccb85e88f57fb3bfe06", "idCreated": true, "idDeleted": false, "outputState": { - "address": "0xdd6b3a50df67a765e8c59bd37030224138f36bba296535846f490d8dede3c502", - "digest": "EJ4XFN8AQCbwg3rqF1uksR2gKLDyadnCN1dYvJ3Um713" + "address": "0x9359d1eae7919936b04321b147376bb2c4d0e5a580544ccb85e88f57fb3bfe06", + "digest": "CWiEcb4A3vxdW6gYURRnWzXi1fSr8kAFDkmotkAaSecv" } }, { - "address": "0xe9ee601e69a2f4274ca5f23c16190823a7af496b5b9f2eac0d2c2645634b2737", + "address": "0xaf46abe6b9b499da57800fe44fb6be5625b46905f87d865eff3906e33f1de65a", "idCreated": true, "idDeleted": false, "outputState": { - "address": "0xe9ee601e69a2f4274ca5f23c16190823a7af496b5b9f2eac0d2c2645634b2737", - "digest": "9oBq9oxHbMER3WeW5DudYyXecorCy5yjcaLJVBzrAJmw" + "address": "0xaf46abe6b9b499da57800fe44fb6be5625b46905f87d865eff3906e33f1de65a", + "digest": "56hwycrGTguejGkuRww33X6YkqRcm8zX8RzWHnXExTU6" } }, { - "address": "0xf22e2f7e20b84f57fdcf1f44c79c321533b922fa9488c23556356ae3f906b0bb", + "address": "0xfcd138dc779f2208287655fb49de71e66cda1e8dba0624407c3a9fad28cdb944", "idCreated": true, "idDeleted": false, "outputState": { - "address": "0xf22e2f7e20b84f57fdcf1f44c79c321533b922fa9488c23556356ae3f906b0bb", - "digest": "D6VFrTAqMGZjMktBnEhGkZ9MXyea8WisE4vdn8fBAjgV" + "address": "0xfcd138dc779f2208287655fb49de71e66cda1e8dba0624407c3a9fad28cdb944", + "digest": "5r2XEc2DfUdN8bZnp33bQRq3ppB8W4WfNnrDG9pL8q6u" } } ] @@ -1409,7 +1409,7 @@ Response: { "sequenceNumber": 0 }, "transactionBlock": { - "digest": "EjxArvXVR7U8yu5Yi2oDmELwV74gwJFinZKhnPuTKj83" + "digest": "HA4up8t27PnLk1un1DvTbctYWMRp2AMzkMbJLDeGVopQ" } }, "expiration": null @@ -1461,7 +1461,7 @@ Response: { "dependencies": { "nodes": [ { - "digest": "EjxArvXVR7U8yu5Yi2oDmELwV74gwJFinZKhnPuTKj83" + "digest": "HA4up8t27PnLk1un1DvTbctYWMRp2AMzkMbJLDeGVopQ" } ] }, @@ -1519,7 +1519,7 @@ Response: { "transactionBlocks": { "nodes": [ { - "digest": "7PLwaqn6pg198VkYmVKERZ2Qad3vDEWhfB7VRv5qDSc7", + "digest": "9ADUBQmAfCGqabFJTzw3VsybLPe28j7QTZ84xqbDRiVd", "sender": null, "signatures": [ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==" @@ -1543,7 +1543,7 @@ Response: { "node": { "__typename": "ChangeEpochTransaction", "epoch": null, - "protocolVersion": 1, + "protocolVersion": 3, "storageCharge": "0", "computationCharge": "0", "storageRebate": "0", @@ -1561,7 +1561,7 @@ Response: { "dependencies": { "nodes": [ { - "digest": "EjxArvXVR7U8yu5Yi2oDmELwV74gwJFinZKhnPuTKj83" + "digest": "HA4up8t27PnLk1un1DvTbctYWMRp2AMzkMbJLDeGVopQ" } ] }, @@ -1576,34 +1576,34 @@ Response: { "idDeleted": false, "outputState": { "address": "0x0000000000000000000000000000000000000000000000000000000000000005", - "digest": "G1xvDacDJsdTTLoLq8tjhLbTDCR6MYL9yVStX9e8GKi" + "digest": "6XciTcJGe1ojLheRewNPp2BBdt5CCUSzbMyhowmrG9tN" } }, { - "address": "0x0d8feaf1c714777ad5401781c55794e0b8f6dda166924176279914bed08951e0", + "address": "0x589e651bedffb1545420130fb727c2b7440d2616e73fba44b8faeb5faea30cb3", "idCreated": true, "idDeleted": false, "outputState": { - "address": "0x0d8feaf1c714777ad5401781c55794e0b8f6dda166924176279914bed08951e0", - "digest": "92GwpFNwQDbmoJRDkH6crad72SMMubKs3HdpMhncAwbp" + "address": "0x589e651bedffb1545420130fb727c2b7440d2616e73fba44b8faeb5faea30cb3", + "digest": "4i5J4zT287eApgZ1kErZsFvgUMH1Yx9RaNR1veh3hGb3" } }, { - "address": "0x4509fa198370254af0418248c9718bb206e810e1bce9fc8ffd0c500aef972f4d", - "idCreated": true, + "address": "0x6af2a2b7ca60bf76174adfd3e9c4957f8e937759603182f9b46c7f6c5f19c6d2", + "idCreated": false, "idDeleted": false, "outputState": { - "address": "0x4509fa198370254af0418248c9718bb206e810e1bce9fc8ffd0c500aef972f4d", - "digest": "5wumBetyyshU5rCK2f6GUDCohAWpmVrus9D4QS5bambg" + "address": "0x6af2a2b7ca60bf76174adfd3e9c4957f8e937759603182f9b46c7f6c5f19c6d2", + "digest": "GQ5Ntk3gZUZxVFBmEqPTP4NhQcuzq8ZqcoJfSztUTFtU" } }, { - "address": "0x6af2a2b7ca60bf76174adfd3e9c4957f8e937759603182f9b46c7f6c5f19c6d2", - "idCreated": false, + "address": "0x77ebd13ca27a089fcdfecdafe7a0e66e6e5e6778aa19d2f6f7bc94ec170ac35e", + "idCreated": true, "idDeleted": false, "outputState": { - "address": "0x6af2a2b7ca60bf76174adfd3e9c4957f8e937759603182f9b46c7f6c5f19c6d2", - "digest": "CNxCh8MK8JrDGgHFwQyJ3oBV6njo5bRSWcEy8HPAakha" + "address": "0x77ebd13ca27a089fcdfecdafe7a0e66e6e5e6778aa19d2f6f7bc94ec170ac35e", + "digest": "CRU1zaa52si82SonUoFsWYxk2LhkBbuidgJV4x7Grcbt" } } ] @@ -1625,7 +1625,7 @@ Response: { "sequenceNumber": 2 }, "transactionBlock": { - "digest": "7PLwaqn6pg198VkYmVKERZ2Qad3vDEWhfB7VRv5qDSc7" + "digest": "9ADUBQmAfCGqabFJTzw3VsybLPe28j7QTZ84xqbDRiVd" } }, "expiration": null diff --git a/crates/iota-graphql-e2e-tests/tests/transactions/system.move b/crates/iota-graphql-e2e-tests/tests/transactions/system.move index a3b4ee10b3e..4dd61a5b0c4 100644 --- a/crates/iota-graphql-e2e-tests/tests/transactions/system.move +++ b/crates/iota-graphql-e2e-tests/tests/transactions/system.move @@ -2,7 +2,7 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -//# init --protocol-version 1 --simulator +//# init --protocol-version 3 --simulator // Tests for representations of all the various system transactions diff --git a/crates/iota-graphql-e2e-tests/tests/validator/validator.move b/crates/iota-graphql-e2e-tests/tests/validator/validator.move index e455e09db87..19d18460378 100644 --- a/crates/iota-graphql-e2e-tests/tests/validator/validator.move +++ b/crates/iota-graphql-e2e-tests/tests/validator/validator.move @@ -4,7 +4,7 @@ // Test heavy transactions. -//# init --protocol-version 1 --simulator --accounts A --addresses P0=0x0 +//# init --protocol-version 3 --simulator --accounts A --addresses P0=0x0 //# advance-epoch diff --git a/crates/iota-graphql-rpc/README.md b/crates/iota-graphql-rpc/README.md index c7dadc63929..9f361220618 100644 --- a/crates/iota-graphql-rpc/README.md +++ b/crates/iota-graphql-rpc/README.md @@ -49,7 +49,7 @@ If you're using VS Code, make sure to update `settings.json` with the appropriat ### Using docker compose (recommended) -See [pg-services-local](../../docker/pg-services-local/README.md), which automatically sets up the GraphQL server along with an Indexer instance, the postgres database and a local network. +See [pg-services-local](../../dev-tools/pg-services-local/README.md), which automatically sets up the GraphQL server along with an Indexer instance, the postgres database and a local network. ### Using manual setup @@ -115,7 +115,7 @@ Find more example queries in the [examples](examples) directory. ### Launching the server with Indexer For local development, it might be useful to spin up an actual Indexer as well (not only the postgres instance) which writes data to the database, so you can query it with the GraphQL server. -You can run it with a local network using the `iota start` subcommand or [pg-services-local](../../docker/pg-services-local/README.md) or as a [standalone service](../iota-indexer/README.md#standalone-indexer-setup). +You can run it with a local network using the `iota start` subcommand or [pg-services-local](../../dev-tools/pg-services-local/README.md) or as a [standalone service](../iota-indexer/README.md#standalone-indexer-setup). To run it with the `iota start` subcommand, switch to the root directory of the repository and run the following command to start the Indexer with the Sync worker: diff --git a/crates/iota-graphql-rpc/schema.graphql b/crates/iota-graphql-rpc/schema.graphql index 8821213b8ef..ec5f1a351d7 100644 --- a/crates/iota-graphql-rpc/schema.graphql +++ b/crates/iota-graphql-rpc/schema.graphql @@ -951,7 +951,7 @@ of dynamic fields: an object stored in this kind of field will be considered wrapped and will not be accessible directly via its ID by external tools (explorers, wallets, etc) accessing storage. -2) Dynamic Object Fields values must be Iota objects (have the `key` and +2) Dynamic Object Fields values must be IOTA objects (have the `key` and `store` abilities, and id: UID as the first field), but will still be directly accessible off-chain via their object ID after being attached. """ @@ -1061,7 +1061,7 @@ type EndOfEpochTransactionKindEdge { } """ -Operation of the Iota network is temporally partitioned into non-overlapping +Operation of the IOTA network is temporally partitioned into non-overlapping epochs, and the network aims to keep epochs roughly the same duration as each other. During a particular epoch the following data is fixed: @@ -1664,7 +1664,7 @@ type MergeCoinsTransaction { } """ -Abilities are keywords in Iota Move that define how types behave at the +Abilities are keywords in IOTA Move that define how types behave at the compiler level. """ enum MoveAbility { @@ -2610,7 +2610,7 @@ enum MoveVisibility { } """ -Mutations are used to write to the Iota network. +Mutations are used to write to the IOTA network. """ type Mutation { """ @@ -2638,7 +2638,7 @@ type Mutation { } """ -An object in Iota is a package (set of Move bytecode modules) or object +An object in IOTA is a package (set of Move bytecode modules) or object (typed data structure with fields) with additional metadata detailing its id, version, transaction digest, owner field indicating how this object can be accessed. @@ -3279,7 +3279,7 @@ type Query { field when its parent was at `rootVersion`. If `rootVersion` is omitted, dynamic fields will be from a consistent - snapshot of the Iota state at the latest checkpoint known to the + snapshot of the IOTA state at the latest checkpoint known to the GraphQL RPC. Similarly, `Owner.asObject` will return the object's version at the latest checkpoint. """ diff --git a/crates/iota-graphql-rpc/src/commands.rs b/crates/iota-graphql-rpc/src/commands.rs index 0a3c4317242..f8ddacb7730 100644 --- a/crates/iota-graphql-rpc/src/commands.rs +++ b/crates/iota-graphql-rpc/src/commands.rs @@ -7,9 +7,9 @@ use std::path::PathBuf; use clap::*; #[derive(Parser)] -#[clap( +#[command( name = "iota-graphql-rpc", - about = "Iota GraphQL RPC", + about = "IOTA GraphQL RPC", rename_all = "kebab-case", author, version @@ -23,38 +23,38 @@ pub enum Command { }, GenerateSchema { /// Path to output GraphQL schema to, in SDL format. - #[clap(short, long)] + #[arg(short, long)] file: Option, }, StartServer { /// The title to display at the top of the page - #[clap(short, long)] + #[arg(short, long)] ide_title: Option, /// DB URL for data fetching - #[clap(short, long)] + #[arg(short, long)] db_url: Option, /// Pool size for DB connections - #[clap(long)] + #[arg(long)] db_pool_size: Option, /// Port to bind the server to - #[clap(short, long)] + #[arg(short, long)] port: Option, /// Host to bind the server to - #[clap(long)] + #[arg(long)] host: Option, /// Port to bind the prom server to - #[clap(long)] + #[arg(long)] prom_port: Option, /// Host to bind the prom server to - #[clap(long)] + #[arg(long)] prom_host: Option, /// Path to TOML file containing configuration for service. - #[clap(short, long)] + #[arg(short, long)] config: Option, /// RPC url to the Node for tx execution - #[clap(long)] + #[arg(long)] node_rpc_url: Option, }, } diff --git a/crates/iota-graphql-rpc/src/config.rs b/crates/iota-graphql-rpc/src/config.rs index 550482e4d9d..70e30f59370 100644 --- a/crates/iota-graphql-rpc/src/config.rs +++ b/crates/iota-graphql-rpc/src/config.rs @@ -439,7 +439,7 @@ impl Default for Versions { impl Default for Ide { fn default() -> Self { Self { - ide_title: "Iota GraphQL IDE".to_string(), + ide_title: "IOTA GraphQL IDE".to_string(), } } } diff --git a/crates/iota-graphql-rpc/src/mutation.rs b/crates/iota-graphql-rpc/src/mutation.rs index b236b6824a4..0cc7cfaadda 100644 --- a/crates/iota-graphql-rpc/src/mutation.rs +++ b/crates/iota-graphql-rpc/src/mutation.rs @@ -26,7 +26,7 @@ use crate::{ }; pub struct Mutation; -/// Mutations are used to write to the Iota network. +/// Mutations are used to write to the IOTA network. #[Object] impl Mutation { /// Execute a transaction, committing its effects on chain. @@ -56,11 +56,11 @@ impl Mutation { ) -> Result { let iota_sdk_client: &Option = ctx .data() - .map_err(|_| Error::Internal("Unable to fetch Iota SDK client".to_string())) + .map_err(|_| Error::Internal("Unable to fetch IOTA SDK client".to_string())) .extend()?; let iota_sdk_client = iota_sdk_client .as_ref() - .ok_or_else(|| Error::Internal("Iota SDK client not initialized".to_string())) + .ok_or_else(|| Error::Internal("IOTA SDK client not initialized".to_string())) .extend()?; let tx_data = bcs::from_bytes( &Base64::decode(&tx_bytes) diff --git a/crates/iota-graphql-rpc/src/server/exchange_rates_task.rs b/crates/iota-graphql-rpc/src/server/exchange_rates_task.rs index d39d8f3597c..e2d9b91f297 100644 --- a/crates/iota-graphql-rpc/src/server/exchange_rates_task.rs +++ b/crates/iota-graphql-rpc/src/server/exchange_rates_task.rs @@ -43,7 +43,7 @@ impl TriggerExchangeRatesTask { info!("Detected epoch boundary, triggering call to exchange rates"); let latest_iota_system_state = self.db.inner.spawn_blocking(move |this| this.get_latest_iota_system_state() - ).await.map_err(|_| error!("Failed to fetch latest Iota system state")); + ).await.map_err(|_| error!("Failed to fetch latest IOTA system state")); if let Ok(latest_iota_system_state) = latest_iota_system_state { let db = self.db.clone(); diff --git a/crates/iota-graphql-rpc/src/test_infra/cluster.rs b/crates/iota-graphql-rpc/src/test_infra/cluster.rs index 36aff4343d1..f6a0aeede83 100644 --- a/crates/iota-graphql-rpc/src/test_infra/cluster.rs +++ b/crates/iota-graphql-rpc/src/test_infra/cluster.rs @@ -105,9 +105,9 @@ pub async fn start_cluster( } } -/// Takes in a simulated instantiation of a Iota blockchain and builds a cluster -/// around it. This cluster is typically used in e2e tests to emulate and test -/// behaviors. +/// Takes in a simulated instantiation of an IOTA blockchain and builds a +/// cluster around it. This cluster is typically used in e2e tests to emulate +/// and test behaviors. pub async fn serve_executor( graphql_connection_config: ConnectionConfig, internal_data_source_rpc_port: u16, diff --git a/crates/iota-graphql-rpc/src/types/cursor.rs b/crates/iota-graphql-rpc/src/types/cursor.rs index 3d421edeef6..93af6cfbc98 100644 --- a/crates/iota-graphql-rpc/src/types/cursor.rs +++ b/crates/iota-graphql-rpc/src/types/cursor.rs @@ -250,6 +250,7 @@ impl Page> { /// two booleans indicating whether there is a previous or next page in /// the range, the `checkpoint_viewed_at` to set for consistency, and an /// iterator of cursors within that Page. + #[allow(clippy::type_complexity)] pub(crate) fn paginate_consistent_indices( &self, total: usize, diff --git a/crates/iota-graphql-rpc/src/types/dynamic_field.rs b/crates/iota-graphql-rpc/src/types/dynamic_field.rs index 612e3ab84ac..c63634adfa2 100644 --- a/crates/iota-graphql-rpc/src/types/dynamic_field.rs +++ b/crates/iota-graphql-rpc/src/types/dynamic_field.rs @@ -58,7 +58,7 @@ pub(crate) struct DynamicFieldName { /// an object stored in this kind of field will be considered wrapped and /// will not be accessible directly via its ID by external tools (explorers, /// wallets, etc) accessing storage. -/// 2) Dynamic Object Fields values must be Iota objects (have the `key` and +/// 2) Dynamic Object Fields values must be IOTA objects (have the `key` and /// `store` abilities, and id: UID as the first field), but will still be /// directly accessible off-chain via their object ID after being attached. #[Object] diff --git a/crates/iota-graphql-rpc/src/types/epoch.rs b/crates/iota-graphql-rpc/src/types/epoch.rs index bbb9607c294..696ebdfe0fd 100644 --- a/crates/iota-graphql-rpc/src/types/epoch.rs +++ b/crates/iota-graphql-rpc/src/types/epoch.rs @@ -43,7 +43,7 @@ struct EpochKey { pub checkpoint_viewed_at: u64, } -/// Operation of the Iota network is temporally partitioned into non-overlapping +/// Operation of the IOTA network is temporally partitioned into non-overlapping /// epochs, and the network aims to keep epochs roughly the same duration as /// each other. During a particular epoch the following data is fixed: /// diff --git a/crates/iota-graphql-rpc/src/types/event/mod.rs b/crates/iota-graphql-rpc/src/types/event/mod.rs index 633e9771184..cfe77f3cb45 100644 --- a/crates/iota-graphql-rpc/src/types/event/mod.rs +++ b/crates/iota-graphql-rpc/src/types/event/mod.rs @@ -42,7 +42,7 @@ mod lookups; pub(crate) use cursor::Cursor; pub(crate) use filter::EventFilter; -/// A Iota node emits one of the following events: +/// An IOTA node emits one of the following events: /// Move event /// Publish event /// Transfer object event diff --git a/crates/iota-graphql-rpc/src/types/move_type.rs b/crates/iota-graphql-rpc/src/types/move_type.rs index 44227f90de5..880d84985ca 100644 --- a/crates/iota-graphql-rpc/src/types/move_type.rs +++ b/crates/iota-graphql-rpc/src/types/move_type.rs @@ -316,7 +316,7 @@ impl TryFrom for MoveFieldLayout { } /// Error from seeing a `signer` value or type, which shouldn't be possible in -/// Iota Move. +/// IOTA Move. pub(crate) fn unexpected_signer_error() -> Error { Error::Internal("Unexpected value of type: signer.".to_string()) } diff --git a/crates/iota-graphql-rpc/src/types/move_value.rs b/crates/iota-graphql-rpc/src/types/move_value.rs index d0e31fe47e4..32a3080db8a 100644 --- a/crates/iota-graphql-rpc/src/types/move_value.rs +++ b/crates/iota-graphql-rpc/src/types/move_value.rs @@ -230,7 +230,7 @@ impl TryFrom for MoveData { }) } - // Iota does not support `signer` as a type. + // IOTA does not support `signer` as a type. V::Signer(_) => return Err(unexpected_signer_error()), }) } @@ -318,7 +318,7 @@ fn try_to_json_value(value: A::MoveValue) -> Result { .collect(), ) } - // Iota does not support `signer` as a type. + // IOTA does not support `signer` as a type. V::Signer(_) => return Err(unexpected_signer_error()), }) } diff --git a/crates/iota-graphql-rpc/src/types/object.rs b/crates/iota-graphql-rpc/src/types/object.rs index ae2d53767f3..d6211443f8a 100644 --- a/crates/iota-graphql-rpc/src/types/object.rs +++ b/crates/iota-graphql-rpc/src/types/object.rs @@ -334,7 +334,7 @@ struct LatestAtKey { checkpoint_viewed_at: u64, } -/// An object in Iota is a package (set of Move bytecode modules) or object +/// An object in IOTA is a package (set of Move bytecode modules) or object /// (typed data structure with fields) with additional metadata detailing its /// id, version, transaction digest, owner field indicating how this object can /// be accessed. diff --git a/crates/iota-graphql-rpc/src/types/open_move_type.rs b/crates/iota-graphql-rpc/src/types/open_move_type.rs index b88944de9f0..bf3c4e79126 100644 --- a/crates/iota-graphql-rpc/src/types/open_move_type.rs +++ b/crates/iota-graphql-rpc/src/types/open_move_type.rs @@ -13,7 +13,7 @@ pub(crate) struct OpenMoveType { signature: OpenMoveTypeSignature, } -/// Abilities are keywords in Iota Move that define how types behave at the +/// Abilities are keywords in IOTA Move that define how types behave at the /// compiler level. #[derive(Enum, Copy, Clone, Eq, PartialEq)] pub(crate) enum MoveAbility { diff --git a/crates/iota-graphql-rpc/src/types/query.rs b/crates/iota-graphql-rpc/src/types/query.rs index 91de38b2f8e..6786b84501c 100644 --- a/crates/iota-graphql-rpc/src/types/query.rs +++ b/crates/iota-graphql-rpc/src/types/query.rs @@ -110,11 +110,11 @@ impl Query { let iota_sdk_client: &Option = ctx .data() - .map_err(|_| Error::Internal("Unable to fetch Iota SDK client".to_string())) + .map_err(|_| Error::Internal("Unable to fetch IOTA SDK client".to_string())) .extend()?; let iota_sdk_client = iota_sdk_client .as_ref() - .ok_or_else(|| Error::Internal("Iota SDK client not initialized".to_string())) + .ok_or_else(|| Error::Internal("IOTA SDK client not initialized".to_string())) .extend()?; let (sender_address, tx_kind, gas_price, gas_sponsor, gas_budget, gas_objects) = @@ -200,7 +200,7 @@ impl Query { /// field when its parent was at `rootVersion`. /// /// If `rootVersion` is omitted, dynamic fields will be from a consistent - /// snapshot of the Iota state at the latest checkpoint known to the + /// snapshot of the IOTA state at the latest checkpoint known to the /// GraphQL RPC. Similarly, `Owner.asObject` will return the object's /// version at the latest checkpoint. async fn owner( diff --git a/crates/iota-graphql-rpc/src/types/validator.rs b/crates/iota-graphql-rpc/src/types/validator.rs index 7d70342693f..4f9b3cfb87a 100644 --- a/crates/iota-graphql-rpc/src/types/validator.rs +++ b/crates/iota-graphql-rpc/src/types/validator.rs @@ -74,7 +74,7 @@ impl Loader for Db { .inner .spawn_blocking(move |this| this.get_latest_iota_system_state()) .await - .map_err(|_| Error::Internal("Failed to fetch latest Iota system state".to_string()))?; + .map_err(|_| Error::Internal("Failed to fetch latest IOTA system state".to_string()))?; let governance_api = GovernanceReadApi::new(self.inner.clone()); let (candidate_rates, pending_rates) = tokio::try_join!( 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 b1c9a00a5ac..f9ff85e3efb 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 @@ -955,7 +955,7 @@ of dynamic fields: an object stored in this kind of field will be considered wrapped and will not be accessible directly via its ID by external tools (explorers, wallets, etc) accessing storage. -2) Dynamic Object Fields values must be Iota objects (have the `key` and +2) Dynamic Object Fields values must be IOTA objects (have the `key` and `store` abilities, and id: UID as the first field), but will still be directly accessible off-chain via their object ID after being attached. """ @@ -1065,7 +1065,7 @@ type EndOfEpochTransactionKindEdge { } """ -Operation of the Iota network is temporally partitioned into non-overlapping +Operation of the IOTA network is temporally partitioned into non-overlapping epochs, and the network aims to keep epochs roughly the same duration as each other. During a particular epoch the following data is fixed: @@ -1668,7 +1668,7 @@ type MergeCoinsTransaction { } """ -Abilities are keywords in Iota Move that define how types behave at the +Abilities are keywords in IOTA Move that define how types behave at the compiler level. """ enum MoveAbility { @@ -2614,7 +2614,7 @@ enum MoveVisibility { } """ -Mutations are used to write to the Iota network. +Mutations are used to write to the IOTA network. """ type Mutation { """ @@ -2642,7 +2642,7 @@ type Mutation { } """ -An object in Iota is a package (set of Move bytecode modules) or object +An object in IOTA is a package (set of Move bytecode modules) or object (typed data structure with fields) with additional metadata detailing its id, version, transaction digest, owner field indicating how this object can be accessed. @@ -3283,7 +3283,7 @@ type Query { field when its parent was at `rootVersion`. If `rootVersion` is omitted, dynamic fields will be from a consistent - snapshot of the Iota state at the latest checkpoint known to the + snapshot of the IOTA state at the latest checkpoint known to the GraphQL RPC. Similarly, `Owner.asObject` will return the object's version at the latest checkpoint. """ diff --git a/crates/iota-indexer-builder/Cargo.toml b/crates/iota-indexer-builder/Cargo.toml index 1b12d82425f..67e187d9be1 100644 --- a/crates/iota-indexer-builder/Cargo.toml +++ b/crates/iota-indexer-builder/Cargo.toml @@ -12,6 +12,7 @@ anyhow.workspace = true async-trait.workspace = true prometheus.workspace = true tokio = { workspace = true, features = ["full"] } +tokio-util.workspace = true tracing.workspace = true # internal dependencies diff --git a/crates/iota-indexer-builder/src/iota_datasource.rs b/crates/iota-indexer-builder/src/iota_datasource.rs index 27839b1ddd6..85e71eaf7b1 100644 --- a/crates/iota-indexer-builder/src/iota_datasource.rs +++ b/crates/iota-indexer-builder/src/iota_datasource.rs @@ -15,10 +15,8 @@ use iota_types::{ full_checkpoint_content::{CheckpointData as IotaCheckpointData, CheckpointTransaction}, messages_checkpoint::CheckpointSequenceNumber, }; -use tokio::{ - sync::{oneshot, oneshot::Sender}, - task::JoinHandle, -}; +use tokio::task::JoinHandle; +use tokio_util::sync::CancellationToken; use tracing::info; use crate::indexer_builder::{DataSender, Datasource}; @@ -53,11 +51,12 @@ impl Datasource for IotaCheckpointDatasource { target_checkpoint: u64, data_sender: DataSender, ) -> Result>, Error> { - let (exit_sender, exit_receiver) = oneshot::channel(); + let token = CancellationToken::new(); + let token_child = token.child_token(); let progress_store = PerTaskInMemProgressStore { current_checkpoint: starting_checkpoint, exit_checkpoint: target_checkpoint, - exit_sender: Some(exit_sender), + token: Some(token), }; let mut executor = IndexerExecutor::new(progress_store, 1, self.metrics.clone()); let worker = IndexerWorker::new(data_sender); @@ -76,7 +75,7 @@ impl Datasource for IotaCheckpointDatasource { Some(remote_store_url), vec![], // optional remote store access options ReaderOptions::default(), - exit_receiver, + token_child, ) .await?; Ok(()) @@ -87,7 +86,7 @@ impl Datasource for IotaCheckpointDatasource { struct PerTaskInMemProgressStore { pub current_checkpoint: u64, pub exit_checkpoint: u64, - pub exit_sender: Option>, + pub token: Option, } #[async_trait] @@ -105,8 +104,8 @@ impl ProgressStore for PerTaskInMemProgressStore { checkpoint_number: CheckpointSequenceNumber, ) -> anyhow::Result<()> { if checkpoint_number >= self.exit_checkpoint { - if let Some(sender) = self.exit_sender.take() { - let _ = sender.send(()); + if let Some(token) = self.token.take() { + token.cancel(); } } self.current_checkpoint = checkpoint_number; diff --git a/crates/iota-indexer/README.md b/crates/iota-indexer/README.md index b7126faad67..7802da7c4c8 100644 --- a/crates/iota-indexer/README.md +++ b/crates/iota-indexer/README.md @@ -19,7 +19,7 @@ For more in depth information check the [Database Schema](./schema.md). ### Using docker compose (recommended) -See [pg-services-local](../../docker/pg-services-local/README.md), which automatically sets up the Indexer Sync worker and the Indexer RPC worker along with a postgres database and local network. +See [pg-services-local](../../dev-tools/pg-services-local/README.md), which automatically sets up the Indexer Sync worker and the Indexer RPC worker along with a postgres database and local network. ### Using manual setup @@ -27,7 +27,7 @@ To run an Indexer, a running postgres instance is required. #### Database setup -You can either spin up the postgres instance as a single service via [docker-compose](../../docker/pg-services-local/README.md) or manually set up it up. +You can either spin up the postgres instance as a single service via [docker-compose](../../dev-tools/pg-services-local/README.md) or manually set up it up. If you choose for manual setup, follow the steps below: 1. Install a local [Postgres server](https://www.postgresql.org/download) and start it. @@ -63,13 +63,13 @@ To run the indexer as a standalone service with an existing fullnode, follow the ```sh # Change the RPC_CLIENT_URL to http://0.0.0.0:9000 to run indexer against local validator & fullnode -cargo run --bin iota-indexer -- --db-url "postgres://postgres:postgrespw@localhost/iota_indexer" --rpc-client-url "https://fullnode.devnet.iota.io:443" --fullnode-sync-worker --reset-db +cargo run --bin iota-indexer -- --db-url "postgres://postgres:postgrespw@localhost/iota_indexer" --rpc-client-url "https://api.devnet.iota.cafe:443" --fullnode-sync-worker --reset-db ``` - to run indexer as a reader which exposes a JSON RPC service with following [APIs](https://docs.iota.org/iota-api-ref). ``` -cargo run --bin iota-indexer -- --db-url "postgres://postgres:postgrespw@localhost/iota_indexer" --rpc-client-url "https://fullnode.devnet.iota.io:443" --rpc-server-worker +cargo run --bin iota-indexer -- --db-url "postgres://postgres:postgrespw@localhost/iota_indexer" --rpc-client-url "https://api.devnet.iota.cafe:443" --rpc-server-worker ``` More available flags can be found in this [file](https://github.com/iotaledger/iota/blob/develop/crates/iota-indexer/src/lib.rs). @@ -171,5 +171,5 @@ Note that you need an existing database for this to work. Using the DATABASE_URL ```sh # Change the RPC_CLIENT_URL to http://0.0.0.0:9000 to run indexer against local validator & fullnode -cargo run --bin iota-indexer --features mysql-feature --no-default-features -- --db-url "" --rpc-client-url "https://fullnode.devnet.iota.io:443" --fullnode-sync-worker --reset-db +cargo run --bin iota-indexer --features mysql-feature --no-default-features -- --db-url "" --rpc-client-url "https://api.devnet.iota.cafe:443" --fullnode-sync-worker --reset-db ``` diff --git a/crates/iota-indexer/examples/index_genesis_transaction.rs b/crates/iota-indexer/examples/index_genesis_transaction.rs index cc2de930778..dc0e51b7aaf 100644 --- a/crates/iota-indexer/examples/index_genesis_transaction.rs +++ b/crates/iota-indexer/examples/index_genesis_transaction.rs @@ -18,22 +18,22 @@ use iota_swarm_config::genesis_config::ValidatorGenesisConfigBuilder; use rand::rngs::OsRng; #[derive(Parser, Debug)] -#[clap(about = "Example that indexes the genesis transaction into the database")] +#[command(about = "Example that indexes the genesis transaction into the database")] struct Args { /// Remotely stored migration snapshots. - #[clap( + #[arg( long, name = "iota|", help = "Remote migration snapshots.", default_values_t = vec![SnapshotUrl::Iota], + num_args(0..) )] - #[arg(num_args(0..))] migration_snapshots: Vec, } const DEFAULT_DB_URL: &str = "postgres://postgres:postgrespw@localhost:5432/iota_indexer"; -// Build genesis with `Iota` stardust snapshot +// Build genesis with `IOTA` stardust snapshot fn genesis_builder(migration_sources: Vec) -> GenesisBuilder { // Create the builder let mut builder = GenesisBuilder::new(); diff --git a/crates/iota-indexer/src/indexer.rs b/crates/iota-indexer/src/indexer.rs index 4325feae326..b9c16356971 100644 --- a/crates/iota-indexer/src/indexer.rs +++ b/crates/iota-indexer/src/indexer.rs @@ -13,7 +13,6 @@ use iota_data_ingestion_core::{ use iota_metrics::spawn_monitored_task; use iota_types::messages_checkpoint::CheckpointSequenceNumber; use prometheus::Registry; -use tokio::sync::oneshot; use tokio_util::sync::CancellationToken; use tracing::info; @@ -71,7 +70,7 @@ impl Indexer { cancel: CancellationToken, ) -> Result<(), IndexerError> { info!( - "Iota Indexer Writer (version {:?}) started...", + "IOTA Indexer Writer (version {:?}) started...", env!("CARGO_PKG_VERSION") ); @@ -132,14 +131,6 @@ impl Indexer { store.persist_protocol_configs_and_feature_flags(chain_id)?; } - let cancel_clone = cancel.clone(); - let (exit_sender, exit_receiver) = oneshot::channel(); - // Spawn a task that links the cancellation token to the exit sender - spawn_monitored_task!(async move { - cancel_clone.cancelled().await; - let _ = exit_sender.send(()); - }); - let mut executor = IndexerExecutor::new( ShimIndexerProgressStore::new(vec![ ("primary".to_string(), primary_watermark), @@ -170,7 +161,7 @@ impl Indexer { config.remote_store_url.clone(), vec![], extra_reader_options, - exit_receiver, + cancel.child_token(), ) .await?; Ok(()) @@ -182,7 +173,7 @@ impl Indexer { db_url: String, ) -> Result<(), IndexerError> { info!( - "Iota Indexer Reader (version {:?}) started...", + "IOTA Indexer Reader (version {:?}) started...", env!("CARGO_PKG_VERSION") ); let indexer_reader = IndexerReader::::new(db_url)?; @@ -202,7 +193,7 @@ impl Indexer { metrics: IndexerMetrics, ) -> Result<(), IndexerError> { info!( - "Iota Indexer Analytical Worker (version {:?}) started...", + "IOTA Indexer Analytical Worker (version {:?}) started...", env!("CARGO_PKG_VERSION") ); let mut processor_orchestrator = ProcessorOrchestrator::new(store, metrics); diff --git a/crates/iota-indexer/src/indexer_reader.rs b/crates/iota-indexer/src/indexer_reader.rs index 1fa26c1969c..2ecf20f90bf 100644 --- a/crates/iota-indexer/src/indexer_reader.rs +++ b/crates/iota-indexer/src/indexer_reader.rs @@ -10,7 +10,8 @@ use std::{ use anyhow::{Result, anyhow}; use cached::{Cached, SizedCache}; use diesel::{ - ExpressionMethods, OptionalExtension, QueryDsl, RunQueryDsl, TextExpressionMethods, + ExpressionMethods, JoinOnDsl, NullableExpressionMethods, OptionalExtension, QueryDsl, + RunQueryDsl, SelectableHelper, TextExpressionMethods, dsl::sql, r2d2::{ConnectionManager, R2D2Connection}, sql_types::Bool, @@ -63,7 +64,7 @@ use crate::{ }, schema::{ address_metrics, checkpoints, display, epochs, events, move_call_metrics, objects, - objects_snapshot, packages, transactions, + objects_snapshot, packages, pruner_cp_watermark, transactions, tx_digests, }, store::{diesel_macro::*, package_resolver::IndexerStorePackageResolver}, types::{IndexerResult, OwnerType}, @@ -461,7 +462,16 @@ impl IndexerReader { ) -> Result { let mut stored_txn: StoredTransaction = run_query!(&self.pool, |conn| { transactions::table - .filter(transactions::transaction_digest.eq(digest.into_inner().to_vec())) + .filter( + transactions::tx_sequence_number + .nullable() + .eq(tx_digests::table + .select(tx_digests::tx_sequence_number) + // we filter the tx_digests table because it is indexed by digest, + // transactions table is not + .filter(tx_digests::tx_digest.eq(digest.into_inner().to_vec())) + .single_value()), + ) .first::(conn) })?; @@ -497,7 +507,14 @@ impl IndexerReader { .collect::>(); let transactions = run_query!(&self.pool, |conn| { transactions::table - .filter(transactions::transaction_digest.eq_any(digests)) + .inner_join( + tx_digests::table + .on(transactions::tx_sequence_number.eq(tx_digests::tx_sequence_number)), + ) + // we filter the tx_digests table because it is indexed by digest, + // transactions table is not + .filter(tx_digests::tx_digest.eq_any(digests)) + .select(StoredTransaction::as_select()) .load::(conn) })?; if cfg!(feature = "postgres-feature") { @@ -722,8 +739,21 @@ impl IndexerReader { limit: usize, is_descending: bool, ) -> IndexerResult> { + let pool = self.get_pool(); + let tx_range: (i64, i64) = run_query_async!(&pool, move |conn| { + pruner_cp_watermark::dsl::pruner_cp_watermark + .select(( + pruner_cp_watermark::min_tx_sequence_number, + pruner_cp_watermark::max_tx_sequence_number, + )) + // we filter the pruner_cp_watermark table because it is indexed by + // checkpoint_sequence_number, transactions is not + .filter(pruner_cp_watermark::checkpoint_sequence_number.eq(checkpoint_seq as i64)) + .first::<(i64, i64)>(conn) + })?; + let mut query = transactions::dsl::transactions - .filter(transactions::dsl::checkpoint_sequence_number.eq(checkpoint_seq as i64)) + .filter(transactions::tx_sequence_number.between(tx_range.0, tx_range.1)) .into_boxed(); // Translate transaction digest cursor to tx sequence number @@ -778,9 +808,11 @@ impl IndexerReader { let cursor_tx_seq = if let Some(cursor) = cursor { let pool = self.get_pool(); let tx_seq = run_query_async!(&pool, move |conn| { - transactions::dsl::transactions - .select(transactions::tx_sequence_number) - .filter(transactions::dsl::transaction_digest.eq(cursor.into_inner().to_vec())) + tx_digests::table + .select(tx_digests::tx_sequence_number) + // we filter the tx_digests table because it is indexed by digest, + // transactions (and other tables) are not + .filter(tx_digests::tx_digest.eq(cursor.into_inner().to_vec())) .first::(conn) })?; Some(tx_seq) @@ -1019,7 +1051,16 @@ impl IndexerReader { let pool = self.get_pool(); let (timestamp_ms, serialized_events) = run_query_async!(&pool, move |conn| { transactions::table - .filter(transactions::transaction_digest.eq(digest.into_inner().to_vec())) + .filter( + transactions::tx_sequence_number + .nullable() + .eq(tx_digests::table + .select(tx_digests::tx_sequence_number) + // we filter the tx_digests table because it is indexed by digest, + // transactions table is not + .filter(tx_digests::tx_digest.eq(digest.into_inner().to_vec())) + .single_value()), + ) .select((transactions::timestamp_ms, transactions::events)) .first::<(i64, StoredTransactionEvents)>(conn) })?; @@ -1037,43 +1078,68 @@ impl IndexerReader { Ok(iota_tx_events.map_or(vec![], |ste| ste.data)) } - fn query_events_by_tx_digest_query( + async fn query_events_by_tx_digest( &self, tx_digest: TransactionDigest, cursor: Option, limit: usize, descending_order: bool, - ) -> IndexerResult { - let cursor = if let Some(cursor) = cursor { + ) -> IndexerResult> { + let mut query = events::table.into_boxed(); + + if let Some(cursor) = cursor { if cursor.tx_digest != tx_digest { return Err(IndexerError::InvalidArgument( "Cursor tx_digest does not match the tx_digest in the query.".into(), )); } if descending_order { - format!("e.{EVENT_SEQUENCE_NUMBER_STR} < {}", cursor.event_seq) + query = query.filter(events::event_sequence_number.lt(cursor.event_seq as i64)); } else { - format!("e.{EVENT_SEQUENCE_NUMBER_STR} > {}", cursor.event_seq) + query = query.filter(events::event_sequence_number.gt(cursor.event_seq as i64)); } } else if descending_order { - format!("e.{EVENT_SEQUENCE_NUMBER_STR} <= {}", i64::MAX) + query = query.filter(events::event_sequence_number.le(i64::MAX)); } else { - format!("e.{EVENT_SEQUENCE_NUMBER_STR} >= {}", 0) + query = query.filter(events::event_sequence_number.ge(0)); }; - let order_clause = if descending_order { "DESC" } else { "ASC" }; - Ok(format!( - "SELECT * \ - FROM EVENTS e \ - JOIN TRANSACTIONS t \ - ON t.tx_sequence_number = e.tx_sequence_number \ - AND t.transaction_digest = '\\x{}'::bytea \ - WHERE {cursor} \ - ORDER BY e.{EVENT_SEQUENCE_NUMBER_STR} {order_clause} \ - LIMIT {limit} - ", - Hex::encode(tx_digest.into_inner()), - )) + if descending_order { + query = query.order(events::event_sequence_number.desc()); + } else { + query = query.order(events::event_sequence_number.asc()); + } + + query = query.filter( + events::tx_sequence_number.nullable().eq(tx_digests::table + .select(tx_digests::tx_sequence_number) + // we filter the tx_digests table because it is indexed by digest, + // events table is not + .filter(tx_digests::tx_digest.eq(tx_digest.into_inner().to_vec())) + .single_value()), + ); + + let pool = self.get_pool(); + let stored_events = run_query_async!(&pool, move |conn| { + query.limit(limit as i64).load::(conn) + })?; + + let mut iota_event_futures = vec![]; + for stored_event in stored_events { + iota_event_futures.push(tokio::task::spawn( + stored_event.try_into_iota_event(self.package_resolver.clone()), + )); + } + + let iota_events = futures::future::join_all(iota_event_futures) + .await + .into_iter() + .collect::, _>>() + .tap_err(|e| tracing::error!("Failed to join iota event futures: {}", e))? + .into_iter() + .collect::, _>>() + .tap_err(|e| tracing::error!("Failed to collect iota event futures: {}", e))?; + Ok(iota_events) } pub async fn query_events_in_blocking_task( @@ -1093,21 +1159,22 @@ impl IndexerReader { transactions::dsl::transactions .select(transactions::tx_sequence_number) .filter( - transactions::dsl::transaction_digest.eq(tx_digest.into_inner().to_vec()), + transactions::tx_sequence_number + .nullable() + .eq(tx_digests::table + .select(tx_digests::tx_sequence_number) + // we filter the tx_digests table because it is indexed by digest, + // transactions table is not + .filter(tx_digests::tx_digest.eq(tx_digest.into_inner().to_vec())) + .single_value()), ) .first::(conn) })?; - (tx_seq, event_seq) + (tx_seq, event_seq as i64) } else if descending_order { - let max_tx_seq: i64 = run_query_async!(&pool, move |conn| { - events::dsl::events - .select(events::tx_sequence_number) - .order(events::dsl::tx_sequence_number.desc()) - .first::(conn) - }) - .map_or(-1, |max_tx_seq| max_tx_seq + 1); - - (max_tx_seq, 0) + let max_tx_seq = i64::MAX; + let max_event_seq = i64::MAX; + (max_tx_seq, max_event_seq) } else { (-1, 0) }; @@ -1147,7 +1214,9 @@ impl IndexerReader { limit, ) } else if let EventFilter::Transaction(tx_digest) = filter { - self.query_events_by_tx_digest_query(tx_digest, cursor, limit, descending_order)? + return self + .query_events_by_tx_digest(tx_digest, cursor, limit, descending_order) + .await; } else { let main_where_clause = match filter { EventFilter::Package(package_id) => { diff --git a/crates/iota-indexer/src/lib.rs b/crates/iota-indexer/src/lib.rs index 4593d1b75f2..0b6c58f39f5 100644 --- a/crates/iota-indexer/src/lib.rs +++ b/crates/iota-indexer/src/lib.rs @@ -47,45 +47,45 @@ pub mod test_utils; pub mod types; #[derive(Parser, Clone, Debug)] -#[clap( - name = "Iota indexer", - about = "An off-fullnode service serving data from Iota protocol", +#[command( + name = "IOTA indexer", + about = "An off-fullnode service serving data from IOTA protocol", rename_all = "kebab-case" )] pub struct IndexerConfig { - #[clap(long)] + #[arg(long)] pub db_url: Option>, - #[clap(long)] + #[arg(long)] pub db_user_name: Option, - #[clap(long)] + #[arg(long)] pub db_password: Option>, - #[clap(long)] + #[arg(long)] pub db_host: Option, - #[clap(long)] + #[arg(long)] pub db_port: Option, - #[clap(long)] + #[arg(long)] pub db_name: Option, - #[clap(long, default_value = "http://0.0.0.0:9000", global = true)] + #[arg(long, default_value = "http://0.0.0.0:9000", global = true)] pub rpc_client_url: String, - #[clap(long, default_value = Some("https://checkpoints.mainnet.iota.io"), global = true)] + #[arg(long, default_value = Some("https://checkpoints.mainnet.iota.cafe"), global = true)] pub remote_store_url: Option, - #[clap(long, default_value = "0.0.0.0", global = true)] + #[arg(long, default_value = "0.0.0.0", global = true)] pub client_metric_host: String, - #[clap(long, default_value = "9184", global = true)] + #[arg(long, default_value = "9184", global = true)] pub client_metric_port: u16, - #[clap(long, default_value = "0.0.0.0", global = true)] + #[arg(long, default_value = "0.0.0.0", global = true)] pub rpc_server_url: String, - #[clap(long, default_value = "9000", global = true)] + #[arg(long, default_value = "9000", global = true)] pub rpc_server_port: u16, - #[clap(long)] + #[arg(long)] pub reset_db: bool, - #[clap(long)] + #[arg(long)] pub fullnode_sync_worker: bool, - #[clap(long)] + #[arg(long)] pub rpc_server_worker: bool, - #[clap(long)] + #[arg(long)] pub data_ingestion_path: Option, - #[clap(long)] + #[arg(long)] pub analytical_worker: bool, } @@ -149,7 +149,7 @@ impl Default for IndexerConfig { db_port: None, db_name: None, rpc_client_url: "http://127.0.0.1:9000".to_string(), - remote_store_url: Some("https://checkpoints.mainnet.iota.io".to_string()), + remote_store_url: Some("https://checkpoints.mainnet.iota.cafe".to_string()), client_metric_host: "0.0.0.0".to_string(), client_metric_port: 9184, rpc_server_url: "0.0.0.0".to_string(), diff --git a/crates/iota-indexer/src/main.rs b/crates/iota-indexer/src/main.rs index 791b16a5469..11c04da67b3 100644 --- a/crates/iota-indexer/src/main.rs +++ b/crates/iota-indexer/src/main.rs @@ -13,7 +13,7 @@ async fn main() -> Result<(), IndexerError> { .with_env() .init(); warn!( - "WARNING: Iota indexer is still experimental and we expect occasional breaking changes that require backfills." + "WARNING: IOTA indexer is still experimental and we expect occasional breaking changes that require backfills." ); let mut indexer_config = IndexerConfig::parse(); diff --git a/crates/iota-indexer/src/metrics.rs b/crates/iota-indexer/src/metrics.rs index 0e01cb3c317..4f220c1bad3 100644 --- a/crates/iota-indexer/src/metrics.rs +++ b/crates/iota-indexer/src/metrics.rs @@ -337,7 +337,7 @@ impl IndexerMetrics { ).unwrap(), fullnode_checkpoint_data_download_latency: register_histogram_with_registry!( "fullnode_checkpoint_data_download_latency", - "Time spent in downloading checkpoint and transation for a new checkpoint from the Full Node", + "Time spent in downloading checkpoint and transaction for a new checkpoint from the Full Node", DATA_INGESTION_LATENCY_SEC_BUCKETS.to_vec(), registry, ) @@ -458,7 +458,7 @@ impl IndexerMetrics { ) .unwrap(), checkpoint_db_commit_latency_transactions_chunks_transformation: register_histogram_with_registry!( - "checkpoint_db_commit_latency_transactions_transaformation", + "checkpoint_db_commit_latency_transactions_transformation", "Time spent in transactions chunks transformation prior to commit", DATA_INGESTION_LATENCY_SEC_BUCKETS.to_vec(), registry, diff --git a/crates/iota-indexer/src/models/large_objects.rs b/crates/iota-indexer/src/models/large_objects.rs index e5f179e1ba6..a386eb620a4 100644 --- a/crates/iota-indexer/src/models/large_objects.rs +++ b/crates/iota-indexer/src/models/large_objects.rs @@ -78,7 +78,8 @@ pub fn put_large_object_in_chunks( 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 handlng manually) + // remove dangling chunks (either by using a transaction or by handling + // manually) // // additionally we could apply a backoff retry strategy transactional_blocking_with_retry!( diff --git a/crates/iota-indexer/tests/common/mod.rs b/crates/iota-indexer/tests/common/mod.rs index 23ccf354899..8b1089ac60a 100644 --- a/crates/iota-indexer/tests/common/mod.rs +++ b/crates/iota-indexer/tests/common/mod.rs @@ -18,11 +18,13 @@ use iota_indexer::{ test_utils::{ReaderWriterConfig, start_test_indexer}, }; use iota_json_rpc_api::ReadApiClient; -use iota_json_rpc_types::IotaTransactionBlockResponseOptions; +use iota_json_rpc_types::{IotaTransactionBlockResponseOptions, TransactionBlockBytes}; use iota_metrics::init_metrics; use iota_types::{ base_types::{ObjectID, SequenceNumber}, + crypto::AccountKeyPair, digests::TransactionDigest, + utils::to_sender_signed_transaction, }; use jsonrpsee::{ http_client::{HttpClient, HttpClientBuilder}, @@ -238,6 +240,18 @@ pub async fn indexer_wait_for_transaction( .expect("Timeout waiting for indexer to catchup to given transaction"); } +pub async fn execute_tx_and_wait_for_indexer( + indexer_client: &HttpClient, + cluster: &TestCluster, + store: &PgIndexerStore, + tx_bytes: TransactionBlockBytes, + keypair: &AccountKeyPair, +) { + let txn = to_sender_signed_transaction(tx_bytes.to_data().unwrap(), keypair); + let res = cluster.wallet.execute_transaction_must_succeed(txn).await; + indexer_wait_for_transaction(res.digest, store, indexer_client).await; +} + /// Start an Indexer instance in `Read` mode fn start_indexer_reader( fullnode_rpc_url: impl Into, diff --git a/crates/iota-indexer/tests/rpc-tests/coin_api.rs b/crates/iota-indexer/tests/rpc-tests/coin_api.rs index 208d0b166fd..4e4eec7ecb1 100644 --- a/crates/iota-indexer/tests/rpc-tests/coin_api.rs +++ b/crates/iota-indexer/tests/rpc-tests/coin_api.rs @@ -3,6 +3,8 @@ use std::{path::PathBuf, str::FromStr}; +use diesel::PgConnection; +use iota_indexer::store::PgIndexerStore; use iota_json::{call_args, type_args}; use iota_json_rpc_api::{CoinReadApiClient, TransactionBuilderClient, WriteApiClient}; use iota_json_rpc_types::{ @@ -25,15 +27,15 @@ use jsonrpsee::http_client::HttpClient; use test_cluster::TestCluster; use tokio::sync::OnceCell; -use crate::common::{ApiTestSetup, indexer_wait_for_object}; +use crate::common::{ApiTestSetup, execute_tx_and_wait_for_indexer, indexer_wait_for_object}; -static COMMON_TESTING_ADDR_AND_CUSTOM_COIN_NAME: OnceCell<(IotaAddress, String)> = +static COMMON_TESTING_ADDR_AND_CUSTOM_COIN_NAME: OnceCell<(IotaAddress, AccountKeyPair, String)> = OnceCell::const_new(); async fn get_or_init_addr_and_custom_coins( cluster: &TestCluster, indexer_client: &HttpClient, -) -> &'static (IotaAddress, String) { +) -> &'static (IotaAddress, AccountKeyPair, String) { COMMON_TESTING_ADDR_AND_CUSTOM_COIN_NAME .get_or_init(|| async { let (address, keypair): (_, AccountKeyPair) = get_key_pair(); @@ -49,7 +51,7 @@ async fn get_or_init_addr_and_custom_coins( } let (coin_name, coin_object_ref) = - create_and_mint_trusted_coin(cluster, address, keypair, 100_000) + create_and_mint_trusted_coin(cluster, address, &keypair, 100_000) .await .unwrap(); @@ -60,7 +62,7 @@ async fn get_or_init_addr_and_custom_coins( ) .await; - (address, coin_name) + (address, keypair, coin_name) }) .await } @@ -74,7 +76,7 @@ fn get_coins_basic_scenario() { .. } = ApiTestSetup::get_or_init(); runtime.block_on(async move { - let (owner, _) = get_or_init_addr_and_custom_coins(cluster, client).await; + let (owner, _, _) = get_or_init_addr_and_custom_coins(cluster, client).await; let (result_fullnode, result_indexer) = get_coins_fullnode_indexer(cluster, client, *owner, None, None, None).await; @@ -93,7 +95,7 @@ fn get_coins_with_cursor() { .. } = ApiTestSetup::get_or_init(); runtime.block_on(async move { - let (owner, _) = get_or_init_addr_and_custom_coins(cluster, client).await; + let (owner, _, _) = get_or_init_addr_and_custom_coins(cluster, client).await; let all_coins = cluster .rpc_client() .get_coins(*owner, None, None, None) @@ -118,7 +120,7 @@ fn get_coins_with_limit() { .. } = ApiTestSetup::get_or_init(); runtime.block_on(async move { - let (owner, _) = get_or_init_addr_and_custom_coins(cluster, client).await; + let (owner, _, _) = get_or_init_addr_and_custom_coins(cluster, client).await; let (result_fullnode, result_indexer) = get_coins_fullnode_indexer(cluster, client, *owner, None, None, Some(2)).await; @@ -137,7 +139,7 @@ fn get_coins_custom_coin() { .. } = ApiTestSetup::get_or_init(); runtime.block_on(async move { - let (owner, coin_name) = get_or_init_addr_and_custom_coins(cluster, client).await; + let (owner, _, coin_name) = get_or_init_addr_and_custom_coins(cluster, client).await; let (result_fullnode, result_indexer) = get_coins_fullnode_indexer( cluster, @@ -163,7 +165,7 @@ fn get_all_coins_basic_scenario() { .. } = ApiTestSetup::get_or_init(); runtime.block_on(async move { - let (owner, _) = get_or_init_addr_and_custom_coins(cluster, client).await; + let (owner, _, _) = get_or_init_addr_and_custom_coins(cluster, client).await; let (result_fullnode, result_indexer) = get_all_coins_fullnode_indexer(cluster, client, *owner, None, None).await; @@ -183,7 +185,7 @@ fn get_all_coins_with_cursor() { .. } = ApiTestSetup::get_or_init(); runtime.block_on(async move { - let (owner, _) = get_or_init_addr_and_custom_coins(cluster, client).await; + let (owner, _, _) = get_or_init_addr_and_custom_coins(cluster, client).await; let all_coins = cluster .rpc_client() @@ -218,7 +220,7 @@ fn get_all_coins_with_limit() { .. } = ApiTestSetup::get_or_init(); runtime.block_on(async move { - let (owner, _) = get_or_init_addr_and_custom_coins(cluster, client).await; + let (owner, _, _) = get_or_init_addr_and_custom_coins(cluster, client).await; let (result_fullnode, result_indexer) = get_all_coins_fullnode_indexer(cluster, client, *owner, None, Some(2)).await; @@ -237,7 +239,7 @@ fn get_balance_iota_coin() { .. } = ApiTestSetup::get_or_init(); runtime.block_on(async move { - let (owner, _) = get_or_init_addr_and_custom_coins(cluster, client).await; + let (owner, _, _) = get_or_init_addr_and_custom_coins(cluster, client).await; let (result_fullnode, result_indexer) = get_balance_fullnode_indexer(cluster, client, *owner, None).await; @@ -255,7 +257,7 @@ fn get_balance_custom_coin() { .. } = ApiTestSetup::get_or_init(); runtime.block_on(async move { - let (owner, coin_name) = get_or_init_addr_and_custom_coins(cluster, client).await; + let (owner, _, coin_name) = get_or_init_addr_and_custom_coins(cluster, client).await; let (result_fullnode, result_indexer) = get_balance_fullnode_indexer(cluster, client, *owner, Some(coin_name.to_string())) @@ -274,7 +276,35 @@ fn get_all_balances() { .. } = ApiTestSetup::get_or_init(); runtime.block_on(async move { - let (owner, _) = get_or_init_addr_and_custom_coins(cluster, client).await; + let (owner, _, _) = get_or_init_addr_and_custom_coins(cluster, client).await; + + let (mut result_fullnode, mut result_indexer) = + get_all_balances_fullnode_indexer(cluster, client, *owner).await; + + result_fullnode.sort_by_key(|balance: &Balance| balance.coin_type.clone()); + result_indexer.sort_by_key(|balance: &Balance| balance.coin_type.clone()); + + assert_eq!(result_fullnode, result_indexer); + }); +} + +#[test] +fn get_all_balances_with_zero_iotas() { + let ApiTestSetup { + runtime, + client, + cluster, + store, + } = ApiTestSetup::get_or_init(); + runtime.block_on(async move { + let (owner, keypair, _) = get_or_init_addr_and_custom_coins(cluster, client).await; + let coins_dump_address = IotaAddress::random_for_testing_only(); + + // first call is to make node and potentially the indexer cache the result + // and increase chance of producing wrong result on the second call + get_all_balances_fullnode_indexer(cluster, client, *owner).await; + + transfer_all_coins(cluster, client, store, *owner, keypair, coins_dump_address).await; let (mut result_fullnode, mut result_indexer) = get_all_balances_fullnode_indexer(cluster, client, *owner).await; @@ -295,7 +325,7 @@ fn get_coin_metadata() { .. } = ApiTestSetup::get_or_init(); runtime.block_on(async move { - let (_, coin_name) = get_or_init_addr_and_custom_coins(cluster, client).await; + let (_, _, coin_name) = get_or_init_addr_and_custom_coins(cluster, client).await; let (result_fullnode, result_indexer) = get_coin_metadata_fullnode_indexer(cluster, client, coin_name.to_string()).await; @@ -314,7 +344,7 @@ fn get_total_supply() { .. } = ApiTestSetup::get_or_init(); runtime.block_on(async move { - let (_, coin_name) = get_or_init_addr_and_custom_coins(cluster, client).await; + let (_, _, coin_name) = get_or_init_addr_and_custom_coins(cluster, client).await; let (result_fullnode, result_indexer) = get_total_supply_fullnode_indexer(cluster, client, coin_name.to_string()).await; @@ -415,7 +445,7 @@ async fn get_total_supply_fullnode_indexer( async fn create_and_mint_trusted_coin( cluster: &TestCluster, address: IotaAddress, - account_keypair: AccountKeyPair, + account_keypair: &AccountKeyPair, amount: u64, ) -> Result<(String, IotaObjectRef), anyhow::Error> { let http_client = cluster.rpc_client(); @@ -446,7 +476,7 @@ async fn create_and_mint_trusted_coin( .unwrap(); let signed_transaction = - to_sender_signed_transaction(transaction_bytes.to_data().unwrap(), &account_keypair); + to_sender_signed_transaction(transaction_bytes.to_data().unwrap(), account_keypair); let (tx_bytes, signatures) = signed_transaction.to_tx_bytes_and_signatures(); let tx_response: IotaTransactionBlockResponse = http_client @@ -513,7 +543,7 @@ async fn create_and_mint_trusted_coin( .unwrap(); let signed_transaction = - to_sender_signed_transaction(transaction_bytes.to_data().unwrap(), &account_keypair); + to_sender_signed_transaction(transaction_bytes.to_data().unwrap(), account_keypair); let (tx_bytes, signatures) = signed_transaction.to_tx_bytes_and_signatures(); let tx_response = http_client @@ -537,3 +567,29 @@ async fn create_and_mint_trusted_coin( Ok((coin_name, created_coin_obj_ref)) } + +async fn transfer_all_coins( + cluster: &TestCluster, + indexer_client: &HttpClient, + store: &PgIndexerStore, + from_address: IotaAddress, + keypair: &AccountKeyPair, + to_address: IotaAddress, +) { + let coins: Vec<_> = cluster + .rpc_client() + .get_coins(from_address, None, None, None) + .await + .unwrap() + .data + .iter() + .map(|coin| coin.coin_object_id) + .collect(); + + let tx_bytes: TransactionBlockBytes = indexer_client + .pay_all_iota(from_address, coins, to_address, 10_000_000.into()) + .await + .unwrap(); + + execute_tx_and_wait_for_indexer(indexer_client, cluster, store, tx_bytes, keypair).await; +} diff --git a/crates/iota-indexer/tests/rpc-tests/indexer_api.rs b/crates/iota-indexer/tests/rpc-tests/indexer_api.rs index 49f4e35ff80..72c42d4e799 100644 --- a/crates/iota-indexer/tests/rpc-tests/indexer_api.rs +++ b/crates/iota-indexer/tests/rpc-tests/indexer_api.rs @@ -30,8 +30,9 @@ use move_core_types::{ }; use crate::common::{ - ApiTestSetup, indexer_wait_for_checkpoint, indexer_wait_for_object, - indexer_wait_for_transaction, rpc_call_error_msg_matches, + ApiTestSetup, indexer_wait_for_checkpoint, indexer_wait_for_latest_checkpoint, + indexer_wait_for_object, indexer_wait_for_transaction, rpc_call_error_msg_matches, + start_test_cluster_with_read_write_indexer, }; #[test] @@ -185,36 +186,64 @@ fn query_events_supported_events() { }); } -#[test] -fn query_validator_epoch_info_event() { - let ApiTestSetup { - runtime, - store, - client, - cluster, - } = ApiTestSetup::get_or_init(); - - runtime.block_on(async move { - indexer_wait_for_checkpoint(store, 1).await; - - cluster.force_new_epoch().await; - - let result = client.query_events(EventFilter::MoveEventType("0x0000000000000000000000000000000000000000000000000000000000000003::validator_set::ValidatorEpochInfoEventV1".parse().unwrap()), None, None, None).await; - assert!(result.is_ok()); - assert!(!result.unwrap().data.is_empty()); +#[tokio::test] +async fn query_validator_epoch_info_event() { + let (cluster, store, client) = + &start_test_cluster_with_read_write_indexer(Some("query_validator_epoch_info_event"), None) + .await; + indexer_wait_for_checkpoint(store, 1).await; - let result = client.query_events(EventFilter::MoveEventType("0x3::validator_set::ValidatorEpochInfoEventV1".parse().unwrap()), None, None, None).await; - assert!(result.is_ok()); - assert!(!result.unwrap().data.is_empty()); + cluster.force_new_epoch().await; + indexer_wait_for_latest_checkpoint(store, cluster).await; - let result = client.query_events(EventFilter::MoveEventType("0x0003::validator_set::ValidatorEpochInfoEventV1".parse().unwrap()), None, None, None).await; - assert!(result.is_ok()); - assert!(!result.unwrap().data.is_empty()); + let result = client.query_events(EventFilter::MoveEventType("0x0000000000000000000000000000000000000000000000000000000000000003::validator_set::ValidatorEpochInfoEventV1".parse().unwrap()), None, None, None).await; + assert!(result.is_ok()); + assert!(!result.unwrap().data.is_empty()); - let result = client.query_events(EventFilter::MoveEventType("0x1::validator_set::ValidatorEpochInfoEventV1".parse().unwrap()), None, None, None).await; - assert!(result.is_ok()); - assert!(result.unwrap().data.is_empty()); - }); + let result = client + .query_events( + EventFilter::MoveEventType( + "0x3::validator_set::ValidatorEpochInfoEventV1" + .parse() + .unwrap(), + ), + None, + None, + None, + ) + .await; + assert!(result.is_ok()); + assert!(!result.unwrap().data.is_empty()); + + let result = client + .query_events( + EventFilter::MoveEventType( + "0x0003::validator_set::ValidatorEpochInfoEventV1" + .parse() + .unwrap(), + ), + None, + None, + None, + ) + .await; + assert!(result.is_ok()); + assert!(!result.unwrap().data.is_empty()); + + let result = client + .query_events( + EventFilter::MoveEventType( + "0x1::validator_set::ValidatorEpochInfoEventV1" + .parse() + .unwrap(), + ), + None, + None, + None, + ) + .await; + assert!(result.is_ok()); + assert!(result.unwrap().data.is_empty()); } #[test] diff --git a/crates/iota-indexer/tests/rpc-tests/transaction_builder.rs b/crates/iota-indexer/tests/rpc-tests/transaction_builder.rs index ae4612d465b..cfb35f33a5a 100644 --- a/crates/iota-indexer/tests/rpc-tests/transaction_builder.rs +++ b/crates/iota-indexer/tests/rpc-tests/transaction_builder.rs @@ -28,14 +28,13 @@ use iota_types::{ label::label_struct_tag_to_string, stardust_upgrade_label::stardust_upgrade_label_type, timelock::TimeLock, }, - utils::to_sender_signed_transaction, }; use jsonrpsee::http_client::HttpClient; use test_cluster::TestCluster; use crate::common::{ - ApiTestSetup, indexer_wait_for_checkpoint, indexer_wait_for_latest_checkpoint, - indexer_wait_for_object, indexer_wait_for_transaction, + ApiTestSetup, execute_tx_and_wait_for_indexer, indexer_wait_for_checkpoint, + indexer_wait_for_latest_checkpoint, indexer_wait_for_object, start_test_cluster_with_read_write_indexer, }; const FUNDED_BALANCE_PER_COIN: u64 = 10_000_000_000; @@ -772,18 +771,6 @@ fn request_withdraw_timelocked_stake_from_active() { .unwrap(); } -async fn execute_tx_and_wait_for_indexer( - indexer_client: &HttpClient, - cluster: &TestCluster, - store: &PgIndexerStore, - tx_bytes: TransactionBlockBytes, - keypair: &AccountKeyPair, -) { - let txn = to_sender_signed_transaction(tx_bytes.to_data().unwrap(), keypair); - let res = cluster.wallet.execute_transaction_must_succeed(txn).await; - indexer_wait_for_transaction(res.digest, store, indexer_client).await; -} - async fn get_address_balances(indexer_client: &HttpClient, address: IotaAddress) -> Vec { indexer_client .get_coins(address, None, None, None) diff --git a/crates/iota-indexer/tests/rpc-tests/write_api.rs b/crates/iota-indexer/tests/rpc-tests/write_api.rs index 200e80f66d9..91997444a53 100644 --- a/crates/iota-indexer/tests/rpc-tests/write_api.rs +++ b/crates/iota-indexer/tests/rpc-tests/write_api.rs @@ -2,15 +2,14 @@ // SPDX-License-Identifier: Apache-2.0 use fastcrypto::encoding::Base64; -use iota_json_rpc_api::{ - IndexerApiClient, ReadApiClient, TransactionBuilderClient, WriteApiClient, -}; +use iota_json_rpc_api::{ReadApiClient, TransactionBuilderClient, WriteApiClient}; use iota_json_rpc_types::{ IotaExecutionStatus, IotaObjectDataOptions, IotaTransactionBlockEffectsAPI, IotaTransactionBlockResponseOptions, }; use iota_types::{ base_types::{IotaAddress, ObjectID}, + crypto::{AccountKeyPair, get_key_pair}, object::Owner, programmable_transaction_builder::ProgrammableTransactionBuilder, quorum_driver_types::ExecuteTransactionRequestType, @@ -125,17 +124,28 @@ fn dev_inspect_transaction_block() { runtime.block_on(async { indexer_wait_for_checkpoint(store, 1).await; - let sender = cluster.get_address_0(); - let receiver = cluster.get_address_1(); + let (sender, _): (_, AccountKeyPair) = get_key_pair(); + let (receiver, _): (_, AccountKeyPair) = get_key_pair(); - let objects = cluster - .rpc_client() - .get_owned_objects(sender, None, None, None) - .await - .unwrap() - .data; + let gas = cluster + .fund_address_and_return_gas( + cluster.get_reference_gas_price().await, + Some(10_000_000_000), + sender, + ) + .await; - let (obj_id, seq_num, digest) = objects.first().unwrap().object().unwrap().object_ref(); + indexer_wait_for_object(client, gas.0, gas.1).await; + + let (obj_id, seq_num, digest) = cluster + .fund_address_and_return_gas( + cluster.get_reference_gas_price().await, + Some(10_000_000_000), + sender, + ) + .await; + + indexer_wait_for_object(client, obj_id, seq_num).await; let mut builder = ProgrammableTransactionBuilder::new(); builder @@ -173,15 +183,23 @@ fn dev_inspect_transaction_block() { .await .unwrap(); + // Ensure that the actual object sequence number remains unchanged after the + // checkpoint advances indexer_wait_for_checkpoint(store, latest_checkpoint_seq_number.into_inner() + 1).await; - let actual_object_info = client + let actual_object_data = client .get_object(obj_id, Some(IotaObjectDataOptions::new().with_owner())) .await + .unwrap() + .data .unwrap(); assert_eq!( - actual_object_info.data.unwrap().owner.unwrap(), + actual_object_data.version, seq_num, + "The object sequence number should not mutate" + ); + assert_eq!( + actual_object_data.owner.unwrap(), Owner::AddressOwner(sender), "The initial owner of the object should not change" ); diff --git a/crates/iota-json-rpc-api/Cargo.toml b/crates/iota-json-rpc-api/Cargo.toml index 7bec4ba6e6c..2d1478439ac 100644 --- a/crates/iota-json-rpc-api/Cargo.toml +++ b/crates/iota-json-rpc-api/Cargo.toml @@ -24,7 +24,7 @@ iota-open-rpc.workspace = true iota-open-rpc-macros.workspace = true iota-types.workspace = true # NOTE: It's important to keep the above dependency list short. -# This and the iota-sdk crate are widely used to develop on Iota and it's valuable +# This and the iota-sdk crate are widely used to develop on IOTA and it's valuable # to not have to pull in the entire iota repo for it. [dev-dependencies] diff --git a/crates/iota-json-rpc-api/src/coin.rs b/crates/iota-json-rpc-api/src/coin.rs index f3201e4ec64..23d63eee1de 100644 --- a/crates/iota-json-rpc-api/src/coin.rs +++ b/crates/iota-json-rpc-api/src/coin.rs @@ -20,7 +20,7 @@ pub trait CoinReadApi { #[method(name = "getCoins")] async fn get_coins( &self, - /// the owner's Iota address + /// the owner's IOTA address owner: IotaAddress, /// optional type name for the coin (e.g., 0x168da5bf1f48dafc111b0a488fa454aca95e0b5e::usdc::USDC), default to 0x2::iota::IOTA if not specified. coin_type: Option, @@ -35,7 +35,7 @@ pub trait CoinReadApi { #[method(name = "getAllCoins")] async fn get_all_coins( &self, - /// the owner's Iota address + /// the owner's IOTA address owner: IotaAddress, /// optional paging cursor cursor: Option, @@ -48,7 +48,7 @@ pub trait CoinReadApi { #[method(name = "getBalance")] async fn get_balance( &self, - /// the owner's Iota address + /// the owner's IOTA address owner: IotaAddress, /// optional type names for the coin (e.g., 0x168da5bf1f48dafc111b0a488fa454aca95e0b5e::usdc::USDC), default to 0x2::iota::IOTA if not specified. coin_type: Option, @@ -59,7 +59,7 @@ pub trait CoinReadApi { #[method(name = "getAllBalances")] async fn get_all_balances( &self, - /// the owner's Iota address + /// the owner's IOTA address owner: IotaAddress, ) -> RpcResult>; diff --git a/crates/iota-json-rpc-api/src/extended.rs b/crates/iota-json-rpc-api/src/extended.rs index b048fc7c425..4e7d796b8b4 100644 --- a/crates/iota-json-rpc-api/src/extended.rs +++ b/crates/iota-json-rpc-api/src/extended.rs @@ -14,7 +14,7 @@ use jsonrpsee::{core::RpcResult, proc_macros::rpc}; #[open_rpc(namespace = "iotax", tag = "Extended API")] #[rpc(server, client, namespace = "iotax")] pub trait ExtendedApi { - /// Return a list of epoch info + /// Return a list of epoch info. Exclusively served by the indexer. #[rustfmt::skip] #[method(name = "getEpochs")] async fn get_epochs( @@ -27,7 +27,8 @@ pub trait ExtendedApi { descending_order: Option, ) -> RpcResult; - /// Return a list of epoch metrics, which is a subset of epoch info + /// Return a list of epoch metrics, which is a subset of epoch info. + /// Exclusively served by the indexer. #[method(name = "getEpochMetrics")] async fn get_epoch_metrics( &self, @@ -39,31 +40,35 @@ pub trait ExtendedApi { descending_order: Option, ) -> RpcResult; - /// Return current epoch info + /// Return current epoch info. Exclusively served by the indexer. #[method(name = "getCurrentEpoch")] async fn get_current_epoch(&self) -> RpcResult; - /// Return Network metrics + /// Return Network metrics. Exclusively served by the indexer. #[method(name = "getNetworkMetrics")] async fn get_network_metrics(&self) -> RpcResult; - /// Return move call metrics + /// Return move call metrics. Exclusively served by the indexer. #[method(name = "getMoveCallMetrics")] async fn get_move_call_metrics(&self) -> RpcResult; - /// Address related metrics + /// Address related metrics. Exclusively served by the indexer. #[method(name = "getLatestAddressMetrics")] async fn get_latest_address_metrics(&self) -> RpcResult; + /// Address related metrics. Exclusively served by the indexer. #[method(name = "getCheckpointAddressMetrics")] async fn get_checkpoint_address_metrics(&self, checkpoint: u64) -> RpcResult; + /// Address related metrics. Exclusively served by the indexer. #[method(name = "getAllEpochAddressMetrics")] async fn get_all_epoch_address_metrics( &self, descending_order: Option, ) -> RpcResult>; + /// Return the total number of transactions. Exclusively served by the + /// indexer. #[method(name = "getTotalTransactions")] async fn get_total_transactions(&self) -> RpcResult>; } diff --git a/crates/iota-json-rpc-api/src/indexer.rs b/crates/iota-json-rpc-api/src/indexer.rs index b77ab45d2d6..e25363c265d 100644 --- a/crates/iota-json-rpc-api/src/indexer.rs +++ b/crates/iota-json-rpc-api/src/indexer.rs @@ -33,7 +33,7 @@ pub trait IndexerApi { #[method(name = "getOwnedObjects")] async fn get_owned_objects( &self, - /// the owner's Iota address + /// the owner's IOTA address address: IotaAddress, /// the objects query criteria. query: Option, @@ -73,7 +73,7 @@ pub trait IndexerApi { descending_order: Option, ) -> RpcResult; - /// Subscribe to a stream of Iota event + /// Subscribe to a stream of IOTA event #[rustfmt::skip] #[subscription(name = "subscribeEvent", item = IotaEvent)] fn subscribe_event( @@ -82,7 +82,7 @@ pub trait IndexerApi { filter: EventFilter, ) -> SubscriptionResult; - /// Subscribe to a stream of Iota transaction effects + /// Subscribe to a stream of IOTA transaction effects #[subscription(name = "subscribeTransaction", item = IotaTransactionBlockEffects)] fn subscribe_transaction(&self, filter: TransactionFilter) -> SubscriptionResult; diff --git a/crates/iota-json-rpc-api/src/transaction_builder.rs b/crates/iota-json-rpc-api/src/transaction_builder.rs index eb2019ae1d9..c8fd2d80b8a 100644 --- a/crates/iota-json-rpc-api/src/transaction_builder.rs +++ b/crates/iota-json-rpc-api/src/transaction_builder.rs @@ -26,7 +26,7 @@ pub trait TransactionBuilder { #[method(name = "transferObject")] async fn transfer_object( &self, - /// the transaction signer's Iota address + /// the transaction signer's IOTA address signer: IotaAddress, /// the ID of the object to be transferred object_id: ObjectID, @@ -34,22 +34,22 @@ pub trait TransactionBuilder { gas: Option, /// the gas budget, the transaction will fail if the gas cost exceed the budget gas_budget: BigInt, - /// the recipient's Iota address + /// the recipient's IOTA address recipient: IotaAddress, ) -> RpcResult; - /// Create an unsigned transaction to send IOTA coin object to a Iota address. The IOTA object is also used as the gas object. + /// Create an unsigned transaction to send IOTA coin object to an IOTA address. The IOTA object is also used as the gas object. #[rustfmt::skip] #[method(name = "transferIota")] async fn transfer_iota( &self, - /// the transaction signer's Iota address + /// the transaction signer's IOTA address signer: IotaAddress, - /// the Iota coin object to be used in this transaction + /// the IOTA coin object to be used in this transaction iota_object_id: ObjectID, /// the gas budget, the transaction will fail if the gas cost exceed the budget gas_budget: BigInt, - /// the recipient's Iota address + /// the recipient's IOTA address recipient: IotaAddress, /// the amount to be split out and transferred amount: Option>, @@ -63,9 +63,9 @@ pub trait TransactionBuilder { #[method(name = "pay")] async fn pay( &self, - /// the transaction signer's Iota address + /// the transaction signer's IOTA address signer: IotaAddress, - /// the Iota coins to be used in this transaction + /// the IOTA coins to be used in this transaction input_coins: Vec, /// the recipients' addresses, the length of this vector must be the same as amounts. recipients: Vec, @@ -90,9 +90,9 @@ pub trait TransactionBuilder { #[method(name = "payIota")] async fn pay_iota( &self, - /// the transaction signer's Iota address + /// the transaction signer's IOTA address signer: IotaAddress, - /// the Iota coins to be used in this transaction, including the coin for gas payment. + /// the IOTA coins to be used in this transaction, including the coin for gas payment. input_coins: Vec, /// the recipients' addresses, the length of this vector must be the same as amounts. recipients: Vec, @@ -113,9 +113,9 @@ pub trait TransactionBuilder { #[method(name = "payAllIota")] async fn pay_all_iota( &self, - /// the transaction signer's Iota address + /// the transaction signer's IOTA address signer: IotaAddress, - /// the Iota coins to be used in this transaction, including the coin for gas payment. + /// the IOTA coins to be used in this transaction, including the coin for gas payment. input_coins: Vec, /// the recipient address, recipient: IotaAddress, @@ -128,7 +128,7 @@ pub trait TransactionBuilder { #[method(name = "moveCall")] async fn move_call( &self, - /// the transaction signer's Iota address + /// the transaction signer's IOTA address signer: IotaAddress, /// the Move package ID, e.g. `0x2` package_object_id: ObjectID, @@ -153,7 +153,7 @@ pub trait TransactionBuilder { #[method(name = "publish")] async fn publish( &self, - /// the transaction signer's Iota address + /// the transaction signer's IOTA address sender: IotaAddress, /// the compiled bytes of a Move package compiled_modules: Vec, @@ -171,7 +171,7 @@ pub trait TransactionBuilder { #[method(name = "splitCoin")] async fn split_coin( &self, - /// the transaction signer's Iota address + /// the transaction signer's IOTA address signer: IotaAddress, /// the coin object to be spilt coin_object_id: ObjectID, @@ -188,7 +188,7 @@ pub trait TransactionBuilder { #[method(name = "splitCoinEqual")] async fn split_coin_equal( &self, - /// the transaction signer's Iota address + /// the transaction signer's IOTA address signer: IotaAddress, /// the coin object to be spilt coin_object_id: ObjectID, @@ -205,7 +205,7 @@ pub trait TransactionBuilder { #[method(name = "mergeCoins")] async fn merge_coin( &self, - /// the transaction signer's Iota address + /// the transaction signer's IOTA address signer: IotaAddress, /// the coin object to merge into, this coin will remain after the transaction primary_coin: ObjectID, @@ -222,7 +222,7 @@ pub trait TransactionBuilder { #[method(name = "batchTransaction")] async fn batch_transaction( &self, - /// the transaction signer's Iota address + /// the transaction signer's IOTA address signer: IotaAddress, /// list of transaction request parameters single_transaction_params: Vec, @@ -239,13 +239,13 @@ pub trait TransactionBuilder { #[method(name = "requestAddStake")] async fn request_add_stake( &self, - /// the transaction signer's Iota address + /// the transaction signer's IOTA address signer: IotaAddress, /// Coin object to stake coins: Vec, /// stake amount amount: Option>, - /// the validator's Iota address + /// the validator's IOTA address validator: IotaAddress, /// gas object to be used in this transaction, node will pick one from the signer's possession if not provided gas: Option, @@ -258,7 +258,7 @@ pub trait TransactionBuilder { #[method(name = "requestWithdrawStake")] async fn request_withdraw_stake( &self, - /// the transaction signer's Iota address + /// the transaction signer's IOTA address signer: IotaAddress, /// StakedIota object ID staked_iota: ObjectID, @@ -273,11 +273,11 @@ pub trait TransactionBuilder { #[method(name = "requestAddTimelockedStake")] async fn request_add_timelocked_stake( &self, - /// the transaction signer's Iota address + /// the transaction signer's IOTA address signer: IotaAddress, /// TimeLock> object to stake locked_balance: ObjectID, - /// the validator's Iota address + /// the validator's IOTA address validator: IotaAddress, /// gas object to be used in this transaction gas: ObjectID, @@ -290,7 +290,7 @@ pub trait TransactionBuilder { #[method(name = "requestWithdrawTimelockedStake")] async fn request_withdraw_timelocked_stake( &self, - /// the transaction signer's Iota address + /// the transaction signer's IOTA address signer: IotaAddress, /// TimelockedStakedIota object ID timelocked_staked_iota: ObjectID, diff --git a/crates/iota-json-rpc-tests/tests/coin_api.rs b/crates/iota-json-rpc-tests/tests/coin_api.rs index 1cdf7328abd..276ee081f48 100644 --- a/crates/iota-json-rpc-tests/tests/coin_api.rs +++ b/crates/iota-json-rpc-tests/tests/coin_api.rs @@ -28,7 +28,7 @@ use iota_types::{ quorum_driver_types::ExecuteTransactionRequestType, }; use jsonrpsee::http_client::HttpClient; -use test_cluster::TestClusterBuilder; +use test_cluster::{TestCluster, TestClusterBuilder}; async fn create_and_mint_coins( http_client: &HttpClient, @@ -88,7 +88,10 @@ async fn create_and_mint_coins( }) .unwrap(); - let coin_name = format!("{package_id}::trusted_coin::TRUSTED_COIN"); + let coin_name = format!( + "{}::trusted_coin::TRUSTED_COIN", + package_id.to_hex_literal() + ); let result: Supply = http_client .get_total_supply(coin_name.clone()) .await @@ -718,3 +721,86 @@ async fn get_all_balances() { "New coin should have correct balance" ); } + +#[sim_test] +async fn get_all_balances_after_zeroing_coins_count() { + let cluster = TestClusterBuilder::new().build().await; + let http_client = cluster.rpc_client(); + let address = cluster.get_address_0(); + let other_address = cluster.get_address_1(); + + // Get all balances + let balances: Vec = http_client.get_all_balances(address).await.unwrap(); + assert!(!balances.is_empty(), "Should have some balances"); + + // Check if IOTA balance exists + let iota_balance = balances + .iter() + .find(|b| b.coin_type == "0x2::iota::IOTA") + .expect("IOTA balance should exist"); + + assert!( + iota_balance.coin_object_count > 0, + "There should be more than 0 IOTA coins" + ); + + transfer_all_coins(&cluster, http_client, address, other_address) + .await + .unwrap(); + + let updated_balances: Vec = http_client.get_all_balances(address).await.unwrap(); + assert!( + updated_balances.is_empty(), + "Should have no balances after sending away all IOTA coins" + ); +} + +async fn transfer_all_coins( + cluster: &TestCluster, + http_client: &HttpClient, + from_address: IotaAddress, + to_address: IotaAddress, +) -> Result { + let coins = http_client + .get_coins(from_address, None, None, None) + .await + .unwrap() + .data + .iter() + .map(|coin| coin.coin_object_id) + .collect(); + + let transaction_bytes: TransactionBlockBytes = http_client + .pay_all_iota(from_address, coins, to_address, 10_000_000.into()) + .await?; + + execute_tx(cluster, http_client, transaction_bytes).await +} + +async fn execute_tx( + cluster: &TestCluster, + http_client: &HttpClient, + transaction_bytes: TransactionBlockBytes, +) -> Result { + let tx = cluster + .wallet + .sign_transaction(&transaction_bytes.to_data()?); + let (tx_bytes, signatures) = tx.to_tx_bytes_and_signatures(); + + let tx_response: IotaTransactionBlockResponse = http_client + .execute_transaction_block( + tx_bytes, + signatures, + Some( + IotaTransactionBlockResponseOptions::new() + .with_effects() + .with_object_changes() + .with_balance_changes(), + ), + Some(ExecuteTransactionRequestType::WaitForLocalExecution), + ) + .await?; + assert_eq!(tx_response.status_ok(), Some(true)); + + Ok(tx_response) +} diff --git a/crates/iota-json-rpc-types/src/iota_event.rs b/crates/iota-json-rpc-types/src/iota_event.rs index 80ed4023f0d..828ddb8450f 100644 --- a/crates/iota-json-rpc-types/src/iota_event.rs +++ b/crates/iota-json-rpc-types/src/iota_event.rs @@ -44,7 +44,7 @@ pub struct IotaEvent { #[serde_as(as = "DisplayFromStr")] /// Move module where this event was emitted. pub transaction_module: Identifier, - /// Sender's Iota address. + /// Sender's IOTA address. pub sender: IotaAddress, #[schemars(with = "String")] #[serde_as(as = "IotaStructTag")] diff --git a/crates/iota-json-rpc-types/src/iota_move.rs b/crates/iota-json-rpc-types/src/iota_move.rs index 239afb24a09..feb3ce0264d 100644 --- a/crates/iota-json-rpc-types/src/iota_move.rs +++ b/crates/iota-json-rpc-types/src/iota_move.rs @@ -376,7 +376,7 @@ impl From for IotaMoveValue { IotaMoveValue::Vector(values.into_iter().map(|value| value.into()).collect()) } MoveValue::Struct(value) => { - // Best effort Iota core type conversion + // Best effort IOTA core type conversion let MoveStruct { type_, fields } = &value; if let Some(value) = try_convert_type(type_, fields) { return value; diff --git a/crates/iota-json-rpc-types/src/iota_transaction.rs b/crates/iota-json-rpc-types/src/iota_transaction.rs index 23e4cdfc8c0..1c044f64ab2 100644 --- a/crates/iota-json-rpc-types/src/iota_transaction.rs +++ b/crates/iota-json-rpc-types/src/iota_transaction.rs @@ -1249,7 +1249,7 @@ impl DevInspectResults { #[derive(Eq, PartialEq, Clone, Debug, Serialize, Deserialize, JsonSchema)] pub enum IotaTransactionBlockBuilderMode { - /// Regular Iota Transactions that are committed on chain + /// Regular IOTA Transactions that are committed on chain Commit, /// Simulated transaction that allows calling any Move function with /// arbitrary values. diff --git a/crates/iota-json-rpc/src/lib.rs b/crates/iota-json-rpc/src/lib.rs index 4332692fac1..75280868d70 100644 --- a/crates/iota-json-rpc/src/lib.rs +++ b/crates/iota-json-rpc/src/lib.rs @@ -70,8 +70,8 @@ pub struct JsonRpcServerBuilder { pub fn iota_rpc_doc(version: &str) -> Project { Project::new( version, - "Iota JSON-RPC", - "Iota JSON-RPC API for interaction with Iota Full node. Make RPC calls using https://fullnode.NETWORK.iota.io:443, where NETWORK is the network you want to use (testnet, devnet, mainnet). By default, local networks use port 9000.", + "IOTA JSON-RPC", + "IOTA JSON-RPC API for interaction with IOTA full node or indexer. Make RPC calls using https://api.NETWORK.iota.cafe:443 (or https://indexer.NETWORK.iota.cafe:443 for the indexer), where NETWORK is the network you want to use (testnet, devnet, mainnet). By default, local networks use port 9000 (or 9124 for the indexer).", "IOTA Foundation", "https://iota.org", "info@iota.org", @@ -257,7 +257,7 @@ impl JsonRpcServerBuilder { let handle = ServerHandle { handle: ServerHandleInner::Axum(handle), }; - info!(local_addr =? addr, "Iota JSON-RPC server listening on {addr}"); + info!(local_addr =? addr, "IOTA JSON-RPC server listening on {addr}"); Ok(handle) } } diff --git a/crates/iota-keys/src/keypair_file.rs b/crates/iota-keys/src/keypair_file.rs index 1a2c9dffaf4..21bf12f6f7f 100644 --- a/crates/iota-keys/src/keypair_file.rs +++ b/crates/iota-keys/src/keypair_file.rs @@ -88,7 +88,7 @@ pub fn read_key(path: &PathBuf, require_secp256k1: bool) -> Result validate_alias(x)?, - None => random_name( - &self - .alias_names() - .into_iter() - .map(|x| x.to_string()) - .collect::>(), - ), - }; + + let new_alias_name = self.create_alias(new_alias.map(str::to_string))?; + for a in self.aliases_mut() { if a.alias == old_alias { let pk = &a.public_key_base64; diff --git a/crates/iota-keys/src/random_names.rs b/crates/iota-keys/src/random_names.rs index 8c943bccb53..5b18e2dde57 100644 --- a/crates/iota-keys/src/random_names.rs +++ b/crates/iota-keys/src/random_names.rs @@ -2,15 +2,14 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 +//! This library provides two functions to generate a random combination of an +//! adjective and a precious stone name as a well formatted string, or a list of +//! these strings. + use std::collections::HashSet; use rand::{Rng, rngs::ThreadRng, thread_rng}; -/// This library provides two functions to generate -/// a random combination of an adjective -/// and a precious stone name as a well formatted -/// string, or a list of these strings. - /// A list of adjectives const LEFT_NAMES: [&str; 108] = [ "admiring", diff --git a/crates/iota-keys/tests/tests.rs b/crates/iota-keys/tests/tests.rs index 08da6e43a76..04c65bc8c9e 100644 --- a/crates/iota-keys/tests/tests.rs +++ b/crates/iota-keys/tests/tests.rs @@ -163,6 +163,21 @@ fn update_alias_test() { let update = keystore.update_alias("o", None).unwrap(); let aliases = keystore.alias_names(); assert_eq!(vec![&update], aliases); + + // check that updating alias does not allow duplicates + keystore + .generate_and_add_new_key( + SignatureScheme::ED25519, + Some("my_alias_test".to_string()), + None, + None, + ) + .unwrap(); + assert!( + keystore + .update_alias("my_alias_test", Some(&update)) + .is_err() + ); } #[test] @@ -211,7 +226,7 @@ fn mnemonic_test() { } /// This test confirms rust's implementation of mnemonic is the same with the -/// Iota Wallet +/// IOTA Wallet #[test] fn iota_wallet_address_mnemonic_test() -> Result<(), anyhow::Error> { let phrase = "result crisp session latin must fruit genuine question prevent start coconut brave speak student dismiss"; diff --git a/crates/iota-light-client/README.md b/crates/iota-light-client/README.md index 917a59a5213..381e459ac4b 100644 --- a/crates/iota-light-client/README.md +++ b/crates/iota-light-client/README.md @@ -1,4 +1,4 @@ -This crate contains a Command Line Interface light client for Iota. +This crate contains a Command Line Interface light client for IOTA. # What is a light client? @@ -6,7 +6,7 @@ A light client allows checking the authenticity and validity of on-chain state, Running a _full node_ requires downloading the full sequence of all transaction and re-executing them. Then the full state of the blockchain is available locally to serve reads. This is however an expensive process in terms of network bandwidth needed to download the full sequence of transactions, as well as CPU to re-execute it, and storage to store the full state of the blockchain. -Alternatively, a _light client_ only needs to download minimal information to authenticate blockchain state. Specifically in Iota, the light client needs to _sync_ all end-of-epoch checkpoints that contain information about the committee in the next epoch. Sync involves downloading the checkpoints and checking their validity by checking their certificate. +Alternatively, a _light client_ only needs to download minimal information to authenticate blockchain state. Specifically in IOTA, the light client needs to _sync_ all end-of-epoch checkpoints that contain information about the committee in the next epoch. Sync involves downloading the checkpoints and checking their validity by checking their certificate. Once all end-of-epoch checkpoints are downloaded and checked, any event or current object can be checked for its validity. To do that the light client downloads the checkpoint in which the transaction was executed, and the effects structure that summarizes its effects on the system, including events emitted and objects created. The chain of validity from the checkpoint to the effects and its contents is checked via the certificate on the checkpoint and the hashes of all structures. @@ -20,15 +20,15 @@ The light client requires a config file and a directory to cache checkpoints, an ## Setup -The config file for the light client takes a URL for a full node, a directory (that must exist) and within the directory to name of the genesis blob for the Iota network. +The config file for the light client takes a URL for a full node, a directory (that must exist) and within the directory to name of the genesis blob for the IOTA network. ``` -full_node_url: "http://ord-mnt-rpcbig-06.mainnet.iota.io:9000" +full_node_url: "https://api.testnet.iota.cafe:443" checkpoint_summary_dir: "checkpoints_dir" genesis_filename: "genesis.blob" ``` -The genesis blob for the Iota mainnet can be found here: https://github.com/iotaledger/iota-genesis/blob/main/mainnet/genesis.blob +The genesis blob for the IOTA mainnet can be found here: https://github.com/iotaledger/iota-genesis/blob/main/mainnet/genesis.blob ## Sync diff --git a/crates/iota-light-client/src/bin/light_client.rs b/crates/iota-light-client/src/bin/light_client.rs index 1db8daab15f..e99ef02494c 100644 --- a/crates/iota-light-client/src/bin/light_client.rs +++ b/crates/iota-light-client/src/bin/light_client.rs @@ -13,7 +13,7 @@ use iota_light_client::utils::{ use iota_package_resolver::Resolver; use iota_types::{base_types::ObjectID, digests::TransactionDigest, object::Data}; -/// A light client for the Iota blockchain +/// A light client for the IOTA blockchain #[derive(Parser, Debug)] #[command(author, version, about, long_about = None)] struct Args { diff --git a/crates/iota-light-client/src/proof.rs b/crates/iota-light-client/src/proof.rs index 36d2ee30a6f..96058205b7f 100644 --- a/crates/iota-light-client/src/proof.rs +++ b/crates/iota-light-client/src/proof.rs @@ -13,7 +13,7 @@ use iota_types::{ transaction::Transaction, }; -/// Define aspect of Iota state that needs to be certified in a proof +/// Define aspect of IOTA state that needs to be certified in a proof #[derive(Default)] pub struct ProofTarget { /// Objects that need to be certified. diff --git a/crates/iota-metric-checker/README.md b/crates/iota-metric-checker/README.md index 599b271d082..cc7d0e90947 100644 --- a/crates/iota-metric-checker/README.md +++ b/crates/iota-metric-checker/README.md @@ -5,7 +5,7 @@ The `iota-metric-checker` crate is used for querying prometheus metrics and vali ### Example Usage ``` -RUST_LOG=debug cargo run --package iota-metric-checker --bin iota-metric-checker -- --api-key xxxxxxxx --api-user xxxx_metrics --config checks.yaml --url https://xxxx.iota.io/prometheus +RUST_LOG=debug cargo run --package iota-metric-checker --bin iota-metric-checker -- --api-key xxxxxxxx --api-user xxxx_metrics --config checks.yaml --url https://xxxx.iota.cafe/prometheus ``` ### Example Config diff --git a/crates/iota-metrics/src/metered_channel.rs b/crates/iota-metrics/src/metered_channel.rs index 14c86ec2313..ae7cc11c25d 100644 --- a/crates/iota-metrics/src/metered_channel.rs +++ b/crates/iota-metrics/src/metered_channel.rs @@ -291,7 +291,7 @@ impl Sender { } //////////////////////////////// -/// Stream API Wrappers! +// Stream API Wrappers! //////////////////////////////// /// A wrapper around [`crate::metered_channel::Receiver`] that implements @@ -356,7 +356,7 @@ impl From> for ReceiverStream { // cases. //////////////////////////////////////////////////////////////// -/// Constructor +// Constructor //////////////////////////////////////////////////////////////// /// Similar to `mpsc::channel`, `channel` creates a pair of `Sender` and diff --git a/crates/iota-move-build/Cargo.toml b/crates/iota-move-build/Cargo.toml index 5ddcd6b91f3..5d4a7e73622 100644 --- a/crates/iota-move-build/Cargo.toml +++ b/crates/iota-move-build/Cargo.toml @@ -5,7 +5,7 @@ authors = ["IOTA Foundation "] edition = "2021" license = "Apache-2.0" publish = false -description = "Logic for building Iota Move Packages" +description = "Logic for building IOTA Move Packages" [dependencies] # external dependencies diff --git a/crates/iota-move-build/src/lib.rs b/crates/iota-move-build/src/lib.rs index 309885fcbf1..d3215b3b1ef 100644 --- a/crates/iota-move-build/src/lib.rs +++ b/crates/iota-move-build/src/lib.rs @@ -54,7 +54,7 @@ use serde_reflection::Registry; #[path = "unit_tests/build_tests.rs"] mod build_tests; -/// Wrapper around the core Move `CompiledPackage` with some Iota-specific +/// Wrapper around the core Move `CompiledPackage` with some IOTA-specific /// traits and info #[derive(Debug, Clone)] pub struct CompiledPackage { @@ -65,7 +65,7 @@ pub struct CompiledPackage { pub dependency_ids: PackageDependencies, } -/// Wrapper around the core Move `BuildConfig` with some Iota-specific info +/// Wrapper around the core Move `BuildConfig` with some IOTA-specific info #[derive(Clone)] pub struct BuildConfig { pub config: MoveBuildConfig, @@ -156,7 +156,7 @@ impl BuildConfig { } /// Given a `path` and a `build_config`, build the package in that path, - /// including its dependencies. If we are building the Iota framework, + /// including its dependencies. If we are building the IOTA framework, /// we skip the check that the addresses should be 0 pub fn build(self, path: &Path) -> IotaResult { let print_diags_to_stderr = self.print_diags_to_stderr; @@ -337,7 +337,7 @@ impl CompiledPackage { } else { // Collect all module IDs from the current package to be published (module names // are not sufficient as we may have modules with the same names in - // user code and in Iota framework which would result in the latter + // user code and in IOTA framework which would result in the latter // being pulled into a set of modules to be published). let self_modules: HashSet<_> = self .package @@ -396,13 +396,13 @@ impl CompiledPackage { .filter(|m| *m.self_id().address() == BRIDGE_ADDRESS) } - /// Get bytecode modules from the Iota System that are used by this package + /// Get bytecode modules from the IOTA System that are used by this package pub fn get_iota_system_modules(&self) -> impl Iterator { self.get_modules_and_deps() .filter(|m| *m.self_id().address() == IOTA_SYSTEM_ADDRESS) } - /// Get bytecode modules from the Iota Framework that are used by this + /// Get bytecode modules from the IOTA Framework that are used by this /// package pub fn get_iota_framework_modules(&self) -> impl Iterator { self.get_modules_and_deps() diff --git a/crates/iota-move-build/src/unit_tests/build_tests.rs b/crates/iota-move-build/src/unit_tests/build_tests.rs index 992a1095bee..e32e4bf0fef 100644 --- a/crates/iota-move-build/src/unit_tests/build_tests.rs +++ b/crates/iota-move-build/src/unit_tests/build_tests.rs @@ -8,7 +8,7 @@ use crate::BuildConfig; #[test] fn generate_struct_layouts() { - // build the Iota framework and generate struct layouts to make sure nothing + // build the IOTA framework and generate struct layouts to make sure nothing // crashes let path = Path::new(env!("CARGO_MANIFEST_DIR")) .parent() diff --git a/crates/iota-move-lsp/src/bin/move-analyzer.rs b/crates/iota-move-lsp/src/bin/move-analyzer.rs index 1faf3513773..4865c4fe484 100644 --- a/crates/iota-move-lsp/src/bin/move-analyzer.rs +++ b/crates/iota-move-lsp/src/bin/move-analyzer.rs @@ -9,7 +9,7 @@ use move_analyzer::analyzer; bin_version::bin_version!(); #[derive(Parser)] -#[clap( +#[command( name = env!("CARGO_BIN_NAME"), rename_all = "kebab-case", author, diff --git a/crates/iota-move/src/build.rs b/crates/iota-move/src/build.rs index 0eb2829a2ef..2bd347d8cd6 100644 --- a/crates/iota-move/src/build.rs +++ b/crates/iota-move/src/build.rs @@ -21,22 +21,27 @@ const STRUCT_LAYOUTS_FILENAME: &str = "struct_layouts.yaml"; pub struct Build { /// Include the contents of packages in dependencies that haven't been /// published (only relevant when dumping bytecode as base64) - #[clap(long, global = true)] + #[arg(long, global = true)] pub with_unpublished_dependencies: bool, /// Whether we are printing in base64. - #[clap(long, global = true)] + #[arg(long, global = true)] pub dump_bytecode_as_base64: bool, - /// If true, generate struct layout schemas for - /// all struct types passed into `entry` functions declared by modules in - /// this package These layout schemas can be consumed by clients (e.g., - /// the TypeScript SDK) to enable serialization/deserialization of - /// transaction arguments and events. - #[clap(long, global = true)] + /// Don't specialize the package to the active chain when dumping bytecode + /// as Base64. This allows building to proceed without a network connection + /// or active environment, but it will not be able to automatically + /// determine the addresses of its dependencies. + #[arg(long, global = true, requires = "dump_bytecode_as_base64")] + pub ignore_chain: bool, + /// If true, generate struct layout schemas for all struct types passed into + /// `entry` functions declared by modules in this package These layout + /// schemas can be consumed by clients (e.g., the TypeScript SDK) to enable + /// serialization/deserialization of transaction arguments and events. + #[arg(long, global = true)] pub generate_struct_layouts: bool, /// The chain ID, if resolved. Required when the dump_bytecode_as_base64 is /// true, for automated address management, where package addresses are /// resolved for the respective chain in the Move.lock file. - #[clap(skip)] + #[arg(skip)] pub chain_id: Option, } diff --git a/crates/iota-move/src/coverage.rs b/crates/iota-move/src/coverage.rs index 836d28d36df..84e3bf47c2e 100644 --- a/crates/iota-move/src/coverage.rs +++ b/crates/iota-move/src/coverage.rs @@ -11,7 +11,7 @@ use move_package::BuildConfig; #[derive(Parser)] #[group(id = "iota-move-coverage")] pub struct Coverage { - #[clap(flatten)] + #[command(flatten)] pub coverage: coverage::Coverage, } diff --git a/crates/iota-move/src/disassemble.rs b/crates/iota-move/src/disassemble.rs index 42671f872b0..4e29995b07f 100644 --- a/crates/iota-move/src/disassemble.rs +++ b/crates/iota-move/src/disassemble.rs @@ -20,14 +20,14 @@ use move_package::BuildConfig; #[group(id = "iota-move-disassemmble")] pub struct Disassemble { /// Path to a .mv file to disassemble - #[clap(name = "module_path")] + #[arg(name = "module_path")] module_path: PathBuf, /// Whether to display the disassembly in raw Debug format - #[clap(long = "Xdebug")] + #[arg(long = "Xdebug")] debug: bool, - #[clap(short = 'i', long = "interactive")] + #[arg(short = 'i', long = "interactive")] interactive: bool, } diff --git a/crates/iota-move/src/iota-natives.bpl b/crates/iota-move/src/iota-natives.bpl index f9825430840..845c461720a 100644 --- a/crates/iota-move/src/iota-natives.bpl +++ b/crates/iota-move/src/iota-natives.bpl @@ -53,7 +53,7 @@ procedure {:inline 1} $2_tx_context_derive_id(tx_hash: Vec (int), ids_created: i {%- set T = instance.name -%} // ---------------------------------------------------------------------------------- -// Native Iota event implementation for object type `{{instance.suffix}}` +// Native IOTA event implementation for object type `{{instance.suffix}}` procedure {:inline 1} $2_event_emit{{S}}(event: {{T}}); @@ -69,7 +69,7 @@ procedure {:inline 1} $2_event_emit{{S}}(event: {{T}}); {%- set T = instance.name -%} // ---------------------------------------------------------------------------------- -// Native Iota types implementation for object type `{{instance.suffix}}` +// Native IOTA types implementation for object type `{{instance.suffix}}` procedure {:inline 1} $2_types_is_one_time_witness{{S}}(_: {{T}}) returns (res: bool); @@ -112,7 +112,7 @@ procedure {:inline 1} $2_dynamic_field_has_child_object_with_ty{{S}}(parent: int {%- set T = instance.name -%} // ---------------------------------------------------------------------------------- -// Native Iota prover implementation for object type `{{instance.suffix}}` +// Native IOTA prover implementation for object type `{{instance.suffix}}` function $2_prover_vec_remove{{S}}(v: Vec ({{T}}), elem_idx: int): Vec ({{T}}) { RemoveAtVec(v, elem_idx) diff --git a/crates/iota-move/src/lib.rs b/crates/iota-move/src/lib.rs index 6e3f4832bd7..04c94cb7800 100644 --- a/crates/iota-move/src/lib.rs +++ b/crates/iota-move/src/lib.rs @@ -38,9 +38,9 @@ pub enum Command { } #[derive(Parser)] pub struct Calib { - #[clap(name = "runs", short = 'r', long = "runs", default_value = "1")] + #[arg(name = "runs", short = 'r', long = "runs", default_value = "1")] runs: usize, - #[clap(name = "summarize", short = 's', long = "summarize")] + #[arg(name = "summarize", short = 's', long = "summarize")] summarize: bool, } diff --git a/crates/iota-move/src/main.rs b/crates/iota-move/src/main.rs index d18514582a3..b4129d7a6f9 100644 --- a/crates/iota-move/src/main.rs +++ b/crates/iota-move/src/main.rs @@ -15,29 +15,29 @@ use tracing::debug; bin_version::bin_version!(); #[derive(Parser)] -#[clap( +#[command( name = env!("CARGO_BIN_NAME"), - about = "Iota-Move CLI", + about = "IOTA Move CLI", rename_all = "kebab-case", author, version = VERSION, )] struct Args { /// Path to a package which the command should be run with respect to. - #[clap(long = "path", short = 'p', global = true)] + #[arg(long = "path", short = 'p', global = true)] pub package_path: Option, /// If true, run the Move bytecode verifier on the bytecode from a /// successful build - #[clap(long = "path", short = 'p', global = true)] + #[arg(long = "path", short = 'p', global = true)] pub run_bytecode_verifier: bool, /// If true, print build diagnostics to stderr--no printing if false - #[clap(long = "path", short = 'p', global = true)] + #[arg(long = "path", short = 'p', global = true)] pub print_diags_to_stderr: bool, /// Package build options - #[clap(flatten)] + #[command(flatten)] pub build_config: MoveBuildConfig, /// Subcommands. - #[clap(subcommand)] + #[command(subcommand)] pub cmd: iota_move::Command, } @@ -64,7 +64,7 @@ async fn main() { .with_log_file(&format!("{bin_name}.log")) .with_env() .init(); - debug!("Iota-Move CLI version: {VERSION}"); + debug!("IOTA Move CLI version: {VERSION}"); exit_main!(execute_move_command( args.package_path.as_deref(), diff --git a/crates/iota-move/src/manage_package.rs b/crates/iota-move/src/manage_package.rs index 4f2f5d64e2b..e377c9c5bd0 100644 --- a/crates/iota-move/src/manage_package.rs +++ b/crates/iota-move/src/manage_package.rs @@ -23,23 +23,23 @@ const NO_LOCK_FILE: &str = "Expected a `Move.lock` file to exist in the package #[derive(Parser)] #[group(id = "iota-move-manage-package")] pub struct ManagePackage { - #[clap(long)] + #[arg(long)] /// The environment to associate this package information with (consider /// using `iota client active-env`). pub environment: String, - #[clap(long = "network-id")] + #[arg(long = "network-id")] /// The network chain identifer. Use '35834a8a' for mainnet. pub chain_id: String, - #[clap(long = "original-id", value_parser = ObjectID::from_hex_literal)] + #[arg(long = "original-id", value_parser = ObjectID::from_hex_literal)] /// The original address (Object ID) where this package is published. pub original_id: ObjectID, - #[clap(long = "latest-id", value_parser = ObjectID::from_hex_literal)] + #[arg(long = "latest-id", value_parser = ObjectID::from_hex_literal)] /// The most recent address (Object ID) where this package is published. It /// is the same as 'original-id' if the package is immutable and /// published once. It is different from 'original-id' if the package has /// been upgraded to a different address. pub latest_id: ObjectID, - #[clap(long = "version-number")] + #[arg(long = "version-number")] /// The version number of the published package. It is '1' if the package is /// immutable and published once. It is some number greater than '1' if /// the package has been upgraded once or more. diff --git a/crates/iota-move/src/migrate.rs b/crates/iota-move/src/migrate.rs index 315b08053b3..5c72c5def7b 100644 --- a/crates/iota-move/src/migrate.rs +++ b/crates/iota-move/src/migrate.rs @@ -11,7 +11,7 @@ use move_package::BuildConfig as MoveBuildConfig; #[derive(Parser)] #[group(id = "iota-move-migrate")] pub struct Migrate { - #[clap(flatten)] + #[command(flatten)] pub migrate: migrate::Migrate, } diff --git a/crates/iota-move/src/new.rs b/crates/iota-move/src/new.rs index cc4ae3a721d..c7c4f7d107e 100644 --- a/crates/iota-move/src/new.rs +++ b/crates/iota-move/src/new.rs @@ -17,7 +17,7 @@ const IOTA_PKG_PATH: &str = "{ git = \"https://github.com/iotaledger/iota.git\", #[derive(Parser)] #[group(id = "iota-move-new")] pub struct New { - #[clap(flatten)] + #[command(flatten)] pub new: new::New, } diff --git a/crates/iota-move/src/unit_test.rs b/crates/iota-move/src/unit_test.rs index f85d7689d7d..2bfb09a79e4 100644 --- a/crates/iota-move/src/unit_test.rs +++ b/crates/iota-move/src/unit_test.rs @@ -34,7 +34,7 @@ const MAX_UNIT_TEST_INSTRUCTIONS: u64 = 1_000_000; #[derive(Parser)] #[group(id = "iota-move-test")] pub struct Test { - #[clap(flatten)] + #[command(flatten)] pub test: test::Test, } @@ -47,7 +47,7 @@ impl Test { let compute_coverage = self.test.compute_coverage; if !cfg!(debug_assertions) && compute_coverage { return Err(anyhow::anyhow!( - "The --coverage flag is currently supported only in debug builds. Please build the Iota CLI from source in debug mode." + "The --coverage flag is currently supported only in debug builds. Please build the IOTA CLI from source in debug mode." )); } // find manifest file directory from a given path or (if missing) from current diff --git a/crates/iota-network/build.rs b/crates/iota-network/build.rs index ee7d0a1a6f5..35dcae113ee 100644 --- a/crates/iota-network/build.rs +++ b/crates/iota-network/build.rs @@ -12,6 +12,9 @@ use tonic_build::manual::{Builder, Method, Service}; type Result = ::std::result::Result>; fn main() -> Result<()> { + println!("cargo::rustc-check-cfg=cfg(msim)"); + println!("cargo::rustc-check-cfg=cfg(fail_points)"); + let out_dir = if env::var("DUMP_GENERATED_GRPC").is_ok() { PathBuf::from("") } else { diff --git a/crates/iota-network/src/randomness/mod.rs b/crates/iota-network/src/randomness/mod.rs index 3bed5180149..3ada502b18e 100644 --- a/crates/iota-network/src/randomness/mod.rs +++ b/crates/iota-network/src/randomness/mod.rs @@ -952,7 +952,7 @@ impl RandomnessEventLoop { full_sig: Arc>, ) { // For simtests, we may test not sending partial signatures. - #[expect(unused_mut)] + #[cfg_attr(not(any(msim, fail_points)), expect(unused_mut))] let mut fail_point_skip_sending = false; fail_point_if!("rb-send-partial-signatures", || { fail_point_skip_sending = true; diff --git a/crates/iota-node/src/lib.rs b/crates/iota-node/src/lib.rs index 58443bb59e6..9469e669aa1 100644 --- a/crates/iota-node/src/lib.rs +++ b/crates/iota-node/src/lib.rs @@ -1575,7 +1575,7 @@ impl IotaNode { .state .get_object_cache_reader() .get_iota_system_state_object_unsafe() - .expect("Read Iota System State object cannot fail"); + .expect("Read IOTA System State object cannot fail"); #[cfg(msim)] if !self @@ -1896,7 +1896,6 @@ impl IotaNode { .store(new_value, Ordering::Relaxed); } - #[expect(unused_variables)] async fn fetch_jwks( authority: AuthorityName, provider: &OIDCProvider, @@ -2083,7 +2082,7 @@ pub async fn build_http_server( .unwrap() }); - info!(local_addr =? addr, "Iota JSON-RPC server listening on {addr}"); + info!(local_addr =? addr, "IOTA JSON-RPC server listening on {addr}"); Ok(Some(handle)) } diff --git a/crates/iota-node/src/main.rs b/crates/iota-node/src/main.rs index 09b001d78bb..eb63a09ba27 100644 --- a/crates/iota-node/src/main.rs +++ b/crates/iota-node/src/main.rs @@ -8,7 +8,7 @@ use clap::{ArgGroup, Parser}; use iota_common::sync::async_once_cell::AsyncOnceCell; use iota_config::{Config, NodeConfig, node::RunWithRange}; use iota_core::runtime::IotaRuntimes; -use iota_node::IotaNode; +use iota_node::{IotaNode, metrics}; use iota_types::{ committee::EpochId, messages_checkpoint::CheckpointSequenceNumber, multiaddr::Multiaddr, supported_protocol_versions::SupportedProtocolVersions, @@ -20,21 +20,23 @@ use tracing::{error, info}; bin_version::bin_version!(); #[derive(Parser)] -#[clap(rename_all = "kebab-case")] -#[clap(name = env!("CARGO_BIN_NAME"))] -#[clap(version = VERSION)] -#[clap(group(ArgGroup::new("exclusive").required(false)))] +#[command( + rename_all = "kebab-case", + version = VERSION, + group(ArgGroup::new("exclusive").required(false)), + name = env!("CARGO_BIN_NAME")) +] struct Args { - #[clap(long)] + #[arg(long)] pub config_path: PathBuf, - #[clap(long, help = "Specify address to listen on")] + #[arg(long, help = "Specify address to listen on")] listen_address: Option, - #[clap(long, group = "exclusive")] + #[arg(long, group = "exclusive")] run_with_range_epoch: Option, - #[clap(long, group = "exclusive")] + #[arg(long, group = "exclusive")] run_with_range_checkpoint: Option, } @@ -81,7 +83,7 @@ fn main() { drop(metrics_rt); - info!("Iota Node version: {VERSION}"); + info!("IOTA Node version: {VERSION}"); info!( "Supported protocol versions: {:?}", config.supported_protocol_versions @@ -92,6 +94,11 @@ fn main() { config.metrics_address ); + { + let _enter = runtimes.metrics.enter(); + metrics::start_metrics_push_task(&config, registry_service.clone()); + } + if let Some(listen_address) = args.listen_address { config.network_address = listen_address; } @@ -144,7 +151,7 @@ fn main() { None => "unknown".to_string(), }; - info!("Iota chain identifier: {chain_identifier}"); + info!("IOTA chain identifier: {chain_identifier}"); prometheus_registry .register(iota_metrics::uptime_metric( if is_validator { diff --git a/crates/iota-node/src/metrics.rs b/crates/iota-node/src/metrics.rs index 2d83d7bb4e6..a6670b91a58 100644 --- a/crates/iota-node/src/metrics.rs +++ b/crates/iota-node/src/metrics.rs @@ -2,14 +2,164 @@ // Modifications Copyright (c) 2024 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -use std::time::Duration; +use std::time::{Duration, SystemTime, UNIX_EPOCH}; +use axum::http::header; +use iota_metrics::RegistryService; use iota_network::tonic::Code; use iota_network_stack::metrics::MetricsCallbackProvider; use prometheus::{ - HistogramVec, IntCounterVec, IntGaugeVec, Registry, register_histogram_vec_with_registry, - register_int_counter_vec_with_registry, register_int_gauge_vec_with_registry, + Encoder, HistogramVec, IntCounterVec, IntGaugeVec, PROTOBUF_FORMAT, Registry, + register_histogram_vec_with_registry, register_int_counter_vec_with_registry, + register_int_gauge_vec_with_registry, }; +use tracing::error; + +const METRICS_PUSH_TIMEOUT: Duration = Duration::from_secs(45); + +pub struct MetricsPushClient { + certificate: std::sync::Arc, + client: reqwest::Client, +} + +impl MetricsPushClient { + pub fn new(network_key: iota_types::crypto::NetworkKeyPair) -> Self { + use fastcrypto::traits::KeyPair; + let certificate = std::sync::Arc::new(iota_tls::SelfSignedCertificate::new( + network_key.private(), + iota_tls::IOTA_VALIDATOR_SERVER_NAME, + )); + let identity = certificate.reqwest_identity(); + let client = reqwest::Client::builder() + .identity(identity) + .build() + .unwrap(); + + Self { + certificate, + client, + } + } + + pub fn certificate(&self) -> &iota_tls::SelfSignedCertificate { + &self.certificate + } + + pub fn client(&self) -> &reqwest::Client { + &self.client + } +} + +/// Starts a task to periodically push metrics to a configured endpoint if a +/// metrics push endpoint is configured. +pub fn start_metrics_push_task(config: &iota_config::NodeConfig, registry: RegistryService) { + use fastcrypto::traits::KeyPair; + use iota_config::node::MetricsConfig; + + const DEFAULT_METRICS_PUSH_INTERVAL: Duration = Duration::from_secs(60); + + let (interval, url) = match &config.metrics { + Some(MetricsConfig { + push_interval_seconds, + push_url: Some(url), + }) => { + let interval = push_interval_seconds + .map(Duration::from_secs) + .unwrap_or(DEFAULT_METRICS_PUSH_INTERVAL); + let url = reqwest::Url::parse(url).expect("unable to parse metrics push url"); + (interval, url) + } + _ => return, + }; + + // make a copy so we can make a new client later when we hit errors posting + // metrics + let config_copy = config.clone(); + let mut client = MetricsPushClient::new(config_copy.network_key_pair().copy()); + + async fn push_metrics( + client: &MetricsPushClient, + url: &reqwest::Url, + registry: &RegistryService, + ) -> Result<(), anyhow::Error> { + // now represents a collection timestamp for all of the metrics we send to the + // proxy + let now = SystemTime::now() + .duration_since(UNIX_EPOCH) + .unwrap() + .as_millis() as i64; + + let mut metric_families = registry.gather_all(); + for mf in metric_families.iter_mut() { + for m in mf.mut_metric() { + m.set_timestamp_ms(now); + } + } + + let mut buf: Vec = vec![]; + let encoder = prometheus::ProtobufEncoder::new(); + encoder.encode(&metric_families, &mut buf)?; + + let mut s = snap::raw::Encoder::new(); + let compressed = s.compress_vec(&buf).map_err(|err| { + error!("unable to snappy encode; {err}"); + err + })?; + + let response = client + .client() + .post(url.to_owned()) + .header(reqwest::header::CONTENT_ENCODING, "snappy") + .header(header::CONTENT_TYPE, PROTOBUF_FORMAT) + .body(compressed) + .timeout(METRICS_PUSH_TIMEOUT) + .send() + .await?; + + if !response.status().is_success() { + let status = response.status(); + let body = match response.text().await { + Ok(body) => body, + Err(error) => format!("couldn't decode response body; {error}"), + }; + return Err(anyhow::anyhow!( + "metrics push failed: [{}]:{}", + status, + body + )); + } + + tracing::debug!("successfully pushed metrics to {url}"); + + Ok(()) + } + + tokio::spawn(async move { + tracing::info!(push_url =% url, interval =? interval, "Started Metrics Push Service"); + + let mut interval = tokio::time::interval(interval); + interval.set_missed_tick_behavior(tokio::time::MissedTickBehavior::Skip); + + let mut errors = 0; + loop { + interval.tick().await; + + if let Err(error) = push_metrics(&client, &url, ®istry).await { + errors += 1; + if errors >= 10 { + // If we hit 10 failures in a row, start logging errors. + tracing::error!("unable to push metrics: {error}; new client will be created"); + } else { + tracing::warn!("unable to push metrics: {error}; new client will be created"); + } + // aggressively recreate our client connection if we hit an error + client = MetricsPushClient::new(config_copy.network_key_pair().copy()); + } else { + errors = 0; + } + } + }); +} pub struct IotaNodeMetrics { pub jwk_requests: IntCounterVec, diff --git a/crates/iota-open-rpc-macros/src/lib.rs b/crates/iota-open-rpc-macros/src/lib.rs index cddbf557130..78e15b0eadc 100644 --- a/crates/iota-open-rpc-macros/src/lib.rs +++ b/crates/iota-open-rpc-macros/src/lib.rs @@ -261,7 +261,7 @@ fn parse_rpc_method(trait_data: &mut syn::ItemTrait) -> Result TokenStream2 { let attrs = attributes .attrs diff --git a/crates/iota-open-rpc/spec/openrpc.json b/crates/iota-open-rpc/spec/openrpc.json index 95f08307724..a4fd912ea8f 100644 --- a/crates/iota-open-rpc/spec/openrpc.json +++ b/crates/iota-open-rpc/spec/openrpc.json @@ -1,8 +1,8 @@ { "openrpc": "1.2.6", "info": { - "title": "Iota JSON-RPC", - "description": "Iota JSON-RPC API for interaction with Iota Full node. Make RPC calls using https://fullnode.NETWORK.iota.io:443, where NETWORK is the network you want to use (testnet, devnet, mainnet). By default, local networks use port 9000.", + "title": "IOTA JSON-RPC", + "description": "IOTA JSON-RPC API for interaction with IOTA full node or indexer. Make RPC calls using https://api.NETWORK.iota.cafe:443 (or https://indexer.NETWORK.iota.cafe:443 for the indexer), where NETWORK is the network you want to use (testnet, devnet, mainnet). By default, local networks use port 9000 (or 9124 for the indexer).", "contact": { "name": "IOTA Foundation", "url": "https://iota.org", @@ -12,7 +12,7 @@ "name": "Apache-2.0", "url": "https://raw.githubusercontent.com/iotaledger/iota/main/LICENSE" }, - "version": "0.8.0-alpha" + "version": "0.9.0-alpha" }, "methods": [ { @@ -1300,7 +1300,7 @@ "name": "Result", "value": { "minSupportedProtocolVersion": "1", - "maxSupportedProtocolVersion": "2", + "maxSupportedProtocolVersion": "3", "protocolVersion": "1", "featureFlags": { "accept_zklogin_in_multisig": false, @@ -1313,6 +1313,7 @@ "hardened_otw_check": true, "no_extraneous_module_bytes": true, "passkey_auth": true, + "relocate_event_module": false, "rethrow_serialization_type_layout_errors": true, "zklogin_auth": false }, @@ -3163,7 +3164,7 @@ "params": [ { "name": "owner", - "description": "the owner's Iota address", + "description": "the owner's IOTA address", "required": true, "schema": { "$ref": "#/components/schemas/IotaAddress" @@ -3213,7 +3214,7 @@ "params": [ { "name": "owner", - "description": "the owner's Iota address", + "description": "the owner's IOTA address", "required": true, "schema": { "$ref": "#/components/schemas/IotaAddress" @@ -3303,6 +3304,7 @@ "name": "Extended API" } ], + "description": "Address related metrics. Exclusively served by the indexer.", "params": [ { "name": "descending_order", @@ -3333,7 +3335,7 @@ "params": [ { "name": "owner", - "description": "the owner's Iota address", + "description": "the owner's IOTA address", "required": true, "schema": { "$ref": "#/components/schemas/IotaAddress" @@ -3385,6 +3387,7 @@ "name": "Extended API" } ], + "description": "Address related metrics. Exclusively served by the indexer.", "params": [ { "name": "checkpoint", @@ -3462,7 +3465,7 @@ "params": [ { "name": "owner", - "description": "the owner's Iota address", + "description": "the owner's IOTA address", "required": true, "schema": { "$ref": "#/components/schemas/IotaAddress" @@ -3623,7 +3626,7 @@ "name": "Extended API" } ], - "description": "Return current epoch info", + "description": "Return current epoch info. Exclusively served by the indexer.", "params": [], "result": { "name": "EpochInfo", @@ -3819,7 +3822,7 @@ "name": "Extended API" } ], - "description": "Return a list of epoch metrics, which is a subset of epoch info", + "description": "Return a list of epoch metrics, which is a subset of epoch info. Exclusively served by the indexer.", "params": [ { "name": "cursor", @@ -3860,7 +3863,7 @@ "name": "Extended API" } ], - "description": "Return a list of epoch info", + "description": "Return a list of epoch info. Exclusively served by the indexer.", "params": [ { "name": "cursor", @@ -3901,7 +3904,7 @@ "name": "Extended API" } ], - "description": "Address related metrics", + "description": "Address related metrics. Exclusively served by the indexer.", "params": [], "result": { "name": "AddressMetrics", @@ -3945,7 +3948,7 @@ "name": "Extended API" } ], - "description": "Return move call metrics", + "description": "Return move call metrics. Exclusively served by the indexer.", "params": [], "result": { "name": "MoveCallMetrics", @@ -3962,7 +3965,7 @@ "name": "Extended API" } ], - "description": "Return Network metrics", + "description": "Return Network metrics. Exclusively served by the indexer.", "params": [], "result": { "name": "NetworkMetrics", @@ -3983,7 +3986,7 @@ "params": [ { "name": "address", - "description": "the owner's Iota address", + "description": "the owner's IOTA address", "required": true, "schema": { "$ref": "#/components/schemas/IotaAddress" @@ -4398,6 +4401,7 @@ "name": "Extended API" } ], + "description": "Return the total number of transactions. Exclusively served by the indexer.", "params": [], "result": { "name": "BigInt", @@ -4701,7 +4705,7 @@ "name": "PubSub" } ], - "description": "Subscribe to a stream of Iota event", + "description": "Subscribe to a stream of IOTA event", "params": [ { "name": "filter", @@ -4733,7 +4737,7 @@ "name": "PubSub" } ], - "description": "Subscribe to a stream of Iota transaction effects", + "description": "Subscribe to a stream of IOTA transaction effects", "params": [ { "name": "filter", @@ -4762,7 +4766,7 @@ "params": [ { "name": "signer", - "description": "the transaction signer's Iota address", + "description": "the transaction signer's IOTA address", "required": true, "schema": { "$ref": "#/components/schemas/IotaAddress" @@ -4821,7 +4825,7 @@ "params": [ { "name": "signer", - "description": "the transaction signer's Iota address", + "description": "the transaction signer's IOTA address", "required": true, "schema": { "$ref": "#/components/schemas/IotaAddress" @@ -4878,7 +4882,7 @@ "params": [ { "name": "signer", - "description": "the transaction signer's Iota address", + "description": "the transaction signer's IOTA address", "required": true, "schema": { "$ref": "#/components/schemas/IotaAddress" @@ -4972,7 +4976,7 @@ "params": [ { "name": "signer", - "description": "the transaction signer's Iota address", + "description": "the transaction signer's IOTA address", "required": true, "schema": { "$ref": "#/components/schemas/IotaAddress" @@ -4980,7 +4984,7 @@ }, { "name": "input_coins", - "description": "the Iota coins to be used in this transaction", + "description": "the IOTA coins to be used in this transaction", "required": true, "schema": { "type": "array", @@ -5046,7 +5050,7 @@ "params": [ { "name": "signer", - "description": "the transaction signer's Iota address", + "description": "the transaction signer's IOTA address", "required": true, "schema": { "$ref": "#/components/schemas/IotaAddress" @@ -5054,7 +5058,7 @@ }, { "name": "input_coins", - "description": "the Iota coins to be used in this transaction, including the coin for gas payment.", + "description": "the IOTA coins to be used in this transaction, including the coin for gas payment.", "required": true, "schema": { "type": "array", @@ -5099,7 +5103,7 @@ "params": [ { "name": "signer", - "description": "the transaction signer's Iota address", + "description": "the transaction signer's IOTA address", "required": true, "schema": { "$ref": "#/components/schemas/IotaAddress" @@ -5107,7 +5111,7 @@ }, { "name": "input_coins", - "description": "the Iota coins to be used in this transaction, including the coin for gas payment.", + "description": "the IOTA coins to be used in this transaction, including the coin for gas payment.", "required": true, "schema": { "type": "array", @@ -5166,7 +5170,7 @@ "params": [ { "name": "sender", - "description": "the transaction signer's Iota address", + "description": "the transaction signer's IOTA address", "required": true, "schema": { "$ref": "#/components/schemas/IotaAddress" @@ -5229,7 +5233,7 @@ "params": [ { "name": "signer", - "description": "the transaction signer's Iota address", + "description": "the transaction signer's IOTA address", "required": true, "schema": { "$ref": "#/components/schemas/IotaAddress" @@ -5255,7 +5259,7 @@ }, { "name": "validator", - "description": "the validator's Iota address", + "description": "the validator's IOTA address", "required": true, "schema": { "$ref": "#/components/schemas/IotaAddress" @@ -5296,7 +5300,7 @@ "params": [ { "name": "signer", - "description": "the transaction signer's Iota address", + "description": "the transaction signer's IOTA address", "required": true, "schema": { "$ref": "#/components/schemas/IotaAddress" @@ -5312,7 +5316,7 @@ }, { "name": "validator", - "description": "the validator's Iota address", + "description": "the validator's IOTA address", "required": true, "schema": { "$ref": "#/components/schemas/IotaAddress" @@ -5354,7 +5358,7 @@ "params": [ { "name": "signer", - "description": "the transaction signer's Iota address", + "description": "the transaction signer's IOTA address", "required": true, "schema": { "$ref": "#/components/schemas/IotaAddress" @@ -5403,7 +5407,7 @@ "params": [ { "name": "signer", - "description": "the transaction signer's Iota address", + "description": "the transaction signer's IOTA address", "required": true, "schema": { "$ref": "#/components/schemas/IotaAddress" @@ -5453,7 +5457,7 @@ "params": [ { "name": "signer", - "description": "the transaction signer's Iota address", + "description": "the transaction signer's IOTA address", "required": true, "schema": { "$ref": "#/components/schemas/IotaAddress" @@ -5513,7 +5517,7 @@ "params": [ { "name": "signer", - "description": "the transaction signer's Iota address", + "description": "the transaction signer's IOTA address", "required": true, "schema": { "$ref": "#/components/schemas/IotaAddress" @@ -5566,11 +5570,11 @@ "name": "Transaction Builder API" } ], - "description": "Create an unsigned transaction to send IOTA coin object to a Iota address. The IOTA object is also used as the gas object.", + "description": "Create an unsigned transaction to send IOTA coin object to an IOTA address. The IOTA object is also used as the gas object.", "params": [ { "name": "signer", - "description": "the transaction signer's Iota address", + "description": "the transaction signer's IOTA address", "required": true, "schema": { "$ref": "#/components/schemas/IotaAddress" @@ -5578,7 +5582,7 @@ }, { "name": "iota_object_id", - "description": "the Iota coin object to be used in this transaction", + "description": "the IOTA coin object to be used in this transaction", "required": true, "schema": { "$ref": "#/components/schemas/ObjectID" @@ -5594,7 +5598,7 @@ }, { "name": "recipient", - "description": "the recipient's Iota address", + "description": "the recipient's IOTA address", "required": true, "schema": { "$ref": "#/components/schemas/IotaAddress" @@ -5627,7 +5631,7 @@ "params": [ { "name": "signer", - "description": "the transaction signer's Iota address", + "description": "the transaction signer's IOTA address", "required": true, "schema": { "$ref": "#/components/schemas/IotaAddress" @@ -5658,7 +5662,7 @@ }, { "name": "recipient", - "description": "the recipient's Iota address", + "description": "the recipient's IOTA address", "required": true, "schema": { "$ref": "#/components/schemas/IotaAddress" @@ -5727,7 +5731,7 @@ } }, "AuthorityPublicKeyBytes": { - "description": "Defines the compressed version of the public key that we pass around in Iota", + "description": "Defines the compressed version of the public key that we pass around in IOTA.", "allOf": [ { "$ref": "#/components/schemas/Base64" @@ -6772,7 +6776,7 @@ "description": "Parsed json value of the event" }, "sender": { - "description": "Sender's Iota address.", + "description": "Sender's IOTA address.", "allOf": [ { "$ref": "#/components/schemas/IotaAddress" @@ -7050,7 +7054,7 @@ ] }, "EventID": { - "description": "Unique ID of a Iota Event, the ID is a combination of tx seq number and event seq number, the ID is local to this particular fullnode and will be different from other fullnode.", + "description": "Unique ID of an IOTA Event, the ID is a combination of tx seq number and event seq number, the ID is local to this particular fullnode and will be different from other fullnode.", "type": "object", "required": [ "eventSeq", @@ -8792,7 +8796,7 @@ "IotaTransactionBlockBuilderMode": { "oneOf": [ { - "description": "Regular Iota Transactions that are committed on chain", + "description": "Regular IOTA Transactions that are committed on chain", "type": "string", "enum": [ "Commit" diff --git a/crates/iota-open-rpc/src/generate_json_rpc_spec.rs b/crates/iota-open-rpc/src/generate_json_rpc_spec.rs index 6f15290df3c..c7c7e3b5305 100644 --- a/crates/iota-open-rpc/src/generate_json_rpc_spec.rs +++ b/crates/iota-open-rpc/src/generate_json_rpc_spec.rs @@ -28,12 +28,12 @@ enum Action { } #[derive(Debug, Parser)] -#[clap( - name = "Iota format generator", - about = "Trace serde (de)serialization to generate format descriptions for Iota types" +#[command( + name = "IOTA format generator", + about = "Trace serde (de)serialization to generate format descriptions for IOTA types" )] struct Options { - #[clap(value_enum, default_value = "Record", ignore_case = true)] + #[arg(value_enum, default_value = "Record", ignore_case = true)] action: Action, } diff --git a/crates/iota-open-rpc/src/lib.rs b/crates/iota-open-rpc/src/lib.rs index 829f2c0d19c..e3ced320aa9 100644 --- a/crates/iota-open-rpc/src/lib.rs +++ b/crates/iota-open-rpc/src/lib.rs @@ -17,7 +17,7 @@ use versions::Versioning; /// OPEN-RPC documentation following the OpenRPC specification /// The implementation is partial, only required fields and subset of optional -/// fields in the specification are implemented catered to Iota's need. +/// fields in the specification are implemented catered to IOTA's need. #[derive(Serialize, Deserialize, Clone)] pub struct Project { openrpc: String, diff --git a/crates/iota-package-dump/src/client.rs b/crates/iota-package-dump/src/client.rs index ee96573c704..fdd1afc50e1 100644 --- a/crates/iota-package-dump/src/client.rs +++ b/crates/iota-package-dump/src/client.rs @@ -13,7 +13,8 @@ pub(crate) struct Client { } impl Client { - /// Create a new GraphQL client, talking to a Iota GraphQL service at `url`. + /// Create a new GraphQL client, talking to an IOTA GraphQL service at + /// `url`. pub(crate) fn new(url: impl IntoUrl) -> Result { Ok(Self { inner: reqwest::Client::builder() diff --git a/crates/iota-package-resolver/src/lib.rs b/crates/iota-package-resolver/src/lib.rs index 05ed900b686..e0f7da786c9 100644 --- a/crates/iota-package-resolver/src/lib.rs +++ b/crates/iota-package-resolver/src/lib.rs @@ -2767,9 +2767,9 @@ mod tests { ); } - /// *** Test Helpers - /// ************************************************************************ - /// ** + // *** Test Helpers + // ************************************************************************ + // ** type TypeOriginTable = Vec; diff --git a/crates/iota-protocol-config-macros/src/lib.rs b/crates/iota-protocol-config-macros/src/lib.rs index a479c8df658..04dcbae99dc 100644 --- a/crates/iota-protocol-config-macros/src/lib.rs +++ b/crates/iota-protocol-config-macros/src/lib.rs @@ -63,7 +63,7 @@ pub fn accessors_macro(input: TokenStream) -> TokenStream { .path .segments .last() - .map_or(false, |segment| segment.ident == "Option") => + .is_some_and(|segment| segment.ident == "Option") => { // Extract inner type T from Option let inner_type = if let syn::PathArguments::AngleBracketed( @@ -247,7 +247,7 @@ pub fn feature_flag_getters_macro(input: TokenStream) -> TokenStream { .path .segments .last() - .map_or(false, |segment| segment.ident == "bool") => + .is_some_and(|segment| segment.ident == "bool") => { Some(( quote! { diff --git a/crates/iota-protocol-config/src/lib.rs b/crates/iota-protocol-config/src/lib.rs index 77c62e282f3..b87e01cc899 100644 --- a/crates/iota-protocol-config/src/lib.rs +++ b/crates/iota-protocol-config/src/lib.rs @@ -16,13 +16,17 @@ use tracing::{info, warn}; /// The minimum and maximum protocol versions supported by this build. const MIN_PROTOCOL_VERSION: u64 = 1; -pub const MAX_PROTOCOL_VERSION: u64 = 2; +pub const MAX_PROTOCOL_VERSION: u64 = 3; // Record history of protocol version allocations here: // // Version 1: Original version. // Version 2: Don't redistribute slashed staking rewards, fix computation of // SystemEpochInfoEventV1. +// Version 3: Set the `relocate_event_module` to be true so that the module that +// is associated as the "sending module" for an event is relocated by linkage. +// Add `Clock` based unlock to `Timelock` objects. + #[derive(Copy, Clone, Debug, Hash, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)] pub struct ProtocolVersion(u64); @@ -39,10 +43,10 @@ impl ProtocolVersion { #[cfg(not(msim))] const MAX_ALLOWED: Self = Self::MAX; - // We create 3 additional "fake" versions in simulator builds so that we can + // We create 2 additional "fake" versions in simulator builds so that we can // test upgrades. #[cfg(msim)] - pub const MAX_ALLOWED: Self = Self(MAX_PROTOCOL_VERSION + 3); + pub const MAX_ALLOWED: Self = Self(MAX_PROTOCOL_VERSION + 2); pub fn new(v: u64) -> Self { Self(v) @@ -182,6 +186,10 @@ struct FeatureFlags { // This flag is used to provide the correct MoveVM configuration for clients. #[serde(skip_serializing_if = "is_true")] rethrow_serialization_type_layout_errors: bool, + + // Makes the event's sending module version-aware. + #[serde(skip_serializing_if = "is_false")] + relocate_event_module: bool, } fn is_true(b: &bool) -> bool { @@ -291,6 +299,8 @@ pub struct ProtocolConfig { feature_flags: FeatureFlags, // ==== Transaction input limits ==== + + // /// Maximum serialized size of a transaction (in bytes). max_tx_size_bytes: Option, @@ -299,12 +309,12 @@ pub struct ProtocolConfig { max_input_objects: Option, /// Max size of objects a transaction can write to disk after completion. - /// Enforce by the Iota adapter. This is the sum of the serialized size + /// Enforce by the IOTA adapter. This is the sum of the serialized size /// of all objects written to disk. The max size of individual objects /// on the other hand is `max_move_object_size`. max_size_written_objects: Option, /// Max size of objects a system transaction can write to disk after - /// completion. Enforce by the Iota adapter. Similar to + /// completion. Enforce by the IOTA adapter. Similar to /// `max_size_written_objects` but for system transactions. max_size_written_objects_system_tx: Option, @@ -340,6 +350,8 @@ pub struct ProtocolConfig { max_programmable_tx_commands: Option, // ==== Move VM, Move bytecode verifier, and execution limits === + + // /// Maximum Move bytecode version the VM understands. All older versions are /// accepted. move_binary_format_version: Option, @@ -366,12 +378,12 @@ pub struct ProtocolConfig { binary_variant_instantiation_handles: Option, /// Maximum size of the `contents` part of an object, in bytes. Enforced by - /// the Iota adapter when effects are produced. + /// the IOTA adapter when effects are produced. max_move_object_size: Option, // TODO: Option 500 KB exceeds the max // computation gas cost - /// Maximum size of a Move package object, in bytes. Enforced by the Iota + /// Maximum size of a Move package object, in bytes. Enforced by the IOTA /// adapter at the end of a publish transaction. max_move_package_size: Option, @@ -507,6 +519,8 @@ pub struct ProtocolConfig { // === Object runtime internal operation limits ==== // These affect dynamic fields + + // /// Maximum number of cached objects in the object runtime ObjectStore. /// Enforced by object runtime during execution object_runtime_max_num_cached_objects: Option, @@ -524,7 +538,9 @@ pub struct ProtocolConfig { object_runtime_max_num_store_entries_system_tx: Option, // === Execution gas costs ==== - /// Base cost for any Iota transaction + + // + /// Base cost for any IOTA transaction base_tx_cost_fixed: Option, /// Additional cost for a transaction that publishes a package @@ -560,23 +576,25 @@ pub struct ProtocolConfig { // entire object, just consulting an ID -> tx digest map obj_access_cost_verify_per_byte: Option, - /// === Gas version. gas model === + // === Gas version. gas model === + // /// Gas model version, what code we are using to charge gas gas_model_version: Option, - /// === Storage gas costs === + // === Storage gas costs === - /// Per-byte cost of storing an object in the Iota global object store. Some + // + /// Per-byte cost of storing an object in the IOTA global object store. Some /// of this cost may be refundable if the object is later freed obj_data_cost_refundable: Option, - // Per-byte cost of storing an object in the Iota transaction log (e.g., in + // Per-byte cost of storing an object in the IOTA transaction log (e.g., in // CertifiedTransactionEffects) This depends on the size of various fields including the // effects TODO: Option, - /// === Tokenomics === + // === Tokenomics === // TODO: Option, - /// === Core Protocol === + // === Core Protocol === + // /// Max number of transactions per checkpoint. /// Note that this is a protocol constant and not a config as validators /// must have this set to the same value, otherwise they *will* fork. @@ -864,7 +883,7 @@ pub struct ProtocolConfig { debug_print_base_cost: Option, debug_print_stack_trace_base_cost: Option, - /// === Execution Version === + // === Execution Version === execution_version: Option, // Dictates the threshold (percentage of stake) that is used to calculate the "bad" nodes to be @@ -878,8 +897,7 @@ pub struct ProtocolConfig { // will cause the new epoch to start with JWKs from the previous epoch still valid. max_age_of_jwk_in_epochs: Option, - /// === random beacon === - + // === random beacon === /// Maximum allowed precision loss when reducing voting weights for the /// random beacon protocol. random_beacon_reduction_allowed_delta: Option, @@ -1053,6 +1071,10 @@ impl ProtocolConfig { pub fn rethrow_serialization_type_layout_errors(&self) -> bool { self.feature_flags.rethrow_serialization_type_layout_errors } + + pub fn relocate_event_module(&self) -> bool { + self.feature_flags.relocate_event_module + } } #[cfg(not(msim))] @@ -1639,6 +1661,10 @@ impl ProtocolConfig { 1 => unreachable!(), // version 2 is a new framework version but with no config changes 2 => {} + // version 3 + 3 => { + cfg.feature_flags.relocate_event_module = true; + } // Use this template when making changes: // // // modify an existing constant. diff --git a/crates/iota-protocol-config/src/snapshots/iota_protocol_config__test__Mainnet_version_3.snap b/crates/iota-protocol-config/src/snapshots/iota_protocol_config__test__Mainnet_version_3.snap new file mode 100644 index 00000000000..c5550f5ac7e --- /dev/null +++ b/crates/iota-protocol-config/src/snapshots/iota_protocol_config__test__Mainnet_version_3.snap @@ -0,0 +1,271 @@ +--- +source: crates/iota-protocol-config/src/lib.rs +expression: "ProtocolConfig::get_for_version(cur, *chain_id)" +snapshot_kind: text +--- +version: 3 +feature_flags: + consensus_transaction_ordering: ByGasPrice + per_object_congestion_control_mode: TotalTxCount + zklogin_max_epoch_upper_bound_delta: 30 + relocate_event_module: true +max_tx_size_bytes: 131072 +max_input_objects: 2048 +max_size_written_objects: 5000000 +max_size_written_objects_system_tx: 50000000 +max_serialized_tx_effects_size_bytes: 524288 +max_serialized_tx_effects_size_bytes_system_tx: 8388608 +max_gas_payment_objects: 256 +max_modules_in_publish: 64 +max_package_dependencies: 32 +max_arguments: 512 +max_type_arguments: 16 +max_type_argument_depth: 16 +max_pure_argument_size: 16384 +max_programmable_tx_commands: 1024 +move_binary_format_version: 7 +min_move_binary_format_version: 6 +binary_module_handles: 100 +binary_struct_handles: 300 +binary_function_handles: 1500 +binary_function_instantiations: 750 +binary_signatures: 1000 +binary_constant_pool: 4000 +binary_identifiers: 10000 +binary_address_identifiers: 100 +binary_struct_defs: 200 +binary_struct_def_instantiations: 100 +binary_function_defs: 1000 +binary_field_handles: 500 +binary_field_instantiations: 250 +binary_friend_decls: 100 +max_move_object_size: 256000 +max_move_package_size: 102400 +max_publish_or_upgrade_per_ptb: 5 +max_tx_gas: 50000000000 +max_gas_price: 100000 +max_gas_computation_bucket: 5000000 +gas_rounding_step: 1000 +max_loop_depth: 5 +max_generic_instantiation_length: 32 +max_function_parameters: 128 +max_basic_blocks: 1024 +max_value_stack_size: 1024 +max_type_nodes: 256 +max_push_size: 10000 +max_struct_definitions: 200 +max_function_definitions: 1000 +max_fields_in_struct: 32 +max_dependency_depth: 100 +max_num_event_emit: 1024 +max_num_new_move_object_ids: 2048 +max_num_new_move_object_ids_system_tx: 32768 +max_num_deleted_move_object_ids: 2048 +max_num_deleted_move_object_ids_system_tx: 32768 +max_num_transferred_move_object_ids: 2048 +max_num_transferred_move_object_ids_system_tx: 32768 +max_event_emit_size: 256000 +max_event_emit_size_total: 65536000 +max_move_vector_len: 262144 +max_move_identifier_len: 128 +max_move_value_depth: 128 +max_back_edges_per_function: 10000 +max_back_edges_per_module: 10000 +max_verifier_meter_ticks_per_function: 16000000 +max_meter_ticks_per_module: 16000000 +max_meter_ticks_per_package: 16000000 +object_runtime_max_num_cached_objects: 1000 +object_runtime_max_num_cached_objects_system_tx: 16000 +object_runtime_max_num_store_entries: 1000 +object_runtime_max_num_store_entries_system_tx: 16000 +base_tx_cost_fixed: 1000 +package_publish_cost_fixed: 1000 +base_tx_cost_per_byte: 0 +package_publish_cost_per_byte: 80 +obj_access_cost_read_per_byte: 15 +obj_access_cost_mutate_per_byte: 40 +obj_access_cost_delete_per_byte: 40 +obj_access_cost_verify_per_byte: 200 +gas_model_version: 1 +obj_data_cost_refundable: 100 +obj_metadata_cost_non_refundable: 50 +storage_rebate_rate: 10000 +reward_slashing_rate: 10000 +storage_gas_price: 76 +validator_target_reward: 767000000000000 +max_transactions_per_checkpoint: 10000 +max_checkpoint_size_bytes: 31457280 +buffer_stake_for_protocol_upgrade_bps: 5000 +address_from_bytes_cost_base: 52 +address_to_u256_cost_base: 52 +address_from_u256_cost_base: 52 +config_read_setting_impl_cost_base: 100 +config_read_setting_impl_cost_per_byte: 40 +dynamic_field_hash_type_and_key_cost_base: 100 +dynamic_field_hash_type_and_key_type_cost_per_byte: 2 +dynamic_field_hash_type_and_key_value_cost_per_byte: 2 +dynamic_field_hash_type_and_key_type_tag_cost_per_byte: 2 +dynamic_field_add_child_object_cost_base: 100 +dynamic_field_add_child_object_type_cost_per_byte: 10 +dynamic_field_add_child_object_value_cost_per_byte: 10 +dynamic_field_add_child_object_struct_tag_cost_per_byte: 10 +dynamic_field_borrow_child_object_cost_base: 100 +dynamic_field_borrow_child_object_child_ref_cost_per_byte: 10 +dynamic_field_borrow_child_object_type_cost_per_byte: 10 +dynamic_field_remove_child_object_cost_base: 100 +dynamic_field_remove_child_object_child_cost_per_byte: 2 +dynamic_field_remove_child_object_type_cost_per_byte: 2 +dynamic_field_has_child_object_cost_base: 100 +dynamic_field_has_child_object_with_ty_cost_base: 100 +dynamic_field_has_child_object_with_ty_type_cost_per_byte: 2 +dynamic_field_has_child_object_with_ty_type_tag_cost_per_byte: 2 +event_emit_cost_base: 52 +event_emit_value_size_derivation_cost_per_byte: 2 +event_emit_tag_size_derivation_cost_per_byte: 5 +event_emit_output_cost_per_byte: 10 +object_borrow_uid_cost_base: 52 +object_delete_impl_cost_base: 52 +object_record_new_uid_cost_base: 52 +transfer_transfer_internal_cost_base: 52 +transfer_freeze_object_cost_base: 52 +transfer_share_object_cost_base: 52 +transfer_receive_object_cost_base: 52 +tx_context_derive_id_cost_base: 52 +types_is_one_time_witness_cost_base: 52 +types_is_one_time_witness_type_tag_cost_per_byte: 2 +types_is_one_time_witness_type_cost_per_byte: 2 +validator_validate_metadata_cost_base: 52 +validator_validate_metadata_data_cost_per_byte: 2 +crypto_invalid_arguments_cost: 100 +bls12381_bls12381_min_sig_verify_cost_base: 52 +bls12381_bls12381_min_sig_verify_msg_cost_per_byte: 2 +bls12381_bls12381_min_sig_verify_msg_cost_per_block: 2 +bls12381_bls12381_min_pk_verify_cost_base: 52 +bls12381_bls12381_min_pk_verify_msg_cost_per_byte: 2 +bls12381_bls12381_min_pk_verify_msg_cost_per_block: 2 +ecdsa_k1_ecrecover_keccak256_cost_base: 52 +ecdsa_k1_ecrecover_keccak256_msg_cost_per_byte: 2 +ecdsa_k1_ecrecover_keccak256_msg_cost_per_block: 2 +ecdsa_k1_ecrecover_sha256_cost_base: 52 +ecdsa_k1_ecrecover_sha256_msg_cost_per_byte: 2 +ecdsa_k1_ecrecover_sha256_msg_cost_per_block: 2 +ecdsa_k1_decompress_pubkey_cost_base: 52 +ecdsa_k1_secp256k1_verify_keccak256_cost_base: 52 +ecdsa_k1_secp256k1_verify_keccak256_msg_cost_per_byte: 2 +ecdsa_k1_secp256k1_verify_keccak256_msg_cost_per_block: 2 +ecdsa_k1_secp256k1_verify_sha256_cost_base: 52 +ecdsa_k1_secp256k1_verify_sha256_msg_cost_per_byte: 2 +ecdsa_k1_secp256k1_verify_sha256_msg_cost_per_block: 2 +ecdsa_r1_ecrecover_keccak256_cost_base: 52 +ecdsa_r1_ecrecover_keccak256_msg_cost_per_byte: 2 +ecdsa_r1_ecrecover_keccak256_msg_cost_per_block: 2 +ecdsa_r1_ecrecover_sha256_cost_base: 52 +ecdsa_r1_ecrecover_sha256_msg_cost_per_byte: 2 +ecdsa_r1_ecrecover_sha256_msg_cost_per_block: 2 +ecdsa_r1_secp256r1_verify_keccak256_cost_base: 52 +ecdsa_r1_secp256r1_verify_keccak256_msg_cost_per_byte: 2 +ecdsa_r1_secp256r1_verify_keccak256_msg_cost_per_block: 2 +ecdsa_r1_secp256r1_verify_sha256_cost_base: 52 +ecdsa_r1_secp256r1_verify_sha256_msg_cost_per_byte: 2 +ecdsa_r1_secp256r1_verify_sha256_msg_cost_per_block: 2 +ecvrf_ecvrf_verify_cost_base: 52 +ecvrf_ecvrf_verify_alpha_string_cost_per_byte: 2 +ecvrf_ecvrf_verify_alpha_string_cost_per_block: 2 +ed25519_ed25519_verify_cost_base: 52 +ed25519_ed25519_verify_msg_cost_per_byte: 2 +ed25519_ed25519_verify_msg_cost_per_block: 2 +groth16_prepare_verifying_key_bls12381_cost_base: 52 +groth16_prepare_verifying_key_bn254_cost_base: 52 +groth16_verify_groth16_proof_internal_bls12381_cost_base: 52 +groth16_verify_groth16_proof_internal_bls12381_cost_per_public_input: 2 +groth16_verify_groth16_proof_internal_bn254_cost_base: 52 +groth16_verify_groth16_proof_internal_bn254_cost_per_public_input: 2 +groth16_verify_groth16_proof_internal_public_input_cost_per_byte: 2 +hash_blake2b256_cost_base: 52 +hash_blake2b256_data_cost_per_byte: 2 +hash_blake2b256_data_cost_per_block: 2 +hash_keccak256_cost_base: 52 +hash_keccak256_data_cost_per_byte: 2 +hash_keccak256_data_cost_per_block: 2 +group_ops_bls12381_decode_scalar_cost: 52 +group_ops_bls12381_decode_g1_cost: 52 +group_ops_bls12381_decode_g2_cost: 52 +group_ops_bls12381_decode_gt_cost: 52 +group_ops_bls12381_scalar_add_cost: 52 +group_ops_bls12381_g1_add_cost: 52 +group_ops_bls12381_g2_add_cost: 52 +group_ops_bls12381_gt_add_cost: 52 +group_ops_bls12381_scalar_sub_cost: 52 +group_ops_bls12381_g1_sub_cost: 52 +group_ops_bls12381_g2_sub_cost: 52 +group_ops_bls12381_gt_sub_cost: 52 +group_ops_bls12381_scalar_mul_cost: 52 +group_ops_bls12381_g1_mul_cost: 52 +group_ops_bls12381_g2_mul_cost: 52 +group_ops_bls12381_gt_mul_cost: 52 +group_ops_bls12381_scalar_div_cost: 52 +group_ops_bls12381_g1_div_cost: 52 +group_ops_bls12381_g2_div_cost: 52 +group_ops_bls12381_gt_div_cost: 52 +group_ops_bls12381_g1_hash_to_base_cost: 52 +group_ops_bls12381_g2_hash_to_base_cost: 52 +group_ops_bls12381_g1_hash_to_cost_per_byte: 2 +group_ops_bls12381_g2_hash_to_cost_per_byte: 2 +group_ops_bls12381_g1_msm_base_cost: 52 +group_ops_bls12381_g2_msm_base_cost: 52 +group_ops_bls12381_g1_msm_base_cost_per_input: 52 +group_ops_bls12381_g2_msm_base_cost_per_input: 52 +group_ops_bls12381_msm_max_len: 32 +group_ops_bls12381_pairing_cost: 52 +hmac_hmac_sha3_256_cost_base: 52 +hmac_hmac_sha3_256_input_cost_per_byte: 2 +hmac_hmac_sha3_256_input_cost_per_block: 2 +check_zklogin_id_cost_base: 200 +check_zklogin_issuer_cost_base: 200 +bcs_per_byte_serialized_cost: 2 +bcs_legacy_min_output_size_cost: 1 +bcs_failure_cost: 52 +hash_sha2_256_base_cost: 52 +hash_sha2_256_per_byte_cost: 2 +hash_sha2_256_legacy_min_input_len_cost: 1 +hash_sha3_256_base_cost: 52 +hash_sha3_256_per_byte_cost: 2 +hash_sha3_256_legacy_min_input_len_cost: 1 +type_name_get_base_cost: 52 +type_name_get_per_byte_cost: 2 +string_check_utf8_base_cost: 52 +string_check_utf8_per_byte_cost: 2 +string_is_char_boundary_base_cost: 52 +string_sub_string_base_cost: 52 +string_sub_string_per_byte_cost: 2 +string_index_of_base_cost: 52 +string_index_of_per_byte_pattern_cost: 2 +string_index_of_per_byte_searched_cost: 2 +vector_empty_base_cost: 52 +vector_length_base_cost: 52 +vector_push_back_base_cost: 52 +vector_push_back_legacy_per_abstract_memory_unit_cost: 2 +vector_borrow_base_cost: 52 +vector_pop_back_base_cost: 52 +vector_destroy_empty_base_cost: 52 +vector_swap_base_cost: 52 +debug_print_base_cost: 52 +debug_print_stack_trace_base_cost: 52 +execution_version: 1 +consensus_bad_nodes_stake_threshold: 20 +max_jwk_votes_per_validator_per_epoch: 240 +max_age_of_jwk_in_epochs: 1 +random_beacon_reduction_allowed_delta: 800 +random_beacon_reduction_lower_bound: 1000 +random_beacon_dkg_timeout_round: 3000 +random_beacon_min_round_interval_ms: 500 +random_beacon_dkg_version: 1 +consensus_max_transaction_size_bytes: 262144 +consensus_max_transactions_in_block_bytes: 524288 +consensus_max_num_transactions_in_block: 512 +max_deferral_rounds_for_congestion_control: 10 +min_checkpoint_interval_ms: 200 +checkpoint_summary_version_specific_data: 1 +max_soft_bundle_size: 5 +bridge_should_try_to_finalize_committee: false +max_accumulated_txn_cost_per_object_in_mysticeti_commit: 10 diff --git a/crates/iota-protocol-config/src/snapshots/iota_protocol_config__test__Testnet_version_3.snap b/crates/iota-protocol-config/src/snapshots/iota_protocol_config__test__Testnet_version_3.snap new file mode 100644 index 00000000000..148c0e0f3e0 --- /dev/null +++ b/crates/iota-protocol-config/src/snapshots/iota_protocol_config__test__Testnet_version_3.snap @@ -0,0 +1,271 @@ +--- +source: crates/iota-protocol-config/src/lib.rs +expression: "ProtocolConfig::get_for_version(cur, *chain_id)" +snapshot_kind: text +--- +version: 3 +feature_flags: + consensus_transaction_ordering: ByGasPrice + per_object_congestion_control_mode: TotalTxCount + zklogin_max_epoch_upper_bound_delta: 30 + relocate_event_module: true +max_tx_size_bytes: 131072 +max_input_objects: 2048 +max_size_written_objects: 5000000 +max_size_written_objects_system_tx: 50000000 +max_serialized_tx_effects_size_bytes: 524288 +max_serialized_tx_effects_size_bytes_system_tx: 8388608 +max_gas_payment_objects: 256 +max_modules_in_publish: 64 +max_package_dependencies: 32 +max_arguments: 512 +max_type_arguments: 16 +max_type_argument_depth: 16 +max_pure_argument_size: 16384 +max_programmable_tx_commands: 1024 +move_binary_format_version: 7 +min_move_binary_format_version: 6 +binary_module_handles: 100 +binary_struct_handles: 300 +binary_function_handles: 1500 +binary_function_instantiations: 750 +binary_signatures: 1000 +binary_constant_pool: 4000 +binary_identifiers: 10000 +binary_address_identifiers: 100 +binary_struct_defs: 200 +binary_struct_def_instantiations: 100 +binary_function_defs: 1000 +binary_field_handles: 500 +binary_field_instantiations: 250 +binary_friend_decls: 100 +max_move_object_size: 256000 +max_move_package_size: 102400 +max_publish_or_upgrade_per_ptb: 5 +max_tx_gas: 50000000000 +max_gas_price: 100000 +max_gas_computation_bucket: 5000000 +gas_rounding_step: 1000 +max_loop_depth: 5 +max_generic_instantiation_length: 32 +max_function_parameters: 128 +max_basic_blocks: 1024 +max_value_stack_size: 1024 +max_type_nodes: 256 +max_push_size: 10000 +max_struct_definitions: 200 +max_function_definitions: 1000 +max_fields_in_struct: 32 +max_dependency_depth: 100 +max_num_event_emit: 1024 +max_num_new_move_object_ids: 2048 +max_num_new_move_object_ids_system_tx: 32768 +max_num_deleted_move_object_ids: 2048 +max_num_deleted_move_object_ids_system_tx: 32768 +max_num_transferred_move_object_ids: 2048 +max_num_transferred_move_object_ids_system_tx: 32768 +max_event_emit_size: 256000 +max_event_emit_size_total: 65536000 +max_move_vector_len: 262144 +max_move_identifier_len: 128 +max_move_value_depth: 128 +max_back_edges_per_function: 10000 +max_back_edges_per_module: 10000 +max_verifier_meter_ticks_per_function: 16000000 +max_meter_ticks_per_module: 16000000 +max_meter_ticks_per_package: 16000000 +object_runtime_max_num_cached_objects: 1000 +object_runtime_max_num_cached_objects_system_tx: 16000 +object_runtime_max_num_store_entries: 1000 +object_runtime_max_num_store_entries_system_tx: 16000 +base_tx_cost_fixed: 1000 +package_publish_cost_fixed: 1000 +base_tx_cost_per_byte: 0 +package_publish_cost_per_byte: 80 +obj_access_cost_read_per_byte: 15 +obj_access_cost_mutate_per_byte: 40 +obj_access_cost_delete_per_byte: 40 +obj_access_cost_verify_per_byte: 200 +gas_model_version: 1 +obj_data_cost_refundable: 100 +obj_metadata_cost_non_refundable: 50 +storage_rebate_rate: 10000 +reward_slashing_rate: 10000 +storage_gas_price: 76 +validator_target_reward: 767000000000000 +max_transactions_per_checkpoint: 10000 +max_checkpoint_size_bytes: 31457280 +buffer_stake_for_protocol_upgrade_bps: 5000 +address_from_bytes_cost_base: 52 +address_to_u256_cost_base: 52 +address_from_u256_cost_base: 52 +config_read_setting_impl_cost_base: 100 +config_read_setting_impl_cost_per_byte: 40 +dynamic_field_hash_type_and_key_cost_base: 100 +dynamic_field_hash_type_and_key_type_cost_per_byte: 2 +dynamic_field_hash_type_and_key_value_cost_per_byte: 2 +dynamic_field_hash_type_and_key_type_tag_cost_per_byte: 2 +dynamic_field_add_child_object_cost_base: 100 +dynamic_field_add_child_object_type_cost_per_byte: 10 +dynamic_field_add_child_object_value_cost_per_byte: 10 +dynamic_field_add_child_object_struct_tag_cost_per_byte: 10 +dynamic_field_borrow_child_object_cost_base: 100 +dynamic_field_borrow_child_object_child_ref_cost_per_byte: 10 +dynamic_field_borrow_child_object_type_cost_per_byte: 10 +dynamic_field_remove_child_object_cost_base: 100 +dynamic_field_remove_child_object_child_cost_per_byte: 2 +dynamic_field_remove_child_object_type_cost_per_byte: 2 +dynamic_field_has_child_object_cost_base: 100 +dynamic_field_has_child_object_with_ty_cost_base: 100 +dynamic_field_has_child_object_with_ty_type_cost_per_byte: 2 +dynamic_field_has_child_object_with_ty_type_tag_cost_per_byte: 2 +event_emit_cost_base: 52 +event_emit_value_size_derivation_cost_per_byte: 2 +event_emit_tag_size_derivation_cost_per_byte: 5 +event_emit_output_cost_per_byte: 10 +object_borrow_uid_cost_base: 52 +object_delete_impl_cost_base: 52 +object_record_new_uid_cost_base: 52 +transfer_transfer_internal_cost_base: 52 +transfer_freeze_object_cost_base: 52 +transfer_share_object_cost_base: 52 +transfer_receive_object_cost_base: 52 +tx_context_derive_id_cost_base: 52 +types_is_one_time_witness_cost_base: 52 +types_is_one_time_witness_type_tag_cost_per_byte: 2 +types_is_one_time_witness_type_cost_per_byte: 2 +validator_validate_metadata_cost_base: 52 +validator_validate_metadata_data_cost_per_byte: 2 +crypto_invalid_arguments_cost: 100 +bls12381_bls12381_min_sig_verify_cost_base: 52 +bls12381_bls12381_min_sig_verify_msg_cost_per_byte: 2 +bls12381_bls12381_min_sig_verify_msg_cost_per_block: 2 +bls12381_bls12381_min_pk_verify_cost_base: 52 +bls12381_bls12381_min_pk_verify_msg_cost_per_byte: 2 +bls12381_bls12381_min_pk_verify_msg_cost_per_block: 2 +ecdsa_k1_ecrecover_keccak256_cost_base: 52 +ecdsa_k1_ecrecover_keccak256_msg_cost_per_byte: 2 +ecdsa_k1_ecrecover_keccak256_msg_cost_per_block: 2 +ecdsa_k1_ecrecover_sha256_cost_base: 52 +ecdsa_k1_ecrecover_sha256_msg_cost_per_byte: 2 +ecdsa_k1_ecrecover_sha256_msg_cost_per_block: 2 +ecdsa_k1_decompress_pubkey_cost_base: 52 +ecdsa_k1_secp256k1_verify_keccak256_cost_base: 52 +ecdsa_k1_secp256k1_verify_keccak256_msg_cost_per_byte: 2 +ecdsa_k1_secp256k1_verify_keccak256_msg_cost_per_block: 2 +ecdsa_k1_secp256k1_verify_sha256_cost_base: 52 +ecdsa_k1_secp256k1_verify_sha256_msg_cost_per_byte: 2 +ecdsa_k1_secp256k1_verify_sha256_msg_cost_per_block: 2 +ecdsa_r1_ecrecover_keccak256_cost_base: 52 +ecdsa_r1_ecrecover_keccak256_msg_cost_per_byte: 2 +ecdsa_r1_ecrecover_keccak256_msg_cost_per_block: 2 +ecdsa_r1_ecrecover_sha256_cost_base: 52 +ecdsa_r1_ecrecover_sha256_msg_cost_per_byte: 2 +ecdsa_r1_ecrecover_sha256_msg_cost_per_block: 2 +ecdsa_r1_secp256r1_verify_keccak256_cost_base: 52 +ecdsa_r1_secp256r1_verify_keccak256_msg_cost_per_byte: 2 +ecdsa_r1_secp256r1_verify_keccak256_msg_cost_per_block: 2 +ecdsa_r1_secp256r1_verify_sha256_cost_base: 52 +ecdsa_r1_secp256r1_verify_sha256_msg_cost_per_byte: 2 +ecdsa_r1_secp256r1_verify_sha256_msg_cost_per_block: 2 +ecvrf_ecvrf_verify_cost_base: 52 +ecvrf_ecvrf_verify_alpha_string_cost_per_byte: 2 +ecvrf_ecvrf_verify_alpha_string_cost_per_block: 2 +ed25519_ed25519_verify_cost_base: 52 +ed25519_ed25519_verify_msg_cost_per_byte: 2 +ed25519_ed25519_verify_msg_cost_per_block: 2 +groth16_prepare_verifying_key_bls12381_cost_base: 52 +groth16_prepare_verifying_key_bn254_cost_base: 52 +groth16_verify_groth16_proof_internal_bls12381_cost_base: 52 +groth16_verify_groth16_proof_internal_bls12381_cost_per_public_input: 2 +groth16_verify_groth16_proof_internal_bn254_cost_base: 52 +groth16_verify_groth16_proof_internal_bn254_cost_per_public_input: 2 +groth16_verify_groth16_proof_internal_public_input_cost_per_byte: 2 +hash_blake2b256_cost_base: 52 +hash_blake2b256_data_cost_per_byte: 2 +hash_blake2b256_data_cost_per_block: 2 +hash_keccak256_cost_base: 52 +hash_keccak256_data_cost_per_byte: 2 +hash_keccak256_data_cost_per_block: 2 +group_ops_bls12381_decode_scalar_cost: 52 +group_ops_bls12381_decode_g1_cost: 52 +group_ops_bls12381_decode_g2_cost: 52 +group_ops_bls12381_decode_gt_cost: 52 +group_ops_bls12381_scalar_add_cost: 52 +group_ops_bls12381_g1_add_cost: 52 +group_ops_bls12381_g2_add_cost: 52 +group_ops_bls12381_gt_add_cost: 52 +group_ops_bls12381_scalar_sub_cost: 52 +group_ops_bls12381_g1_sub_cost: 52 +group_ops_bls12381_g2_sub_cost: 52 +group_ops_bls12381_gt_sub_cost: 52 +group_ops_bls12381_scalar_mul_cost: 52 +group_ops_bls12381_g1_mul_cost: 52 +group_ops_bls12381_g2_mul_cost: 52 +group_ops_bls12381_gt_mul_cost: 52 +group_ops_bls12381_scalar_div_cost: 52 +group_ops_bls12381_g1_div_cost: 52 +group_ops_bls12381_g2_div_cost: 52 +group_ops_bls12381_gt_div_cost: 52 +group_ops_bls12381_g1_hash_to_base_cost: 52 +group_ops_bls12381_g2_hash_to_base_cost: 52 +group_ops_bls12381_g1_hash_to_cost_per_byte: 2 +group_ops_bls12381_g2_hash_to_cost_per_byte: 2 +group_ops_bls12381_g1_msm_base_cost: 52 +group_ops_bls12381_g2_msm_base_cost: 52 +group_ops_bls12381_g1_msm_base_cost_per_input: 52 +group_ops_bls12381_g2_msm_base_cost_per_input: 52 +group_ops_bls12381_msm_max_len: 32 +group_ops_bls12381_pairing_cost: 52 +hmac_hmac_sha3_256_cost_base: 52 +hmac_hmac_sha3_256_input_cost_per_byte: 2 +hmac_hmac_sha3_256_input_cost_per_block: 2 +check_zklogin_id_cost_base: 200 +check_zklogin_issuer_cost_base: 200 +bcs_per_byte_serialized_cost: 2 +bcs_legacy_min_output_size_cost: 1 +bcs_failure_cost: 52 +hash_sha2_256_base_cost: 52 +hash_sha2_256_per_byte_cost: 2 +hash_sha2_256_legacy_min_input_len_cost: 1 +hash_sha3_256_base_cost: 52 +hash_sha3_256_per_byte_cost: 2 +hash_sha3_256_legacy_min_input_len_cost: 1 +type_name_get_base_cost: 52 +type_name_get_per_byte_cost: 2 +string_check_utf8_base_cost: 52 +string_check_utf8_per_byte_cost: 2 +string_is_char_boundary_base_cost: 52 +string_sub_string_base_cost: 52 +string_sub_string_per_byte_cost: 2 +string_index_of_base_cost: 52 +string_index_of_per_byte_pattern_cost: 2 +string_index_of_per_byte_searched_cost: 2 +vector_empty_base_cost: 52 +vector_length_base_cost: 52 +vector_push_back_base_cost: 52 +vector_push_back_legacy_per_abstract_memory_unit_cost: 2 +vector_borrow_base_cost: 52 +vector_pop_back_base_cost: 52 +vector_destroy_empty_base_cost: 52 +vector_swap_base_cost: 52 +debug_print_base_cost: 52 +debug_print_stack_trace_base_cost: 52 +execution_version: 1 +consensus_bad_nodes_stake_threshold: 20 +max_jwk_votes_per_validator_per_epoch: 240 +max_age_of_jwk_in_epochs: 1 +random_beacon_reduction_allowed_delta: 800 +random_beacon_reduction_lower_bound: 1000 +random_beacon_dkg_timeout_round: 3000 +random_beacon_min_round_interval_ms: 500 +random_beacon_dkg_version: 1 +consensus_max_transaction_size_bytes: 262144 +consensus_max_transactions_in_block_bytes: 524288 +consensus_max_num_transactions_in_block: 512 +max_deferral_rounds_for_congestion_control: 10 +min_checkpoint_interval_ms: 200 +checkpoint_summary_version_specific_data: 1 +max_soft_bundle_size: 5 +bridge_should_try_to_finalize_committee: true +max_accumulated_txn_cost_per_object_in_mysticeti_commit: 10 diff --git a/crates/iota-protocol-config/src/snapshots/iota_protocol_config__test__version_3.snap b/crates/iota-protocol-config/src/snapshots/iota_protocol_config__test__version_3.snap new file mode 100644 index 00000000000..3e7f5807cab --- /dev/null +++ b/crates/iota-protocol-config/src/snapshots/iota_protocol_config__test__version_3.snap @@ -0,0 +1,279 @@ +--- +source: crates/iota-protocol-config/src/lib.rs +expression: "ProtocolConfig::get_for_version(cur, *chain_id)" +snapshot_kind: text +--- +version: 3 +feature_flags: + consensus_transaction_ordering: ByGasPrice + enable_poseidon: true + enable_group_ops_native_function_msm: true + per_object_congestion_control_mode: TotalTxCount + zklogin_max_epoch_upper_bound_delta: 30 + enable_vdf: true + passkey_auth: true + relocate_event_module: true +max_tx_size_bytes: 131072 +max_input_objects: 2048 +max_size_written_objects: 5000000 +max_size_written_objects_system_tx: 50000000 +max_serialized_tx_effects_size_bytes: 524288 +max_serialized_tx_effects_size_bytes_system_tx: 8388608 +max_gas_payment_objects: 256 +max_modules_in_publish: 64 +max_package_dependencies: 32 +max_arguments: 512 +max_type_arguments: 16 +max_type_argument_depth: 16 +max_pure_argument_size: 16384 +max_programmable_tx_commands: 1024 +move_binary_format_version: 7 +min_move_binary_format_version: 6 +binary_module_handles: 100 +binary_struct_handles: 300 +binary_function_handles: 1500 +binary_function_instantiations: 750 +binary_signatures: 1000 +binary_constant_pool: 4000 +binary_identifiers: 10000 +binary_address_identifiers: 100 +binary_struct_defs: 200 +binary_struct_def_instantiations: 100 +binary_function_defs: 1000 +binary_field_handles: 500 +binary_field_instantiations: 250 +binary_friend_decls: 100 +max_move_object_size: 256000 +max_move_package_size: 102400 +max_publish_or_upgrade_per_ptb: 5 +max_tx_gas: 50000000000 +max_gas_price: 100000 +max_gas_computation_bucket: 5000000 +gas_rounding_step: 1000 +max_loop_depth: 5 +max_generic_instantiation_length: 32 +max_function_parameters: 128 +max_basic_blocks: 1024 +max_value_stack_size: 1024 +max_type_nodes: 256 +max_push_size: 10000 +max_struct_definitions: 200 +max_function_definitions: 1000 +max_fields_in_struct: 32 +max_dependency_depth: 100 +max_num_event_emit: 1024 +max_num_new_move_object_ids: 2048 +max_num_new_move_object_ids_system_tx: 32768 +max_num_deleted_move_object_ids: 2048 +max_num_deleted_move_object_ids_system_tx: 32768 +max_num_transferred_move_object_ids: 2048 +max_num_transferred_move_object_ids_system_tx: 32768 +max_event_emit_size: 256000 +max_event_emit_size_total: 65536000 +max_move_vector_len: 262144 +max_move_identifier_len: 128 +max_move_value_depth: 128 +max_back_edges_per_function: 10000 +max_back_edges_per_module: 10000 +max_verifier_meter_ticks_per_function: 16000000 +max_meter_ticks_per_module: 16000000 +max_meter_ticks_per_package: 16000000 +object_runtime_max_num_cached_objects: 1000 +object_runtime_max_num_cached_objects_system_tx: 16000 +object_runtime_max_num_store_entries: 1000 +object_runtime_max_num_store_entries_system_tx: 16000 +base_tx_cost_fixed: 1000 +package_publish_cost_fixed: 1000 +base_tx_cost_per_byte: 0 +package_publish_cost_per_byte: 80 +obj_access_cost_read_per_byte: 15 +obj_access_cost_mutate_per_byte: 40 +obj_access_cost_delete_per_byte: 40 +obj_access_cost_verify_per_byte: 200 +gas_model_version: 1 +obj_data_cost_refundable: 100 +obj_metadata_cost_non_refundable: 50 +storage_rebate_rate: 10000 +reward_slashing_rate: 10000 +storage_gas_price: 76 +validator_target_reward: 767000000000000 +max_transactions_per_checkpoint: 10000 +max_checkpoint_size_bytes: 31457280 +buffer_stake_for_protocol_upgrade_bps: 5000 +address_from_bytes_cost_base: 52 +address_to_u256_cost_base: 52 +address_from_u256_cost_base: 52 +config_read_setting_impl_cost_base: 100 +config_read_setting_impl_cost_per_byte: 40 +dynamic_field_hash_type_and_key_cost_base: 100 +dynamic_field_hash_type_and_key_type_cost_per_byte: 2 +dynamic_field_hash_type_and_key_value_cost_per_byte: 2 +dynamic_field_hash_type_and_key_type_tag_cost_per_byte: 2 +dynamic_field_add_child_object_cost_base: 100 +dynamic_field_add_child_object_type_cost_per_byte: 10 +dynamic_field_add_child_object_value_cost_per_byte: 10 +dynamic_field_add_child_object_struct_tag_cost_per_byte: 10 +dynamic_field_borrow_child_object_cost_base: 100 +dynamic_field_borrow_child_object_child_ref_cost_per_byte: 10 +dynamic_field_borrow_child_object_type_cost_per_byte: 10 +dynamic_field_remove_child_object_cost_base: 100 +dynamic_field_remove_child_object_child_cost_per_byte: 2 +dynamic_field_remove_child_object_type_cost_per_byte: 2 +dynamic_field_has_child_object_cost_base: 100 +dynamic_field_has_child_object_with_ty_cost_base: 100 +dynamic_field_has_child_object_with_ty_type_cost_per_byte: 2 +dynamic_field_has_child_object_with_ty_type_tag_cost_per_byte: 2 +event_emit_cost_base: 52 +event_emit_value_size_derivation_cost_per_byte: 2 +event_emit_tag_size_derivation_cost_per_byte: 5 +event_emit_output_cost_per_byte: 10 +object_borrow_uid_cost_base: 52 +object_delete_impl_cost_base: 52 +object_record_new_uid_cost_base: 52 +transfer_transfer_internal_cost_base: 52 +transfer_freeze_object_cost_base: 52 +transfer_share_object_cost_base: 52 +transfer_receive_object_cost_base: 52 +tx_context_derive_id_cost_base: 52 +types_is_one_time_witness_cost_base: 52 +types_is_one_time_witness_type_tag_cost_per_byte: 2 +types_is_one_time_witness_type_cost_per_byte: 2 +validator_validate_metadata_cost_base: 52 +validator_validate_metadata_data_cost_per_byte: 2 +crypto_invalid_arguments_cost: 100 +bls12381_bls12381_min_sig_verify_cost_base: 52 +bls12381_bls12381_min_sig_verify_msg_cost_per_byte: 2 +bls12381_bls12381_min_sig_verify_msg_cost_per_block: 2 +bls12381_bls12381_min_pk_verify_cost_base: 52 +bls12381_bls12381_min_pk_verify_msg_cost_per_byte: 2 +bls12381_bls12381_min_pk_verify_msg_cost_per_block: 2 +ecdsa_k1_ecrecover_keccak256_cost_base: 52 +ecdsa_k1_ecrecover_keccak256_msg_cost_per_byte: 2 +ecdsa_k1_ecrecover_keccak256_msg_cost_per_block: 2 +ecdsa_k1_ecrecover_sha256_cost_base: 52 +ecdsa_k1_ecrecover_sha256_msg_cost_per_byte: 2 +ecdsa_k1_ecrecover_sha256_msg_cost_per_block: 2 +ecdsa_k1_decompress_pubkey_cost_base: 52 +ecdsa_k1_secp256k1_verify_keccak256_cost_base: 52 +ecdsa_k1_secp256k1_verify_keccak256_msg_cost_per_byte: 2 +ecdsa_k1_secp256k1_verify_keccak256_msg_cost_per_block: 2 +ecdsa_k1_secp256k1_verify_sha256_cost_base: 52 +ecdsa_k1_secp256k1_verify_sha256_msg_cost_per_byte: 2 +ecdsa_k1_secp256k1_verify_sha256_msg_cost_per_block: 2 +ecdsa_r1_ecrecover_keccak256_cost_base: 52 +ecdsa_r1_ecrecover_keccak256_msg_cost_per_byte: 2 +ecdsa_r1_ecrecover_keccak256_msg_cost_per_block: 2 +ecdsa_r1_ecrecover_sha256_cost_base: 52 +ecdsa_r1_ecrecover_sha256_msg_cost_per_byte: 2 +ecdsa_r1_ecrecover_sha256_msg_cost_per_block: 2 +ecdsa_r1_secp256r1_verify_keccak256_cost_base: 52 +ecdsa_r1_secp256r1_verify_keccak256_msg_cost_per_byte: 2 +ecdsa_r1_secp256r1_verify_keccak256_msg_cost_per_block: 2 +ecdsa_r1_secp256r1_verify_sha256_cost_base: 52 +ecdsa_r1_secp256r1_verify_sha256_msg_cost_per_byte: 2 +ecdsa_r1_secp256r1_verify_sha256_msg_cost_per_block: 2 +ecvrf_ecvrf_verify_cost_base: 52 +ecvrf_ecvrf_verify_alpha_string_cost_per_byte: 2 +ecvrf_ecvrf_verify_alpha_string_cost_per_block: 2 +ed25519_ed25519_verify_cost_base: 52 +ed25519_ed25519_verify_msg_cost_per_byte: 2 +ed25519_ed25519_verify_msg_cost_per_block: 2 +groth16_prepare_verifying_key_bls12381_cost_base: 52 +groth16_prepare_verifying_key_bn254_cost_base: 52 +groth16_verify_groth16_proof_internal_bls12381_cost_base: 52 +groth16_verify_groth16_proof_internal_bls12381_cost_per_public_input: 2 +groth16_verify_groth16_proof_internal_bn254_cost_base: 52 +groth16_verify_groth16_proof_internal_bn254_cost_per_public_input: 2 +groth16_verify_groth16_proof_internal_public_input_cost_per_byte: 2 +hash_blake2b256_cost_base: 52 +hash_blake2b256_data_cost_per_byte: 2 +hash_blake2b256_data_cost_per_block: 2 +hash_keccak256_cost_base: 52 +hash_keccak256_data_cost_per_byte: 2 +hash_keccak256_data_cost_per_block: 2 +poseidon_bn254_cost_base: 260 +poseidon_bn254_cost_per_block: 10 +group_ops_bls12381_decode_scalar_cost: 52 +group_ops_bls12381_decode_g1_cost: 52 +group_ops_bls12381_decode_g2_cost: 52 +group_ops_bls12381_decode_gt_cost: 52 +group_ops_bls12381_scalar_add_cost: 52 +group_ops_bls12381_g1_add_cost: 52 +group_ops_bls12381_g2_add_cost: 52 +group_ops_bls12381_gt_add_cost: 52 +group_ops_bls12381_scalar_sub_cost: 52 +group_ops_bls12381_g1_sub_cost: 52 +group_ops_bls12381_g2_sub_cost: 52 +group_ops_bls12381_gt_sub_cost: 52 +group_ops_bls12381_scalar_mul_cost: 52 +group_ops_bls12381_g1_mul_cost: 52 +group_ops_bls12381_g2_mul_cost: 52 +group_ops_bls12381_gt_mul_cost: 52 +group_ops_bls12381_scalar_div_cost: 52 +group_ops_bls12381_g1_div_cost: 52 +group_ops_bls12381_g2_div_cost: 52 +group_ops_bls12381_gt_div_cost: 52 +group_ops_bls12381_g1_hash_to_base_cost: 52 +group_ops_bls12381_g2_hash_to_base_cost: 52 +group_ops_bls12381_g1_hash_to_cost_per_byte: 2 +group_ops_bls12381_g2_hash_to_cost_per_byte: 2 +group_ops_bls12381_g1_msm_base_cost: 52 +group_ops_bls12381_g2_msm_base_cost: 52 +group_ops_bls12381_g1_msm_base_cost_per_input: 52 +group_ops_bls12381_g2_msm_base_cost_per_input: 52 +group_ops_bls12381_msm_max_len: 32 +group_ops_bls12381_pairing_cost: 52 +hmac_hmac_sha3_256_cost_base: 52 +hmac_hmac_sha3_256_input_cost_per_byte: 2 +hmac_hmac_sha3_256_input_cost_per_block: 2 +check_zklogin_id_cost_base: 200 +check_zklogin_issuer_cost_base: 200 +vdf_verify_vdf_cost: 1500 +vdf_hash_to_input_cost: 100 +bcs_per_byte_serialized_cost: 2 +bcs_legacy_min_output_size_cost: 1 +bcs_failure_cost: 52 +hash_sha2_256_base_cost: 52 +hash_sha2_256_per_byte_cost: 2 +hash_sha2_256_legacy_min_input_len_cost: 1 +hash_sha3_256_base_cost: 52 +hash_sha3_256_per_byte_cost: 2 +hash_sha3_256_legacy_min_input_len_cost: 1 +type_name_get_base_cost: 52 +type_name_get_per_byte_cost: 2 +string_check_utf8_base_cost: 52 +string_check_utf8_per_byte_cost: 2 +string_is_char_boundary_base_cost: 52 +string_sub_string_base_cost: 52 +string_sub_string_per_byte_cost: 2 +string_index_of_base_cost: 52 +string_index_of_per_byte_pattern_cost: 2 +string_index_of_per_byte_searched_cost: 2 +vector_empty_base_cost: 52 +vector_length_base_cost: 52 +vector_push_back_base_cost: 52 +vector_push_back_legacy_per_abstract_memory_unit_cost: 2 +vector_borrow_base_cost: 52 +vector_pop_back_base_cost: 52 +vector_destroy_empty_base_cost: 52 +vector_swap_base_cost: 52 +debug_print_base_cost: 52 +debug_print_stack_trace_base_cost: 52 +execution_version: 1 +consensus_bad_nodes_stake_threshold: 20 +max_jwk_votes_per_validator_per_epoch: 240 +max_age_of_jwk_in_epochs: 1 +random_beacon_reduction_allowed_delta: 800 +random_beacon_reduction_lower_bound: 1000 +random_beacon_dkg_timeout_round: 3000 +random_beacon_min_round_interval_ms: 500 +random_beacon_dkg_version: 1 +consensus_max_transaction_size_bytes: 262144 +consensus_max_transactions_in_block_bytes: 524288 +consensus_max_num_transactions_in_block: 512 +max_deferral_rounds_for_congestion_control: 10 +min_checkpoint_interval_ms: 200 +checkpoint_summary_version_specific_data: 1 +max_soft_bundle_size: 5 +bridge_should_try_to_finalize_committee: true +max_accumulated_txn_cost_per_object_in_mysticeti_commit: 10 diff --git a/crates/iota-proxy/Cargo.toml b/crates/iota-proxy/Cargo.toml new file mode 100644 index 00000000000..4664ad08796 --- /dev/null +++ b/crates/iota-proxy/Cargo.toml @@ -0,0 +1,61 @@ +[package] +name = "iota-proxy" +version.workspace = true +authors = ["IOTA Foundation "] +edition = "2021" +license = "Apache-2.0" +publish = false + +[dependencies] +# external dependencies +anyhow.workspace = true +axum.workspace = true +axum-extra.workspace = true +axum-server.workspace = true +bytes.workspace = true +clap.workspace = true +const-str.workspace = true +fastcrypto.workspace = true +futures.workspace = true +git-version.workspace = true +hex.workspace = true +hyper.workspace = true +itertools.workspace = true +multiaddr = "0.17.0" +once_cell.workspace = true +prometheus.workspace = true +prost.workspace = true +protobuf.workspace = true +rand.workspace = true +reqwest.workspace = true +rustls.workspace = true +rustls-pemfile = "2.1.2" +serde.workspace = true +serde_json.workspace = true +serde_with.workspace = true +serde_yaml.workspace = true +snap.workspace = true +tokio = { workspace = true, features = ["full"] } +tower.workspace = true +tower-http.workspace = true +tracing.workspace = true +url.workspace = true + +# internal dependencies +iota-metrics.workspace = true +iota-tls.workspace = true +iota-types.workspace = true +telemetry-subscribers.workspace = true + +[dev-dependencies] +# external dependencies +axum-server.workspace = true +mime = "0.3" +serde_json.workspace = true +tower.workspace = true + +# internal dependencies +iota-types = { workspace = true, features = ["test-utils"] } + +[build-dependencies] +prost-build = "0.13.1" diff --git a/crates/iota-proxy/build.rs b/crates/iota-proxy/build.rs new file mode 100644 index 00000000000..86a87cdc909 --- /dev/null +++ b/crates/iota-proxy/build.rs @@ -0,0 +1,18 @@ +// Copyright (c) Mysten Labs, Inc. +// Modifications Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +use std::io::Result; +fn main() -> Result<()> { + println!("cargo:rerun-if-changed=build.rs"); + println!("cargo:rerun-if-env-changed=BUILD_REMOTE_WRITE"); + + // add this env var to build. you'll need protoc installed locally and a copy of + // the proto files + if option_env!("BUILD_REMOTE_WRITE").is_some() { + prost_build::compile_protos(&["protobufs/remote.proto", "protobufs/types.proto"], &[ + "protobufs/", + ])?; + } + Ok(()) +} diff --git a/crates/iota-proxy/src/admin.rs b/crates/iota-proxy/src/admin.rs new file mode 100644 index 00000000000..3b8e08217f1 --- /dev/null +++ b/crates/iota-proxy/src/admin.rs @@ -0,0 +1,278 @@ +// Copyright (c) Mysten Labs, Inc. +// Modifications Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +use std::{fs, io::BufReader, net::SocketAddr, sync::Arc, time::Duration}; + +use anyhow::{Error, Result}; +use axum::{Extension, Router, extract::DefaultBodyLimit, middleware, routing::post}; +use fastcrypto::{ + ed25519::{Ed25519KeyPair, Ed25519PublicKey}, + traits::{KeyPair, ToFromBytes}, +}; +use iota_tls::{ + AllowAll, ClientCertVerifier, IOTA_VALIDATOR_SERVER_NAME, SelfSignedCertificate, TlsAcceptor, + rustls::ServerConfig, +}; +use tokio::signal; +use tower::ServiceBuilder; +use tower_http::{ + LatencyUnit, + timeout::TimeoutLayer, + trace::{DefaultOnFailure, DefaultOnResponse, TraceLayer}, +}; +use tracing::{Level, info}; + +use crate::{ + config::{DynamicPeerValidationConfig, RemoteWriteConfig, StaticPeerValidationConfig}, + handlers::publish_metrics, + histogram_relay::HistogramRelay, + middleware::{expect_content_length, expect_iota_proxy_header, expect_valid_public_key}, + peers::{IotaNodeProvider, IotaPeer}, + var, +}; + +/// Configure our graceful shutdown scenarios +pub async fn shutdown_signal(h: axum_server::Handle) { + let ctrl_c = async { + signal::ctrl_c() + .await + .expect("failed to install Ctrl+C handler"); + }; + + #[cfg(unix)] + let terminate = async { + signal::unix::signal(signal::unix::SignalKind::terminate()) + .expect("failed to install signal handler") + .recv() + .await; + }; + + #[cfg(not(unix))] + let terminate = std::future::pending::<()>(); + + tokio::select! { + _ = ctrl_c => {}, + _ = terminate => {}, + } + + let grace = 30; + info!( + "signal received, starting graceful shutdown, grace period {} seconds, if needed", + &grace + ); + h.graceful_shutdown(Some(Duration::from_secs(grace))) +} + +/// Reqwest client holds the global client for remote_push api calls +/// it also holds the username and password. The client has an underlying +/// connection pool. See reqwest documentation for details +#[derive(Clone)] +pub struct ReqwestClient { + pub client: reqwest::Client, + pub settings: RemoteWriteConfig, +} + +pub fn make_reqwest_client(settings: RemoteWriteConfig, user_agent: &str) -> ReqwestClient { + ReqwestClient { + client: reqwest::Client::builder() + .user_agent(user_agent) + .pool_max_idle_per_host(settings.pool_max_idle_per_host) + .timeout(Duration::from_secs(var!("MIMIR_CLIENT_TIMEOUT", 30))) + .build() + .expect("cannot create reqwest client"), + settings, + } +} + +// Labels are adhoc labels we will inject per our config +#[derive(Clone)] +pub struct Labels { + pub network: String, +} + +/// App will configure our routes. This fn is also used to instrument our tests +pub fn app( + labels: Labels, + client: ReqwestClient, + relay: HistogramRelay, + allower: Option, +) -> Router { + // build our application with a route and our sender mpsc + let mut router = Router::new() + .route("/publish/metrics", post(publish_metrics)) + .route_layer(DefaultBodyLimit::max(var!( + "MAX_BODY_SIZE", + 1024 * 1024 * 5 + ))) + .route_layer(middleware::from_fn(expect_iota_proxy_header)) + .route_layer(middleware::from_fn(expect_content_length)); + if let Some(allower) = allower { + router = router + .route_layer(middleware::from_fn(expect_valid_public_key)) + .layer(Extension(Arc::new(allower))); + } + router + // Enforce on all routes. + // If the request does not complete within the specified timeout it will be aborted + // and a 408 Request Timeout response will be sent. + .layer(TimeoutLayer::new(Duration::from_secs(var!( + "NODE_CLIENT_TIMEOUT", + 20 + )))) + .layer(Extension(relay)) + .layer(Extension(labels)) + .layer(Extension(client)) + .layer( + ServiceBuilder::new().layer( + TraceLayer::new_for_http() + .on_response( + DefaultOnResponse::new() + .level(Level::INFO) + .latency_unit(LatencyUnit::Seconds), + ) + .on_failure( + DefaultOnFailure::new() + .level(Level::ERROR) + .latency_unit(LatencyUnit::Seconds), + ), + ), + ) +} + +/// Server creates our http/https server +pub async fn server( + listener: std::net::TcpListener, + app: Router, + acceptor: Option, +) -> std::io::Result<()> { + // setup our graceful shutdown + let handle = axum_server::Handle::new(); + // Spawn a task to gracefully shutdown server. + tokio::spawn(shutdown_signal(handle.clone())); + + if let Some(verify_peers) = acceptor { + axum_server::Server::from_tcp(listener) + .acceptor(verify_peers) + .handle(handle) + .serve(app.into_make_service_with_connect_info::()) + .await + } else { + axum_server::Server::from_tcp(listener) + .handle(handle) + .serve(app.into_make_service_with_connect_info::()) + .await + } +} + +/// CertKeyPair wraps a self signed certificate and the corresponding public key +pub struct CertKeyPair(pub SelfSignedCertificate, pub Ed25519PublicKey); + +/// Generate server certs for use with peer verification +pub fn generate_self_cert(hostname: String) -> CertKeyPair { + let mut rng = rand::thread_rng(); + let keypair = Ed25519KeyPair::generate(&mut rng); + CertKeyPair( + SelfSignedCertificate::new(keypair.copy().private(), &hostname), + keypair.public().to_owned(), + ) +} + +/// Load a certificate for use by the listening service +fn load_certs(filename: &str) -> Vec> { + let certfile = fs::File::open(filename) + .unwrap_or_else(|e| panic!("cannot open certificate file: {}; {}", filename, e)); + let mut reader = BufReader::new(certfile); + rustls_pemfile::certs(&mut reader) + .collect::, _>>() + .unwrap() +} + +/// Load a private key +fn load_private_key(filename: &str) -> rustls::pki_types::PrivateKeyDer<'static> { + let keyfile = fs::File::open(filename) + .unwrap_or_else(|e| panic!("cannot open private key file {}; {}", filename, e)); + let mut reader = BufReader::new(keyfile); + + loop { + match rustls_pemfile::read_one(&mut reader).expect("cannot parse private key .pem file") { + Some(rustls_pemfile::Item::Pkcs1Key(key)) => return key.into(), + Some(rustls_pemfile::Item::Pkcs8Key(key)) => return key.into(), + Some(rustls_pemfile::Item::Sec1Key(key)) => return key.into(), + None => break, + _ => {} + } + } + + panic!( + "no keys found in {:?} (encrypted keys not supported)", + filename + ); +} + +/// load the static keys we'll use to allow external non-validator nodes to push +/// metrics +fn load_static_peers( + static_peers: Option, +) -> Result, Error> { + let Some(static_peers) = static_peers else { + return Ok(vec![]); + }; + let static_keys = static_peers + .pub_keys + .into_iter() + .map(|spk| { + let peer_id = hex::decode(spk.peer_id).unwrap(); + let public_key = Ed25519PublicKey::from_bytes(peer_id.as_ref()).unwrap(); + let s = IotaPeer { + name: spk.name.clone(), + public_key, + }; + info!( + "loaded static peer: {} public key: {}", + &s.name, &s.public_key, + ); + s + }) + .collect(); + Ok(static_keys) +} + +/// Default allow mode for server, we don't verify clients, everything is +/// accepted +pub fn create_server_cert_default_allow( + hostname: String, +) -> Result { + let CertKeyPair(server_certificate, _) = generate_self_cert(hostname); + + ClientCertVerifier::new(AllowAll, IOTA_VALIDATOR_SERVER_NAME.to_string()).rustls_server_config( + vec![server_certificate.rustls_certificate()], + server_certificate.rustls_private_key(), + ) +} + +/// Verify clients against iota blockchain, clients that are not found in +/// iota_getValidators will be rejected +pub fn create_server_cert_enforce_peer( + dynamic_peers: DynamicPeerValidationConfig, + static_peers: Option, +) -> Result<(ServerConfig, Option), iota_tls::rustls::Error> { + let (Some(certificate_path), Some(private_key_path)) = + (dynamic_peers.certificate_file, dynamic_peers.private_key) + else { + return Err(iota_tls::rustls::Error::General( + "missing certs to initialize server".into(), + )); + }; + let static_peers = load_static_peers(static_peers).map_err(|e| { + iota_tls::rustls::Error::General(format!("unable to load static pub keys: {}", e)) + })?; + let allower = IotaNodeProvider::new(dynamic_peers.url, dynamic_peers.interval, static_peers); + allower.poll_peer_list(); + let c = ClientCertVerifier::new(allower.clone(), IOTA_VALIDATOR_SERVER_NAME.to_string()) + .rustls_server_config( + load_certs(&certificate_path), + load_private_key(&private_key_path), + )?; + Ok((c, Some(allower))) +} diff --git a/crates/iota-proxy/src/config.rs b/crates/iota-proxy/src/config.rs new file mode 100644 index 00000000000..e16304c48be --- /dev/null +++ b/crates/iota-proxy/src/config.rs @@ -0,0 +1,119 @@ +// Copyright (c) Mysten Labs, Inc. +// Modifications Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +use core::time::Duration; +use std::net::SocketAddr; + +use anyhow::{Context, Result}; +use serde::{Deserialize, Serialize, de::DeserializeOwned}; +use serde_with::{DurationSeconds, serde_as}; +use tracing::debug; + +#[serde_as] +#[derive(Clone, Debug, Deserialize, Serialize)] +#[serde(rename_all = "kebab-case")] +pub struct ProxyConfig { + pub network: String, + pub listen_address: SocketAddr, + pub remote_write: RemoteWriteConfig, + pub dynamic_peers: DynamicPeerValidationConfig, + pub static_peers: Option, + pub metrics_address: String, + pub histogram_address: String, +} + +#[serde_as] +#[derive(Clone, Debug, Deserialize, Serialize, Default)] +#[serde(rename_all = "kebab-case")] +pub struct RemoteWriteConfig { + // TODO upgrade to https + /// the remote_write url to post data to + pub url: String, + /// username is used for posting data to the remote_write api + pub username: String, + pub password: String, + + /// Sets the maximum idle connection per host allowed in the pool. + /// + #[serde(default = "pool_max_idle_per_host_default")] + pub pool_max_idle_per_host: usize, +} + +/// DynamicPeerValidationConfig controls what iota-node & iota-bridge binaries +/// that are functioning as a validator that we'll speak with. Peer in this case +/// is peers within the consensus committee, for each epoch. This membership is +/// determined dynamically for each epoch via json-rpc calls to a full node. +#[serde_as] +#[derive(Clone, Debug, Deserialize, Serialize)] +#[serde(rename_all = "kebab-case")] +pub struct DynamicPeerValidationConfig { + /// url is the json-rpc url we use to obtain valid peers on the blockchain + pub url: String, + #[serde_as(as = "DurationSeconds")] + pub interval: Duration, + /// if certificate_file and private_key are not provided, we'll create a + /// self-signed cert using this hostname + #[serde(default = "hostname_default")] + pub hostname: Option, + + /// incoming client connections to this proxy will be presented with this + /// pub key please use an absolute path + pub certificate_file: Option, + /// private key for tls + /// please use an absolute path + pub private_key: Option, +} + +/// StaticPeerValidationConfig, unlike the DynamicPeerValidationConfig, is not +/// determined dynamically from rpc calls. It instead searches a local +/// directory for pub keys that we will add to an allow list. +#[serde_as] +#[derive(Clone, Debug, Deserialize, Serialize)] +#[serde(rename_all = "kebab-case")] +pub struct StaticPeerValidationConfig { + pub pub_keys: Vec, +} + +/// StaticPubKey holds a human friendly name, ip and the key file for the pub +/// key if you don't have a valid public routable ip, use an ip from +/// 169.254.0.0/16. +#[serde_as] +#[derive(Clone, Debug, Deserialize, Serialize)] +#[serde(rename_all = "kebab-case")] +pub struct StaticPubKey { + /// friendly name we will see in metrics + pub name: String, + /// the peer_id from a node config file (Ed25519 PublicKey) + pub peer_id: String, +} + +/// the default idle worker per host (reqwest to remote write url call) +fn pool_max_idle_per_host_default() -> usize { + 8 +} + +/// the default hostname we will use if not provided +fn hostname_default() -> Option { + Some("localhost".to_string()) +} + +/// load our config file from a path +pub fn load, T: DeserializeOwned + Serialize>(path: P) -> Result { + let path = path.as_ref(); + debug!("Reading config from {:?}", path); + Ok(serde_yaml::from_reader( + std::fs::File::open(path).context(format!("cannot open {:?}", path))?, + )?) +} + +#[cfg(test)] +mod tests { + use super::*; + #[test] + fn config_load() { + const TEMPLATE: &str = include_str!("./data/config.yaml"); + + let _template: ProxyConfig = serde_yaml::from_str(TEMPLATE).unwrap(); + } +} diff --git a/crates/iota-proxy/src/consumer.rs b/crates/iota-proxy/src/consumer.rs new file mode 100644 index 00000000000..bc336f58021 --- /dev/null +++ b/crates/iota-proxy/src/consumer.rs @@ -0,0 +1,377 @@ +// Copyright (c) Mysten Labs, Inc. +// Modifications Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +use std::io::Read; + +use anyhow::Result; +use axum::{body::Bytes, http::StatusCode}; +use bytes::buf::Reader; +use fastcrypto::ed25519::Ed25519PublicKey; +use multiaddr::Multiaddr; +use once_cell::sync::Lazy; +use prometheus::{ + Counter, CounterVec, HistogramVec, + proto::{self, MetricFamily}, + register_counter, register_counter_vec, register_histogram_vec, +}; +use prost::Message; +use protobuf::CodedInputStream; +use tracing::{debug, error}; + +use crate::{admin::ReqwestClient, prom_to_mimir::Mimir, remote_write::WriteRequest}; + +static CONSUMER_OPS_SUBMITTED: Lazy = Lazy::new(|| { + register_counter!( + "consumer_operations_submitted", + "Operations counter for the number of metric family types we submit, excluding histograms, and not the discrete timeseries counts.", + ) + .unwrap() +}); +static CONSUMER_OPS: Lazy = Lazy::new(|| { + register_counter_vec!( + "consumer_operations", + "Operations counters and status from operations performed in the consumer.", + &["operation", "status"] + ) + .unwrap() +}); +static CONSUMER_ENCODE_COMPRESS_DURATION: Lazy = Lazy::new(|| { + register_histogram_vec!( + "protobuf_compression_seconds", + "The time it takes to compress a remote_write payload in seconds.", + &["operation"], + vec![ + 1e-08, 2e-08, 4e-08, 8e-08, 1.6e-07, 3.2e-07, 6.4e-07, 1.28e-06, 2.56e-06, 5.12e-06, + 1.024e-05, 2.048e-05, 4.096e-05, 8.192e-05 + ], + ) + .unwrap() +}); +static CONSUMER_OPERATION_DURATION: Lazy = Lazy::new(|| { + register_histogram_vec!( + "consumer_operations_duration_seconds", + "The time it takes to perform various consumer operations in seconds.", + &["operation"], + vec![ + 0.0008, 0.0016, 0.0032, 0.0064, 0.0128, 0.0256, 0.0512, 0.1024, 0.2048, 0.4096, 0.8192, + 1.0, 1.25, 1.5, 1.75, 2.0, 2.25, 2.5, 2.75, 3.0, 3.25, 3.5, 3.75, 4.0, 4.25, 4.5, 4.75, + 5.0, 5.25, 5.5, 5.75, 6.0, 6.25, 6.5, 6.75, 7.0, 7.25, 7.5, 7.75, 8.0, 8.25, 8.5, 8.75, + 9.0, 9.25, 9.5, 9.75, 10.0, 10.25, 10.5, 10.75, 11.0, 11.25, 11.5, 11.75, 12.0, 12.25, + 12.5, 12.75, 13.0, 13.25, 13.5, 13.75, 14.0, 14.25, 14.5, 14.75, 15.0, 15.25, 15.5, + 15.75, 16.0, 16.25, 16.5, 16.75, 17.0, 17.25, 17.5, 17.75, 18.0, 18.25, 18.5, 18.75, + 19.0, 19.25, 19.5, 19.75, 20.0, 20.25, 20.5, 20.75, 21.0, 21.25, 21.5, 21.75, 22.0, + 22.25, 22.5, 22.75, 23.0, 23.25, 23.5, 23.75, 24.0, 24.25, 24.5, 24.75, 25.0, 26.0, + 27.0, 28.0, 29.0, 30.0 + ], + ) + .unwrap() +}); + +/// NodeMetric holds metadata and a metric payload from the calling node +#[derive(Debug)] +pub struct NodeMetric { + pub peer_addr: Multiaddr, // the sockaddr source address from the incoming request + pub public_key: Ed25519PublicKey, // the public key from the iota blockchain + pub data: Vec, // decoded protobuf of prometheus data +} + +/// The ProtobufDecoder will decode message delimited protobuf messages from +/// prom_model.proto types They are delimited by size, eg a format is such: +/// []byte{size, data, size, data, size, data}, etc etc +pub struct ProtobufDecoder { + buf: Reader, +} + +impl ProtobufDecoder { + pub fn new(buf: Reader) -> Self { + Self { buf } + } + /// parse a delimited buffer of protobufs. this is used to consume data sent + /// from a iota-node + pub fn parse(&mut self) -> Result> { + let timer = CONSUMER_OPERATION_DURATION + .with_label_values(&["decode_len_delim_protobuf"]) + .start_timer(); + let mut result: Vec = vec![]; + while !self.buf.get_ref().is_empty() { + let len = { + let mut is = CodedInputStream::from_buffered_reader(&mut self.buf); + is.read_raw_varint32() + }?; + let mut buf = vec![0; len as usize]; + self.buf.read_exact(&mut buf)?; + result.push(T::parse_from_bytes(&buf)?); + } + timer.observe_duration(); + Ok(result) + } +} + +// populate labels in place for our given metric family data +pub fn populate_labels( + name: String, // host field for grafana agent (from chain data) + network: String, // network name from ansible (via config) + data: Vec, +) -> Vec { + let timer = CONSUMER_OPERATION_DURATION + .with_label_values(&["populate_labels"]) + .start_timer(); + debug!("received metrics from {name}"); + // proto::LabelPair doesn't have pub fields so we can't use + // struct literals to construct + let mut network_label = proto::LabelPair::default(); + network_label.set_name("network".into()); + network_label.set_value(network); + + let mut host_label = proto::LabelPair::default(); + host_label.set_name("host".into()); + host_label.set_value(name); + + let labels = vec![network_label, host_label]; + + let mut data = data; + // add our extra labels to our incoming metric data + for mf in data.iter_mut() { + for m in mf.mut_metric() { + m.mut_label().extend(labels.clone()); + } + } + timer.observe_duration(); + data +} + +fn encode_compress(request: &WriteRequest) -> Result, (StatusCode, &'static str)> { + let observe = || { + let timer = CONSUMER_ENCODE_COMPRESS_DURATION + .with_label_values(&["encode_compress"]) + .start_timer(); + || { + timer.observe_duration(); + } + }(); + let mut buf = Vec::with_capacity(request.encoded_len()); + if request.encode(&mut buf).is_err() { + observe(); + CONSUMER_OPS + .with_label_values(&["encode_compress", "failed"]) + .inc(); + error!("unable to encode prompb to mimirpb"); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + "unable to encode prompb to remote_write pb", + )); + }; + + let mut s = snap::raw::Encoder::new(); + let compressed = match s.compress_vec(&buf) { + Ok(compressed) => compressed, + Err(error) => { + observe(); + CONSUMER_OPS + .with_label_values(&["encode_compress", "failed"]) + .inc(); + error!("unable to compress to snappy block format; {error}"); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + "unable to compress to snappy block format", + )); + } + }; + observe(); + CONSUMER_OPS + .with_label_values(&["encode_compress", "success"]) + .inc(); + Ok(compressed) +} + +async fn check_response( + request: WriteRequest, + response: reqwest::Response, +) -> Result<(), (StatusCode, &'static str)> { + match response.status() { + reqwest::StatusCode::OK => { + CONSUMER_OPS + .with_label_values(&["check_response", "OK"]) + .inc(); + debug!("({}) SUCCESS: {:?}", reqwest::StatusCode::OK, request); + Ok(()) + } + reqwest::StatusCode::BAD_REQUEST => { + let body = response + .text() + .await + .unwrap_or_else(|_| "response body cannot be decoded".into()); + + // see mimir docs on this error condition. it's not actionable from the proxy + // so we drop it. + if body.contains("err-mimir-sample-out-of-order") { + CONSUMER_OPS + .with_label_values(&["check_response", "BAD_REQUEST"]) + .inc(); + error!("({}) ERROR: {:?}", reqwest::StatusCode::BAD_REQUEST, body); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + "IGNORING METRICS due to err-mimir-sample-out-of-order", + )); + } + CONSUMER_OPS + .with_label_values(&["check_response", "INTERNAL_SERVER_ERROR"]) + .inc(); + error!("({}) ERROR: {:?}", reqwest::StatusCode::BAD_REQUEST, body); + Err(( + StatusCode::INTERNAL_SERVER_ERROR, + "unknown bad request error encountered in remote_push", + )) + } + code => { + let body = response + .text() + .await + .unwrap_or_else(|_| "response body cannot be decoded".into()); + CONSUMER_OPS + .with_label_values(&["check_response", "INTERNAL_SERVER_ERROR"]) + .inc(); + error!("({}) ERROR: {:?}", code, body); + Err(( + StatusCode::INTERNAL_SERVER_ERROR, + "unknown error encountered in remote_push", + )) + } + } +} + +async fn convert( + mfs: Vec, +) -> Result, (StatusCode, &'static str)> { + let result = tokio::task::spawn_blocking(|| { + let timer = CONSUMER_OPERATION_DURATION + .with_label_values(&["convert_to_remote_write_task"]) + .start_timer(); + let result = Mimir::from(mfs); + timer.observe_duration(); + result.into_iter() + }) + .await; + + let result = match result { + Ok(v) => v, + Err(err) => { + error!("unable to convert to remote_write; {err}"); + return Err(( + StatusCode::INTERNAL_SERVER_ERROR, + "DROPPING METRICS; unable to convert to remote_write", + )); + } + }; + Ok(result) +} + +/// convert_to_remote_write is an expensive method due to the time it takes to +/// submit to mimir. other operations here are optimized for async, within +/// reason. The post process uses a single connection to mimir and thus incurs +/// the seriliaztion delay for each metric family sent. Possible +/// future optimizations would be to use multiple tcp connections to mimir, +/// within reason. Nevertheless we await on each post of each metric family so +/// it shouldn't block any other async work in a significant way. +pub async fn convert_to_remote_write( + rc: ReqwestClient, + node_metric: NodeMetric, +) -> (StatusCode, &'static str) { + let timer = CONSUMER_OPERATION_DURATION + .with_label_values(&["convert_to_remote_write"]) + .start_timer(); + + let remote_write_protos = match convert(node_metric.data).await { + Ok(v) => v, + Err(err) => { + timer.stop_and_discard(); + return err; + } + }; + + // a counter so we don't iterate the node data 2x + let mut mf_cnt = 0; + for request in remote_write_protos { + mf_cnt += 1; + let compressed = match encode_compress(&request) { + Ok(compressed) => compressed, + Err(error) => return error, + }; + + let response = match rc + .client + .post(rc.settings.url.to_owned()) + .header(reqwest::header::CONTENT_ENCODING, "snappy") + .header(reqwest::header::CONTENT_TYPE, "application/x-protobuf") + .header("X-Prometheus-Remote-Write-Version", "0.1.0") + .basic_auth( + rc.settings.username.to_owned(), + Some(rc.settings.password.to_owned()), + ) + .body(compressed) + .send() + .await + { + Ok(response) => response, + Err(error) => { + CONSUMER_OPS + .with_label_values(&["check_response", "INTERNAL_SERVER_ERROR"]) + .inc(); + error!("DROPPING METRICS due to post error: {error}"); + timer.stop_and_discard(); + return ( + StatusCode::INTERNAL_SERVER_ERROR, + "DROPPING METRICS due to post error", + ); + } + }; + + match check_response(request, response).await { + Ok(_) => (), + Err(err) => { + timer.stop_and_discard(); + return err; + } + } + } + CONSUMER_OPS_SUBMITTED.inc_by(mf_cnt as f64); + timer.observe_duration(); + (StatusCode::CREATED, "created") +} + +#[cfg(test)] +mod tests { + use prometheus::proto; + use protobuf; + + use crate::{ + consumer::populate_labels, + prom_to_mimir::tests::{ + create_histogram, create_labels, create_metric_family, create_metric_histogram, + }, + }; + + #[test] + fn test_populate_labels() { + let mf = create_metric_family( + "test_histogram", + "i'm a help message", + Some(proto::MetricType::HISTOGRAM), + protobuf::RepeatedField::from(vec![create_metric_histogram( + protobuf::RepeatedField::from_vec(create_labels(vec![])), + create_histogram(), + )]), + ); + + let labeled_mf = populate_labels("validator-0".into(), "unittest-network".into(), vec![mf]); + let metric = &labeled_mf[0].get_metric()[0]; + assert_eq!( + metric.get_label(), + &create_labels(vec![ + ("network", "unittest-network"), + ("host", "validator-0"), + ]) + ); + } +} diff --git a/crates/iota-proxy/src/data/config.yaml b/crates/iota-proxy/src/data/config.yaml new file mode 100644 index 00000000000..a5265bd44fb --- /dev/null +++ b/crates/iota-proxy/src/data/config.yaml @@ -0,0 +1,18 @@ +network: joenet +listen-address: 127.0.0.1:8080 +remote-write: + url: http://unittest.abcd.io/api/v1/push + username: foo + password: fooman +dynamic-peers: + url: http://127.0.0.1:9000 + interval: 30 + certificate-file: /opt/joeman/fullchain.pem + private-key: /opt/joeman/privkey.pem +static-peers: + pub-keys: + - name: joeman + p2p-address: 169.254.0.1 + peer-id: 4e2f113e61784fdcd611650f36595db8f79e9420319f42a5b571dc2f2b295af2 +metrics-address: localhost:9184 +histogram-address: localhost:9185 diff --git a/crates/iota-proxy/src/handlers.rs b/crates/iota-proxy/src/handlers.rs new file mode 100644 index 00000000000..8c1ef98d23e --- /dev/null +++ b/crates/iota-proxy/src/handlers.rs @@ -0,0 +1,72 @@ +// Copyright (c) Mysten Labs, Inc. +// Modifications Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +use std::net::SocketAddr; + +use axum::{ + extract::{ConnectInfo, Extension}, + http::StatusCode, +}; +use multiaddr::Multiaddr; +use once_cell::sync::Lazy; +use prometheus::{CounterVec, HistogramVec, register_counter_vec, register_histogram_vec}; + +use crate::{ + admin::{Labels, ReqwestClient}, + consumer::{NodeMetric, convert_to_remote_write, populate_labels}, + histogram_relay::HistogramRelay, + middleware::LenDelimProtobuf, + peers::IotaPeer, +}; + +static HANDLER_HITS: Lazy = Lazy::new(|| { + register_counter_vec!("http_handler_hits", "Number of HTTP requests made.", &[ + "handler", "remote" + ]) + .unwrap() +}); + +static HTTP_HANDLER_DURATION: Lazy = Lazy::new(|| { + register_histogram_vec!( + "http_handler_duration_seconds", + "The HTTP request latencies in seconds.", + &["handler", "remote"], + vec![ + 1.0, 1.25, 1.5, 1.75, 2.0, 2.25, 2.5, 2.75, 3.0, 3.25, 3.5, 3.75, 4.0, 4.25, 4.5, 4.75, + 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0 + ], + ) + .unwrap() +}); + +/// Publish handler which receives metrics from nodes. Nodes will call us at +/// this endpoint and we relay them to the upstream tsdb +/// +/// Clients will receive a response after successfully relaying the metrics +/// upstream +pub async fn publish_metrics( + Extension(labels): Extension, + Extension(client): Extension, + ConnectInfo(addr): ConnectInfo, + Extension(IotaPeer { name, public_key }): Extension, + Extension(relay): Extension, + LenDelimProtobuf(data): LenDelimProtobuf, +) -> (StatusCode, &'static str) { + HANDLER_HITS + .with_label_values(&["publish_metrics", &name]) + .inc(); + let timer = HTTP_HANDLER_DURATION + .with_label_values(&["publish_metrics", &name]) + .start_timer(); + let data = populate_labels(name, labels.network, data); + relay.submit(data.clone()); + let response = convert_to_remote_write(client.clone(), NodeMetric { + data, + peer_addr: Multiaddr::from(addr.ip()), + public_key, + }) + .await; + timer.observe_duration(); + response +} diff --git a/crates/iota-proxy/src/histogram_relay.rs b/crates/iota-proxy/src/histogram_relay.rs new file mode 100644 index 00000000000..27bb9559d6a --- /dev/null +++ b/crates/iota-proxy/src/histogram_relay.rs @@ -0,0 +1,266 @@ +// Copyright (c) Mysten Labs, Inc. +// Modifications Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +use std::{ + collections::VecDeque, + net::TcpListener, + sync::{Arc, Mutex}, + time::{SystemTime, UNIX_EPOCH}, +}; + +use anyhow::{Result, bail}; +use axum::{Router, extract::Extension, http::StatusCode, routing::get}; +use once_cell::sync::Lazy; +use prometheus::{ + CounterVec, HistogramVec, + proto::{Metric, MetricFamily}, + register_counter_vec, register_histogram_vec, +}; +use tower::ServiceBuilder; +use tower_http::{ + LatencyUnit, + trace::{DefaultOnResponse, TraceLayer}, +}; +use tracing::{Level, info}; + +use crate::var; + +const METRICS_ROUTE: &str = "/metrics"; + +static RELAY_PRESSURE: Lazy = Lazy::new(|| { + register_counter_vec!( + "relay_pressure", + "HistogramRelay's number of metric families submitted, exported, overflowed to/from the queue.", + &["histogram_relay"] + ) + .unwrap() +}); +static RELAY_DURATION: Lazy = Lazy::new(|| { + register_histogram_vec!( + "relay_duration_seconds", + "HistogramRelay's submit/export fn latencies in seconds.", + &["histogram_relay"], + vec![ + 0.0008, 0.0016, 0.0032, 0.0064, 0.0128, 0.0256, 0.0512, 0.1024, 0.2048, 0.4096, 0.8192, + 1.0, 1.25, 1.5, 1.75, 2.0, 4.0, 8.0, 10.0, 12.5, 15.0 + ], + ) + .unwrap() +}); + +// Creates a new http server that has as a sole purpose to expose +// and endpoint that prometheus agent can use to poll for the metrics. +// A RegistryService is returned that can be used to get access in prometheus +// Registries. +pub fn start_prometheus_server(listener: TcpListener) -> HistogramRelay { + let relay = HistogramRelay::new(); + let app = Router::new() + .route(METRICS_ROUTE, get(metrics)) + .layer(Extension(relay.clone())) + .layer( + ServiceBuilder::new().layer( + TraceLayer::new_for_http().on_response( + DefaultOnResponse::new() + .level(Level::INFO) + .latency_unit(LatencyUnit::Seconds), + ), + ), + ); + + tokio::spawn(async move { + listener.set_nonblocking(true).unwrap(); + let listener = tokio::net::TcpListener::from_std(listener).unwrap(); + axum::serve(listener, app).await.unwrap(); + }); + relay +} + +async fn metrics(Extension(relay): Extension) -> (StatusCode, String) { + let Ok(expformat) = relay.export() else { + return ( + StatusCode::INTERNAL_SERVER_ERROR, + "unable to pop metrics from HistogramRelay".into(), + ); + }; + (StatusCode::OK, expformat) +} + +struct Wrapper(i64, Vec); + +#[derive(Clone)] +pub struct HistogramRelay(Arc>>); + +impl Default for HistogramRelay { + fn default() -> Self { + HistogramRelay(Arc::new(Mutex::new(VecDeque::new()))) + } +} +impl HistogramRelay { + pub fn new() -> Self { + Self::default() + } + /// submit will take metric family submissions and store them for scraping + /// in doing so, it will also wrap each entry in a timestamp which will be + /// use for pruning old entries on each submission call. this may not be + /// ideal long term. + pub fn submit(&self, data: Vec) { + RELAY_PRESSURE.with_label_values(&["submit"]).inc(); + let timer = RELAY_DURATION.with_label_values(&["submit"]).start_timer(); + // represents a collection timestamp + let timestamp_secs = SystemTime::now() + .duration_since(UNIX_EPOCH) + .unwrap() + .as_secs() as i64; + let mut queue = self + .0 + .lock() + .expect("couldn't get mut lock on HistogramRelay"); + queue.retain(|v| { + // 5 mins is the max time in the queue allowed + if (timestamp_secs - v.0) < var!("MAX_QUEUE_TIME_SECS", 300) { + return true; + } + RELAY_PRESSURE.with_label_values(&["overflow"]).inc(); + false + }); // drain anything 5 mins or older + + // filter out our histograms from normal metrics + let data: Vec = extract_histograms(data).collect(); + RELAY_PRESSURE + .with_label_values(&["submitted"]) + .inc_by(data.len() as f64); + queue.push_back(Wrapper(timestamp_secs, data)); + timer.observe_duration(); + } + pub fn export(&self) -> Result { + RELAY_PRESSURE.with_label_values(&["export"]).inc(); + let timer = RELAY_DURATION.with_label_values(&["export"]).start_timer(); + // totally drain all metrics whenever we get a scrape request from the metrics + // handler + let mut queue = self + .0 + .lock() + .expect("couldn't get mut lock on HistogramRelay"); + + let data: Vec = queue.drain(..).collect(); + let mut histograms = vec![]; + for mf in data { + histograms.extend(mf.1); + } + info!( + "histogram queue drained {} items; remaining count {}", + histograms.len(), + queue.len() + ); + + let encoder = prometheus::TextEncoder::new(); + let string = match encoder.encode_to_string(&histograms) { + Ok(s) => s, + Err(error) => bail!("{error}"), + }; + RELAY_PRESSURE + .with_label_values(&["exported"]) + .inc_by(histograms.len() as f64); + timer.observe_duration(); + Ok(string) + } +} + +fn extract_histograms(data: Vec) -> impl Iterator { + data.into_iter().filter_map(|mf| { + let metrics = mf.get_metric().iter().filter_map(|m| { + if !m.has_histogram() { + return None; + } + let mut v = Metric::default(); + v.set_label(protobuf::RepeatedField::from_slice(m.get_label())); + v.set_histogram(m.get_histogram().to_owned()); + v.set_timestamp_ms(m.get_timestamp_ms()); + Some(v) + }); + + let only_histograms = protobuf::RepeatedField::from_iter(metrics); + if only_histograms.len() == 0 { + return None; + } + + let mut v = MetricFamily::default(); + v.set_name(mf.get_name().to_owned()); + v.set_help(mf.get_help().to_owned()); + v.set_field_type(mf.get_field_type()); + v.set_metric(only_histograms); + Some(v) + }) +} + +#[cfg(test)] +mod tests { + use prometheus::proto; + use protobuf; + + use crate::{ + histogram_relay::extract_histograms, + prom_to_mimir::tests::{ + create_counter, create_histogram, create_labels, create_metric_counter, + create_metric_family, create_metric_histogram, + }, + }; + + #[test] + fn filter_histograms() { + struct Test { + data: Vec, + expected: Vec, + } + + let tests = vec![ + Test { + data: vec![create_metric_family( + "test_counter", + "i'm a help message", + Some(proto::MetricType::GAUGE), + protobuf::RepeatedField::from(vec![create_metric_counter( + protobuf::RepeatedField::from_vec(create_labels(vec![ + ("host", "local-test-validator"), + ("network", "unittest-network"), + ])), + create_counter(2046.0), + )]), + )], + expected: vec![], + }, + Test { + data: vec![create_metric_family( + "test_histogram", + "i'm a help message", + Some(proto::MetricType::HISTOGRAM), + protobuf::RepeatedField::from(vec![create_metric_histogram( + protobuf::RepeatedField::from_vec(create_labels(vec![ + ("host", "local-test-validator"), + ("network", "unittest-network"), + ])), + create_histogram(), + )]), + )], + expected: vec![create_metric_family( + "test_histogram", + "i'm a help message", + Some(proto::MetricType::HISTOGRAM), + protobuf::RepeatedField::from(vec![create_metric_histogram( + protobuf::RepeatedField::from_vec(create_labels(vec![ + ("host", "local-test-validator"), + ("network", "unittest-network"), + ])), + create_histogram(), + )]), + )], + }, + ]; + + for test in tests { + let extracted: Vec = extract_histograms(test.data).collect(); + assert_eq!(extracted, test.expected); + } + } +} diff --git a/crates/iota-proxy/src/lib.rs b/crates/iota-proxy/src/lib.rs new file mode 100644 index 00000000000..268c0b59982 --- /dev/null +++ b/crates/iota-proxy/src/lib.rs @@ -0,0 +1,323 @@ +// Copyright (c) Mysten Labs, Inc. +// Modifications Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +pub mod admin; +pub mod config; +pub mod consumer; +pub mod handlers; +pub mod histogram_relay; +pub mod metrics; +pub mod middleware; +pub mod peers; +pub mod prom_to_mimir; +pub mod remote_write; + +/// var extracts environment variables at runtime with a default fallback value +/// if a default is not provided, the value is simply an empty string if not +/// found This function will return the provided default if env::var cannot find +/// the key or if the key is somehow malformed. +#[macro_export] +macro_rules! var { + ($key:expr) => { + match std::env::var($key) { + Ok(val) => val, + Err(_) => "".into(), + } + }; + ($key:expr, $default:expr) => { + match std::env::var($key) { + Ok(val) => val.parse::<_>().unwrap(), + Err(_) => $default, + } + }; +} + +#[cfg(test)] +mod tests { + use std::{net::TcpListener, time::Duration}; + + use axum::{Router, http::StatusCode, routing::post}; + use iota_tls::{ClientCertVerifier, TlsAcceptor}; + use prometheus::{Encoder, PROTOBUF_FORMAT}; + use protobuf::RepeatedField; + + use super::*; + use crate::{ + admin::{CertKeyPair, Labels}, + config::RemoteWriteConfig, + histogram_relay::HistogramRelay, + peers::IotaNodeProvider, + prom_to_mimir::tests::*, + }; + + async fn run_dummy_remote_write(listener: TcpListener) { + /// i accept everything, send me the trash + async fn handler() -> StatusCode { + StatusCode::OK + } + + // build our application with a route + let app = Router::new().route("/v1/push", post(handler)); + + // run it + listener.set_nonblocking(true).unwrap(); + let listener = tokio::net::TcpListener::from_std(listener).unwrap(); + axum::serve(listener, app).await.unwrap(); + } + + async fn run_dummy_remote_write_very_slow(listener: TcpListener) { + /// i accept everything, send me the trash, but i will sleep and never + /// return before a timeout this is for testing slow clients and + /// this is the easiest way to do so without adding a special + /// route in the server to do so + async fn handler() -> StatusCode { + // Simulate a route that hangs while waiting for a client to send data + // but the server itself doesn't delay its processing + tokio::time::sleep(Duration::from_secs(60)).await; // A very long sleep + StatusCode::OK + } + + // build our application with a route + let app = Router::new().route("/v1/push", post(handler)); + + // run it + listener.set_nonblocking(true).unwrap(); + let listener = tokio::net::TcpListener::from_std(listener).unwrap(); + axum::serve(listener, app).await.unwrap(); + } + + /// test_axum_acceptor is a basic e2e test that creates a mock remote_write + /// post endpoint and has a simple iota-node client that posts data to + /// the proxy using the protobuf format. The server processes this data + /// and sends it to the mock remote_write which accepts everything. Future + /// work is to make this more robust and expand the scope of coverage, + /// probabaly moving this test elsewhere and renaming it. + #[tokio::test] + async fn test_axum_acceptor() { + // generate self-signed certificates + let CertKeyPair(client_priv_cert, client_pub_key) = + admin::generate_self_cert("iota".into()); + let CertKeyPair(server_priv_cert, _) = admin::generate_self_cert("localhost".into()); + + // create a fake rpc server + let dummy_remote_write_listener = std::net::TcpListener::bind("localhost:0").unwrap(); + let dummy_remote_write_address = dummy_remote_write_listener.local_addr().unwrap(); + let dummy_remote_write_url = format!( + "http://localhost:{}/v1/push", + dummy_remote_write_address.port() + ); + + let _dummy_remote_write = + tokio::spawn(async move { run_dummy_remote_write(dummy_remote_write_listener).await }); + + // init the tls config and allower + let mut allower = IotaNodeProvider::new("".into(), Duration::from_secs(30), vec![]); + let tls_config = ClientCertVerifier::new( + allower.clone(), + iota_tls::IOTA_VALIDATOR_SERVER_NAME.to_string(), + ) + .rustls_server_config( + vec![server_priv_cert.rustls_certificate()], + server_priv_cert.rustls_private_key(), + ) + .unwrap(); + + let client = admin::make_reqwest_client( + RemoteWriteConfig { + url: dummy_remote_write_url.to_owned(), + username: "bar".into(), + password: "foo".into(), + ..Default::default() + }, + "dummy user agent", + ); + + let app = admin::app( + Labels { + network: "unittest-network".into(), + }, + client, + HistogramRelay::new(), + Some(allower.clone()), + ); + + let listener = std::net::TcpListener::bind("localhost:0").unwrap(); + let server_address = listener.local_addr().unwrap(); + let server_url = format!( + "https://localhost:{}/publish/metrics", + server_address.port() + ); + + let acceptor = TlsAcceptor::new(tls_config); + let _server = tokio::spawn(async move { + admin::server(listener, app, Some(acceptor)).await.unwrap(); + }); + + // build a client + let client = reqwest::Client::builder() + .add_root_certificate(server_priv_cert.reqwest_certificate()) + .identity(client_priv_cert.reqwest_identity()) + .https_only(true) + .build() + .unwrap(); + + // Client request is rejected because it isn't in the allowlist + client.get(&server_url).send().await.unwrap_err(); + + // Insert the client's public key into the allowlist and verify the request is + // successful + allower + .get_mut() + .write() + .unwrap() + .insert(client_pub_key.to_owned(), peers::IotaPeer { + name: "some-node".into(), + public_key: client_pub_key.to_owned(), + }); + + let mf = create_metric_family( + "foo_metric", + "some help this is", + None, + RepeatedField::from_vec(vec![create_metric_counter( + RepeatedField::from_vec(create_labels(vec![("some", "label")])), + create_counter(2046.0), + )]), + ); + + let mut buf = vec![]; + let encoder = prometheus::ProtobufEncoder::new(); + encoder.encode(&[mf], &mut buf).unwrap(); + + let res = client + .post(&server_url) + .header(reqwest::header::CONTENT_TYPE, PROTOBUF_FORMAT) + .body(buf) + .send() + .await + .expect("expected a successful post with a self-signed certificate"); + let status = res.status(); + let body = res.text().await.unwrap(); + assert_eq!("created", body); + assert_eq!(status, reqwest::StatusCode::CREATED); + } + + /// this is a long test to ensure we are timing out clients that are slow + #[tokio::test] + async fn test_client_timeout() { + // generate self-signed certificates + let CertKeyPair(client_priv_cert, client_pub_key) = + admin::generate_self_cert("iota".into()); + let CertKeyPair(server_priv_cert, _) = admin::generate_self_cert("localhost".into()); + + // create a fake rpc server + let dummy_remote_write_listener = std::net::TcpListener::bind("localhost:0").unwrap(); + let dummy_remote_write_address = dummy_remote_write_listener.local_addr().unwrap(); + let dummy_remote_write_url = format!( + "http://localhost:{}/v1/push", + dummy_remote_write_address.port() + ); + + let _dummy_remote_write = tokio::spawn(async move { + run_dummy_remote_write_very_slow(dummy_remote_write_listener).await + }); + + // init the tls config and allower + let mut allower = IotaNodeProvider::new("".into(), Duration::from_secs(30), vec![]); + let tls_config = ClientCertVerifier::new( + allower.clone(), + iota_tls::IOTA_VALIDATOR_SERVER_NAME.to_string(), + ) + .rustls_server_config( + vec![server_priv_cert.rustls_certificate()], + server_priv_cert.rustls_private_key(), + ) + .unwrap(); + + let client = admin::make_reqwest_client( + RemoteWriteConfig { + url: dummy_remote_write_url.to_owned(), + username: "bar".into(), + password: "foo".into(), + ..Default::default() + }, + "dummy user agent", + ); + + // this will affect other tests if they are run in parallel, but we only have + // two tests, so it shouldn't be an issue (yet) even still, the other + // tests complete very fast so those tests would also need to slow down by + // orders and orders to be bothered by this env var + std::env::set_var("NODE_CLIENT_TIMEOUT", "5"); + + let app = admin::app( + Labels { + network: "unittest-network".into(), + }, + client, + HistogramRelay::new(), + Some(allower.clone()), + ); + + let listener = std::net::TcpListener::bind("localhost:0").unwrap(); + let server_address = listener.local_addr().unwrap(); + let server_url = format!( + "https://localhost:{}/publish/metrics", + server_address.port() + ); + + let acceptor = TlsAcceptor::new(tls_config); + let _server = tokio::spawn(async move { + admin::server(listener, app, Some(acceptor)).await.unwrap(); + }); + + // build a client + let client = reqwest::Client::builder() + .add_root_certificate(server_priv_cert.reqwest_certificate()) + .identity(client_priv_cert.reqwest_identity()) + .https_only(true) + .build() + .unwrap(); + + // Client request is rejected because it isn't in the allowlist + client.get(&server_url).send().await.unwrap_err(); + + // Insert the client's public key into the allowlist and verify the request is + // successful + allower + .get_mut() + .write() + .unwrap() + .insert(client_pub_key.to_owned(), peers::IotaPeer { + name: "some-node".into(), + public_key: client_pub_key.to_owned(), + }); + + let mf = create_metric_family( + "foo_metric", + "some help this is", + None, + RepeatedField::from_vec(vec![create_metric_counter( + RepeatedField::from_vec(create_labels(vec![("some", "label")])), + create_counter(2046.0), + )]), + ); + + let mut buf = vec![]; + let encoder = prometheus::ProtobufEncoder::new(); + encoder.encode(&[mf], &mut buf).unwrap(); + + let res = client + .post(&server_url) + .header(reqwest::header::CONTENT_TYPE, PROTOBUF_FORMAT) + .body(buf) + .send() + .await + .expect("expected a successful post with a self-signed certificate"); + let status = res.status(); + assert_eq!(status, StatusCode::REQUEST_TIMEOUT); + // Clean up the environment variable + std::env::remove_var("NODE_CLIENT_TIMEOUT"); + } +} diff --git a/crates/iota-proxy/src/main.rs b/crates/iota-proxy/src/main.rs new file mode 100644 index 00000000000..68beb3901ef --- /dev/null +++ b/crates/iota-proxy/src/main.rs @@ -0,0 +1,115 @@ +// Copyright (c) Mysten Labs, Inc. +// Modifications Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +use std::env; + +use anyhow::Result; +use clap::Parser; +use iota_proxy::{ + admin::{ + Labels, app, create_server_cert_default_allow, create_server_cert_enforce_peer, + make_reqwest_client, server, + }, + config::{ProxyConfig, load}, + histogram_relay, metrics, +}; +use iota_tls::TlsAcceptor; +use telemetry_subscribers::TelemetryConfig; +use tracing::info; + +// WARNING!!! +// +// Do not move or use similar logic to generate git revision information outside +// of a binary entry point (e.g. main.rs). Placing the below logic into a +// library can result in unessesary builds. +const GIT_REVISION: &str = { + if let Some(revision) = option_env!("GIT_REVISION") { + revision + } else { + git_version::git_version!( + args = ["--always", "--abbrev=12", "--dirty", "--exclude", "*"], + fallback = "DIRTY" + ) + } +}; + +// VERSION mimics what other iota binaries use for the same const +pub const VERSION: &str = const_str::concat!(env!("CARGO_PKG_VERSION"), "-", GIT_REVISION); + +/// user agent we use when posting to mimir +static APP_USER_AGENT: &str = const_str::concat!( + env!("CARGO_PKG_NAME"), + "/", + env!("CARGO_PKG_VERSION"), + "/", + VERSION +); + +#[derive(Parser, Debug)] +#[command(name = env!("CARGO_BIN_NAME"), rename_all = "kebab-case", version = VERSION)] +struct Args { + #[arg( + long, + short, + default_value = "./iota-proxy.yaml", + help = "Specify the config file path to use" + )] + config: String, +} + +#[tokio::main] +async fn main() -> Result<()> { + let (_guard, _handle) = TelemetryConfig::new().init(); + + let args = Args::parse(); + + let config: ProxyConfig = load(args.config)?; + + info!( + "listen on {:?} send to {:?}", + config.listen_address, config.remote_write.url + ); + + let listener = std::net::TcpListener::bind(config.listen_address).unwrap(); + + let (tls_config, allower) = + // we'll only use the dynamic peers in some cases - it makes little sense to run with the static's + // since this first mode allows all. + if config.dynamic_peers.certificate_file.is_none() || config.dynamic_peers.private_key.is_none() { + ( + create_server_cert_default_allow(config.dynamic_peers.hostname.unwrap()) + .expect("unable to create self-signed server cert"), + None, + ) + } else { + create_server_cert_enforce_peer(config.dynamic_peers, config.static_peers) + .expect("unable to create tls server config") + }; + let histogram_listener = std::net::TcpListener::bind(config.histogram_address).unwrap(); + let metrics_listener = std::net::TcpListener::bind(config.metrics_address).unwrap(); + let acceptor = TlsAcceptor::new(tls_config); + let client = make_reqwest_client(config.remote_write, APP_USER_AGENT); + let histogram_relay = histogram_relay::start_prometheus_server(histogram_listener); + let registry_service = metrics::start_prometheus_server(metrics_listener); + let prometheus_registry = registry_service.default_registry(); + prometheus_registry + .register(iota_metrics::uptime_metric( + "iota-proxy", + VERSION, + "unavailable", + )) + .unwrap(); + let app = app( + Labels { + network: config.network, + }, + client, + histogram_relay, + allower, + ); + + server(listener, app, Some(acceptor)).await.unwrap(); + + Ok(()) +} diff --git a/crates/iota-proxy/src/metrics.rs b/crates/iota-proxy/src/metrics.rs new file mode 100644 index 00000000000..ab3f8a73e43 --- /dev/null +++ b/crates/iota-proxy/src/metrics.rs @@ -0,0 +1,128 @@ +// Copyright (c) Mysten Labs, Inc. +// Modifications Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +use std::{ + net::TcpListener, + sync::{Arc, RwLock}, +}; + +use axum::{Router, extract::Extension, http::StatusCode, routing::get}; +use iota_metrics::RegistryService; +use prometheus::{Registry, TextEncoder}; +use tower::ServiceBuilder; +use tower_http::{ + LatencyUnit, + trace::{DefaultOnResponse, TraceLayer}, +}; +use tracing::Level; + +const METRICS_ROUTE: &str = "/metrics"; +const POD_HEALTH_ROUTE: &str = "/pod_health"; + +type HealthCheckMetrics = Arc>; + +/// Do not access struct members without using HealthCheckMetrics to arc+mutex +#[derive(Debug)] +struct HealthCheck { + // eg; consumer_operations_submitted{...} + consumer_operations_submitted: f64, +} + +/// HealthCheck contains fields we believe are interesting that say whether this +/// pod should be considered health. do not use w/o using an arc+mutex +impl HealthCheck { + fn new() -> Self { + Self { + consumer_operations_submitted: 0.0, + } + } +} + +// Creates a new http server that has as a sole purpose to expose +// and endpoint that prometheus agent can use to poll for the metrics. +// A RegistryService is returned that can be used to get access in prometheus +// Registries. +pub fn start_prometheus_server(listener: TcpListener) -> RegistryService { + let registry = Registry::new(); + + let registry_service = RegistryService::new(registry); + + let pod_health_data = Arc::new(RwLock::new(HealthCheck::new())); + + let app = Router::new() + .route(METRICS_ROUTE, get(metrics)) + .route(POD_HEALTH_ROUTE, get(pod_health)) + .layer(Extension(registry_service.clone())) + .layer(Extension(pod_health_data.clone())) + .layer( + ServiceBuilder::new().layer( + TraceLayer::new_for_http().on_response( + DefaultOnResponse::new() + .level(Level::INFO) + .latency_unit(LatencyUnit::Seconds), + ), + ), + ); + + tokio::spawn(async move { + listener.set_nonblocking(true).unwrap(); + let listener = tokio::net::TcpListener::from_std(listener).unwrap(); + axum::serve(listener, app).await.unwrap(); + }); + + registry_service +} + +// DO NOT remove this handler, it is not compatible with the +// iota_metrics::metric equivalent +async fn metrics( + Extension(registry_service): Extension, + Extension(pod_health): Extension, +) -> (StatusCode, String) { + let mut metric_families = registry_service.gather_all(); + metric_families.extend(prometheus::gather()); + + if let Some(consumer_operations_submitted) = metric_families + .iter() + .filter_map(|v| { + if v.get_name() == "consumer_operations_submitted" { + // Expecting one metric, so return the first one, as it is the only one + v.get_metric().first().map(|m| m.get_counter().get_value()) + } else { + None + } + }) + .next() + { + pod_health + .write() + .expect("unable to write to pod health metrics") + .consumer_operations_submitted = consumer_operations_submitted; + }; + match TextEncoder.encode_to_string(&metric_families) { + Ok(metrics) => (StatusCode::OK, metrics), + Err(error) => ( + StatusCode::INTERNAL_SERVER_ERROR, + format!("unable to encode metrics: {error}"), + ), + } +} + +/// pod_health is called by k8s to know if this service is correctly processing +/// data +async fn pod_health(Extension(pod_health): Extension) -> (StatusCode, String) { + let consumer_operations_submitted = pod_health + .read() + .expect("unable to read pod health metrics") + .consumer_operations_submitted; + + if consumer_operations_submitted > 0.0 { + (StatusCode::OK, consumer_operations_submitted.to_string()) + } else { + ( + StatusCode::SERVICE_UNAVAILABLE, + consumer_operations_submitted.to_string(), + ) + } +} diff --git a/crates/iota-proxy/src/middleware.rs b/crates/iota-proxy/src/middleware.rs new file mode 100644 index 00000000000..708532c32f9 --- /dev/null +++ b/crates/iota-proxy/src/middleware.rs @@ -0,0 +1,165 @@ +// Copyright (c) Mysten Labs, Inc. +// Modifications Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +use std::sync::Arc; + +use axum::{ + async_trait, + body::{Body, Bytes}, + extract::{Extension, FromRequest}, + http::{Request, StatusCode}, + middleware::Next, + response::Response, +}; +use axum_extra::{ + headers::{ContentLength, ContentType}, + typed_header::TypedHeader, +}; +use bytes::Buf; +use hyper::header::CONTENT_ENCODING; +use iota_tls::TlsConnectionInfo; +use once_cell::sync::Lazy; +use prometheus::{CounterVec, proto::MetricFamily, register_counter_vec}; +use tracing::error; + +use crate::{consumer::ProtobufDecoder, peers::IotaNodeProvider}; + +static MIDDLEWARE_OPS: Lazy = Lazy::new(|| { + register_counter_vec!( + "middleware_operations", + "Operations counters and status for axum middleware.", + &["operation", "status"] + ) + .unwrap() +}); + +static MIDDLEWARE_HEADERS: Lazy = Lazy::new(|| { + register_counter_vec!( + "middleware_headers", + "Operations counters and status for axum middleware.", + &["header", "value"] + ) + .unwrap() +}); + +/// we expect iota-node to send us an http header content-length encoding. +pub async fn expect_content_length( + TypedHeader(content_length): TypedHeader, + request: Request, + next: Next, +) -> Result { + MIDDLEWARE_HEADERS.with_label_values(&["content-length", &format!("{}", content_length.0)]); + Ok(next.run(request).await) +} + +/// we expect iota-node to send us an http header content-type encoding. +pub async fn expect_iota_proxy_header( + TypedHeader(content_type): TypedHeader, + request: Request, + next: Next, +) -> Result { + match format!("{content_type}").as_str() { + prometheus::PROTOBUF_FORMAT => Ok(next.run(request).await), + ct => { + error!("invalid content-type; {ct}"); + MIDDLEWARE_OPS + .with_label_values(&["expect_iota_proxy_header", "invalid-content-type"]) + .inc(); + Err((StatusCode::BAD_REQUEST, "invalid content-type header")) + } + } +} + +/// we expect that calling iota-nodes are known on the blockchain and we enforce +/// their pub key tls creds here +pub async fn expect_valid_public_key( + Extension(allower): Extension>, + Extension(tls_connect_info): Extension, + mut request: Request, + next: Next, +) -> Result { + let Some(public_key) = tls_connect_info.public_key() else { + error!("unable to obtain public key from connecting client"); + MIDDLEWARE_OPS + .with_label_values(&["expect_valid_public_key", "missing-public-key"]) + .inc(); + return Err((StatusCode::FORBIDDEN, "unknown clients are not allowed")); + }; + let Some(peer) = allower.get(public_key) else { + error!("node with unknown pub key tried to connect {}", public_key); + MIDDLEWARE_OPS + .with_label_values(&[ + "expect_valid_public_key", + "unknown-validator-connection-attempt", + ]) + .inc(); + return Err((StatusCode::FORBIDDEN, "unknown clients are not allowed")); + }; + request.extensions_mut().insert(peer); + Ok(next.run(request).await) +} + +// extractor that shows how to consume the request body upfront +#[derive(Debug)] +pub struct LenDelimProtobuf(pub Vec); + +#[async_trait] +impl FromRequest for LenDelimProtobuf +where + S: Send + Sync, +{ + type Rejection = (StatusCode, String); + + async fn from_request( + req: Request, + state: &S, + ) -> Result { + let should_be_snappy = req + .headers() + .get(CONTENT_ENCODING) + .map(|v| v.as_bytes() == b"snappy") + .unwrap_or(false); + + let body = Bytes::from_request(req, state).await.map_err(|e| { + let msg = format!("error extracting bytes; {e}"); + error!(msg); + MIDDLEWARE_OPS + .with_label_values(&["LenDelimProtobuf_from_request", "unable-to-extract-bytes"]) + .inc(); + (e.status(), msg) + })?; + + let intermediate = if should_be_snappy { + let mut s = snap::raw::Decoder::new(); + let decompressed = s.decompress_vec(&body).map_err(|e| { + let msg = format!("unable to decode snappy encoded protobufs; {e}"); + error!(msg); + MIDDLEWARE_OPS + .with_label_values(&[ + "LenDelimProtobuf_decompress_vec", + "unable-to-decode-snappy", + ]) + .inc(); + (StatusCode::BAD_REQUEST, msg) + })?; + Bytes::from(decompressed).reader() + } else { + body.reader() + }; + + let mut decoder = ProtobufDecoder::new(intermediate); + let decoded = decoder.parse::().map_err(|e| { + let msg = format!("unable to decode len deliminated protobufs; {e}"); + error!(msg); + MIDDLEWARE_OPS + .with_label_values(&[ + "LenDelimProtobuf_from_request", + "unable-to-decode-protobufs", + ]) + .inc(); + (StatusCode::BAD_REQUEST, msg) + })?; + Ok(Self(decoded)) + } +} diff --git a/crates/iota-proxy/src/peers.rs b/crates/iota-proxy/src/peers.rs new file mode 100644 index 00000000000..f9c47f86928 --- /dev/null +++ b/crates/iota-proxy/src/peers.rs @@ -0,0 +1,716 @@ +// Copyright (c) Mysten Labs, Inc. +// Modifications Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +use std::{ + collections::{BTreeMap, HashMap}, + sync::{Arc, RwLock}, + time::Duration, +}; + +use anyhow::{Context, Result, bail}; +use fastcrypto::{ + ed25519::Ed25519PublicKey, + encoding::{Base64, Encoding}, + traits::ToFromBytes, +}; +use futures::stream::{self, StreamExt}; +use iota_tls::Allower; +use iota_types::{ + base_types::IotaAddress, bridge::BridgeSummary, + iota_system_state::iota_system_state_summary::IotaSystemStateSummary, +}; +use once_cell::sync::Lazy; +use prometheus::{CounterVec, HistogramVec, register_counter_vec, register_histogram_vec}; +use serde::Deserialize; +use tracing::{debug, error, info, warn}; +use url::Url; + +static JSON_RPC_STATE: Lazy = Lazy::new(|| { + register_counter_vec!( + "json_rpc_state", + "Number of successful/failed requests made.", + &["rpc_method", "status"] + ) + .unwrap() +}); +static JSON_RPC_DURATION: Lazy = Lazy::new(|| { + register_histogram_vec!( + "json_rpc_duration_seconds", + "The json-rpc latencies in seconds.", + &["rpc_method"], + vec![ + 0.0008, 0.0016, 0.0032, 0.0064, 0.0128, 0.0256, 0.0512, 0.1024, 0.2048, 0.4096, 0.8192, + 1.0, 1.25, 1.5, 1.75, 2.0, 4.0, 8.0 + ], + ) + .unwrap() +}); + +/// IotaPeers is a mapping of public key to IotaPeer data +pub type IotaPeers = Arc>>; + +type MetricsPubKeys = Arc>>; + +#[derive(Hash, PartialEq, Eq, Debug, Clone)] +pub struct IotaPeer { + pub name: String, + pub public_key: Ed25519PublicKey, +} + +/// IotaNodeProvider queries the iota blockchain and keeps a record of known +/// validators based on the response from iota_getValidators. The node name, +/// public key and other info is extracted from the chain and stored in this +/// data structure. We pass this struct to the tls verifier and it depends on +/// the state contained within. Handlers also use this data in an Extractor +/// extension to check incoming clients on the http api against known keys. +#[derive(Debug, Clone)] +pub struct IotaNodeProvider { + nodes: IotaPeers, + bridge_nodes: IotaPeers, + static_nodes: IotaPeers, + rpc_url: String, + rpc_poll_interval: Duration, +} + +impl Allower for IotaNodeProvider { + fn allowed(&self, key: &Ed25519PublicKey) -> bool { + self.static_nodes.read().unwrap().contains_key(key) + || self.nodes.read().unwrap().contains_key(key) + || self.bridge_nodes.read().unwrap().contains_key(key) + } +} + +impl IotaNodeProvider { + pub fn new(rpc_url: String, rpc_poll_interval: Duration, static_peers: Vec) -> Self { + // build our hashmap with the static pub keys. we only do this one time at + // binary startup. + let static_nodes: HashMap = static_peers + .into_iter() + .map(|v| (v.public_key.clone(), v)) + .collect(); + let static_nodes = Arc::new(RwLock::new(static_nodes)); + let iota_nodes = Arc::new(RwLock::new(HashMap::new())); + let bridge_nodes = Arc::new(RwLock::new(HashMap::new())); + Self { + nodes: iota_nodes, + bridge_nodes, + static_nodes, + rpc_url, + rpc_poll_interval, + } + } + + /// get is used to retrieve peer info in our handlers + pub fn get(&self, key: &Ed25519PublicKey) -> Option { + debug!("look for {:?}", key); + // check static nodes first + if let Some(v) = self.static_nodes.read().unwrap().get(key) { + return Some(IotaPeer { + name: v.name.to_owned(), + public_key: v.public_key.to_owned(), + }); + } + // check iota validators + if let Some(v) = self.nodes.read().unwrap().get(key) { + return Some(IotaPeer { + name: v.name.to_owned(), + public_key: v.public_key.to_owned(), + }); + } + // check bridge validators + if let Some(v) = self.bridge_nodes.read().unwrap().get(key) { + return Some(IotaPeer { + name: v.name.to_owned(), + public_key: v.public_key.to_owned(), + }); + } + None + } + + /// Get a mutable reference to the allowed iota validator map + pub fn get_mut(&mut self) -> &mut IotaPeers { + &mut self.nodes + } + + /// get_validators will retrieve known validators + async fn get_validators(url: String) -> Result { + let rpc_method = "iotax_getLatestIotaSystemState"; + let observe = || { + let timer = JSON_RPC_DURATION + .with_label_values(&[rpc_method]) + .start_timer(); + || { + timer.observe_duration(); + } + }(); + let client = reqwest::Client::builder().build().unwrap(); + let request = serde_json::json!({ + "jsonrpc": "2.0", + "method":rpc_method, + "id":1, + }); + let response = client + .post(url) + .header(reqwest::header::CONTENT_TYPE, "application/json") + .body(request.to_string()) + .send() + .await + .with_context(|| { + JSON_RPC_STATE + .with_label_values(&[rpc_method, "failed_get"]) + .inc(); + observe(); + "unable to perform json rpc" + })?; + + let raw = response.bytes().await.with_context(|| { + JSON_RPC_STATE + .with_label_values(&[rpc_method, "failed_body_extract"]) + .inc(); + observe(); + "unable to extract body bytes from json rpc" + })?; + + #[derive(Debug, Deserialize)] + struct ResponseBody { + result: IotaSystemStateSummary, + } + + let body: ResponseBody = match serde_json::from_slice(&raw) { + Ok(b) => b, + Err(error) => { + JSON_RPC_STATE + .with_label_values(&[rpc_method, "failed_json_decode"]) + .inc(); + observe(); + bail!( + "unable to decode json: {error} response from json rpc: {:?}", + raw + ) + } + }; + JSON_RPC_STATE + .with_label_values(&[rpc_method, "success"]) + .inc(); + observe(); + Ok(body.result) + } + + /// get_bridge_validators will retrieve known bridge validators + async fn get_bridge_validators(url: String) -> Result { + let rpc_method = "iotax_getLatestBridge"; + let _timer = JSON_RPC_DURATION + .with_label_values(&[rpc_method]) + .start_timer(); + let client = reqwest::Client::builder().build().unwrap(); + let request = serde_json::json!({ + "jsonrpc": "2.0", + "method":rpc_method, + "id":1, + }); + let response = client + .post(url) + .header(reqwest::header::CONTENT_TYPE, "application/json") + .body(request.to_string()) + .send() + .await + .with_context(|| { + JSON_RPC_STATE + .with_label_values(&[rpc_method, "failed_get"]) + .inc(); + "unable to perform json rpc" + })?; + + let raw = response.bytes().await.with_context(|| { + JSON_RPC_STATE + .with_label_values(&[rpc_method, "failed_body_extract"]) + .inc(); + "unable to extract body bytes from json rpc" + })?; + + #[derive(Debug, Deserialize)] + struct ResponseBody { + result: BridgeSummary, + } + let summary: BridgeSummary = match serde_json::from_slice::(&raw) { + Ok(b) => b.result, + Err(error) => { + JSON_RPC_STATE + .with_label_values(&[rpc_method, "failed_json_decode"]) + .inc(); + bail!( + "unable to decode json: {error} response from json rpc: {:?}", + raw + ) + } + }; + JSON_RPC_STATE + .with_label_values(&[rpc_method, "success"]) + .inc(); + Ok(summary) + } + + async fn update_iota_validator_set(&self) { + match Self::get_validators(self.rpc_url.to_owned()).await { + Ok(summary) => { + let validators = extract(summary); + let mut allow = self.nodes.write().unwrap(); + allow.clear(); + allow.extend(validators); + info!( + "{} iota validators managed to make it on the allow list", + allow.len() + ); + } + Err(error) => { + JSON_RPC_STATE + .with_label_values(&["update_peer_count", "failed"]) + .inc(); + error!("unable to refresh peer list: {error}"); + } + }; + } + + async fn update_bridge_validator_set(&self, metrics_keys: MetricsPubKeys) { + let iota_system = match Self::get_validators(self.rpc_url.to_owned()).await { + Ok(summary) => summary, + Err(error) => { + JSON_RPC_STATE + .with_label_values(&["update_bridge_peer_count", "failed"]) + .inc(); + error!("unable to get iota system state: {error}"); + return; + } + }; + match Self::get_bridge_validators(self.rpc_url.to_owned()).await { + Ok(summary) => { + let names = iota_system + .active_validators + .into_iter() + .map(|v| (v.iota_address, v.name)) + .collect(); + let validators = extract_bridge(summary, Arc::new(names), metrics_keys).await; + let mut allow = self.bridge_nodes.write().unwrap(); + allow.clear(); + allow.extend(validators); + info!( + "{} bridge validators managed to make it on the allow list", + allow.len() + ); + } + Err(error) => { + JSON_RPC_STATE + .with_label_values(&["update_bridge_peer_count", "failed"]) + .inc(); + error!("unable to refresh iota bridge peer list: {error}"); + } + }; + } + + /// poll_peer_list will act as a refresh interval for our cache + pub fn poll_peer_list(&self) { + info!("Started polling for peers using rpc: {}", self.rpc_url); + + let rpc_poll_interval = self.rpc_poll_interval; + let cloned_self = self.clone(); + let bridge_metrics_keys: MetricsPubKeys = Arc::new(RwLock::new(HashMap::new())); + tokio::spawn(async move { + let mut interval = tokio::time::interval(rpc_poll_interval); + interval.set_missed_tick_behavior(tokio::time::MissedTickBehavior::Skip); + + loop { + interval.tick().await; + + cloned_self.update_iota_validator_set().await; + cloned_self + .update_bridge_validator_set(bridge_metrics_keys.clone()) + .await; + } + }); + } +} + +/// extract will get the network pubkey bytes from a IotaValidatorSummary type. +/// This type comes from a full node rpc result. See get_validators for +/// details. The key here, if extracted successfully, will ultimately be stored +/// in the allow list and let us communicate with those actual peers via tls. +fn extract(summary: IotaSystemStateSummary) -> impl Iterator { + summary.active_validators.into_iter().filter_map(|vm| { + match Ed25519PublicKey::from_bytes(&vm.network_pubkey_bytes) { + Ok(public_key) => { + debug!( + "adding public key {:?} for iota validator {:?}", + public_key, vm.name + ); + Some((public_key.clone(), IotaPeer { + name: vm.name, + public_key, + })) // scoped to filter_map + } + Err(error) => { + error!( + "unable to decode public key for name: {:?} iota_address: {:?} error: {error}", + vm.name, vm.iota_address + ); + None // scoped to filter_map + } + } + }) +} + +async fn extract_bridge( + summary: BridgeSummary, + names: Arc>, + metrics_keys: MetricsPubKeys, +) -> Vec<(Ed25519PublicKey, IotaPeer)> { + { + // Clean up the cache: retain only the metrics keys of the up-to-date bridge + // validator set + let mut metrics_keys_write = metrics_keys.write().unwrap(); + metrics_keys_write.retain(|url, _| { + summary.committee.members.iter().any(|(_, cm)| { + String::from_utf8(cm.http_rest_url.clone()).ok().as_ref() == Some(url) + }) + }); + } + + let client = reqwest::Client::builder() + .timeout(Duration::from_secs(10)) + .build() + .unwrap(); + let committee_members = summary.committee.members.clone(); + let results: Vec<_> = stream::iter(committee_members) + .filter_map(|(_, cm)| { + let client = client.clone(); + let metrics_keys = metrics_keys.clone(); + let names = names.clone(); + async move { + debug!( + address =% cm.iota_address, + "Extracting metrics public key for bridge node", + ); + + // Convert the Vec to a String and handle errors properly + let url_str = match String::from_utf8(cm.http_rest_url) { + Ok(url) => url, + Err(_) => { + warn!( + address =% cm.iota_address, + "Invalid UTF-8 sequence in http_rest_url for bridge node ", + ); + return None; + } + }; + // Parse the URL + let bridge_url = match Url::parse(&url_str) { + Ok(url) => url, + Err(_) => { + warn!(url_str, "Unable to parse http_rest_url"); + return None; + } + }; + + // Append "metrics_pub_key" to the path + let bridge_url = match append_path_segment(bridge_url, "metrics_pub_key") { + Some(url) => url, + None => { + warn!(url_str, "Unable to append path segment to URL"); + return None; + } + }; + + // Use the host portion of the http_rest_url as the "name" + let bridge_host = match bridge_url.host_str() { + Some(host) => host, + None => { + warn!(url_str, "Hostname is missing from http_rest_url"); + return None; + } + }; + let bridge_name = names.get(&cm.iota_address).cloned().unwrap_or_else(|| { + warn!( + address =% cm.iota_address, + "Bridge node not found in iota committee, using base URL as the name", + ); + String::from(bridge_host) + }); + let bridge_name = format!("bridge-{}", bridge_name); + + let bridge_request_url = bridge_url.as_str(); + + let metrics_pub_key = match client.get(bridge_request_url).send().await { + Ok(response) => { + let raw = response.bytes().await.ok()?; + let metrics_pub_key: String = match serde_json::from_slice(&raw) { + Ok(key) => key, + Err(error) => { + warn!(?error, url_str, "Failed to deserialize response"); + return fallback_to_cached_key( + &metrics_keys, + &url_str, + &bridge_name, + ); + } + }; + let metrics_bytes = match Base64::decode(&metrics_pub_key) { + Ok(pubkey_bytes) => pubkey_bytes, + Err(error) => { + warn!( + ?error, + bridge_name, "unable to decode public key for bridge node", + ); + return None; + } + }; + match Ed25519PublicKey::from_bytes(&metrics_bytes) { + Ok(pubkey) => { + // Successfully fetched the key, update the cache + let mut metrics_keys_write = metrics_keys.write().unwrap(); + metrics_keys_write.insert(url_str.clone(), pubkey.clone()); + debug!( + url_str, + public_key = ?pubkey, + "Successfully added bridge peer to metrics_keys" + ); + pubkey + } + Err(error) => { + warn!( + ?error, + bridge_request_url, + "unable to decode public key for bridge node", + ); + return None; + } + } + } + Err(_) => { + return fallback_to_cached_key(&metrics_keys, &url_str, &bridge_name); + } + }; + Some((metrics_pub_key.clone(), IotaPeer { + public_key: metrics_pub_key, + name: bridge_name, + })) + } + }) + .collect() + .await; + + results +} + +fn fallback_to_cached_key( + metrics_keys: &MetricsPubKeys, + url_str: &str, + bridge_name: &str, +) -> Option<(Ed25519PublicKey, IotaPeer)> { + let metrics_keys_read = metrics_keys.read().unwrap(); + if let Some(cached_key) = metrics_keys_read.get(url_str) { + debug!( + url_str, + "Using cached metrics public key after request failure" + ); + Some((cached_key.clone(), IotaPeer { + public_key: cached_key.clone(), + name: bridge_name.to_string(), + })) + } else { + warn!( + url_str, + "Failed to fetch public key and no cached key available" + ); + None + } +} + +fn append_path_segment(mut url: Url, segment: &str) -> Option { + url.path_segments_mut().ok()?.pop_if_empty().push(segment); + Some(url) +} + +#[cfg(test)] +mod tests { + use iota_types::{ + base_types::IotaAddress, + bridge::{BridgeCommitteeSummary, BridgeSummary, MoveTypeCommitteeMember}, + iota_system_state::iota_system_state_summary::{ + IotaSystemStateSummary, IotaValidatorSummary, + }, + }; + use multiaddr::Multiaddr; + use serde::Serialize; + + use super::*; + use crate::admin::{CertKeyPair, generate_self_cert}; + + /// creates a test that binds our proxy use case to the structure in + /// iota_getLatestIotaSystemState most of the fields are garbage, but we + /// will send the results of the serde process to a private decode + /// function that should always work if the structure is valid for our use + #[test] + fn depend_on_iota_iota_system_state_summary() { + let CertKeyPair(_, client_pub_key) = generate_self_cert("iota".into()); + let p2p_address: Multiaddr = "/ip4/127.0.0.1/tcp/10000" + .parse() + .expect("expected a multiaddr value"); + // all fields here just satisfy the field types, with exception to + // active_validators, we use some of those. + let depends_on = IotaSystemStateSummary { + active_validators: vec![IotaValidatorSummary { + network_pubkey_bytes: Vec::from(client_pub_key.as_bytes()), + p2p_address: format!("{p2p_address}"), + primary_address: "empty".into(), + ..Default::default() + }], + ..Default::default() + }; + + #[derive(Debug, Serialize, Deserialize)] + struct ResponseBody { + result: IotaSystemStateSummary, + } + + let r = serde_json::to_string(&ResponseBody { result: depends_on }) + .expect("expected to serialize ResponseBody{IotaSystemStateSummary}"); + + let deserialized = serde_json::from_str::(&r) + .expect("expected to deserialize ResponseBody{IotaSystemStateSummary}"); + + let peers = extract(deserialized.result); + assert_eq!(peers.count(), 1, "peers should have been a length of 1"); + } + + #[tokio::test] + async fn test_extract_bridge_invalid_bridge_url() { + let summary = BridgeSummary { + committee: BridgeCommitteeSummary { + members: vec![(vec![], MoveTypeCommitteeMember { + iota_address: IotaAddress::ZERO, + http_rest_url: "invalid_bridge_url".as_bytes().to_vec(), + ..Default::default() + })], + ..Default::default() + }, + ..Default::default() + }; + + let metrics_keys = Arc::new(RwLock::new(HashMap::new())); + { + let mut cache = metrics_keys.write().unwrap(); + cache.insert( + "invalid_bridge_url".to_string(), + Ed25519PublicKey::from_bytes(&[1u8; 32]).unwrap(), + ); + } + let result = extract_bridge(summary, Arc::new(BTreeMap::new()), metrics_keys.clone()).await; + + assert_eq!( + result.len(), + 0, + "Should not fall back on cache if invalid bridge url is set" + ); + } + + #[tokio::test] + async fn test_extract_bridge_interrupted_response() { + let summary = BridgeSummary { + committee: BridgeCommitteeSummary { + members: vec![(vec![], MoveTypeCommitteeMember { + iota_address: IotaAddress::ZERO, + http_rest_url: "https://unresponsive_bridge_url".as_bytes().to_vec(), + ..Default::default() + })], + ..Default::default() + }, + ..Default::default() + }; + + let metrics_keys = Arc::new(RwLock::new(HashMap::new())); + { + let mut cache = metrics_keys.write().unwrap(); + cache.insert( + "https://unresponsive_bridge_url".to_string(), + Ed25519PublicKey::from_bytes(&[1u8; 32]).unwrap(), + ); + } + let result = extract_bridge(summary, Arc::new(BTreeMap::new()), metrics_keys.clone()).await; + + assert_eq!( + result.len(), + 1, + "Should fall back on cache if invalid response occurs" + ); + let allowed_peer = &result[0].1; + assert_eq!( + allowed_peer.public_key.as_bytes(), + &[1u8; 32], + "Should fall back to the cached public key" + ); + + let cache = metrics_keys.read().unwrap(); + assert!( + cache.contains_key("https://unresponsive_bridge_url"), + "Cache should still contain the original key" + ); + } + + #[test] + fn test_append_path_segment() { + let test_cases = vec![ + ( + "https://example.com", + "metrics_pub_key", + "https://example.com/metrics_pub_key", + ), + ( + "https://example.com/api", + "metrics_pub_key", + "https://example.com/api/metrics_pub_key", + ), + ( + "https://example.com/", + "metrics_pub_key", + "https://example.com/metrics_pub_key", + ), + ( + "https://example.com/api/", + "metrics_pub_key", + "https://example.com/api/metrics_pub_key", + ), + ( + "https://example.com:8080", + "metrics_pub_key", + "https://example.com:8080/metrics_pub_key", + ), + ( + "https://example.com?param=value", + "metrics_pub_key", + "https://example.com/metrics_pub_key?param=value", + ), + ( + "https://example.com:8080/api/v1?param=value", + "metrics_pub_key", + "https://example.com:8080/api/v1/metrics_pub_key?param=value", + ), + ]; + + for (input_url, segment, expected_output) in test_cases { + let url = Url::parse(input_url).unwrap(); + let result = append_path_segment(url, segment); + assert!( + result.is_some(), + "Failed to append segment for URL: {}", + input_url + ); + let result_url = result.unwrap(); + assert_eq!( + result_url.as_str(), + expected_output, + "Unexpected result for input URL: {}", + input_url + ); + } + } +} diff --git a/crates/iota-proxy/src/prom_to_mimir.rs b/crates/iota-proxy/src/prom_to_mimir.rs new file mode 100644 index 00000000000..fb625856b1f --- /dev/null +++ b/crates/iota-proxy/src/prom_to_mimir.rs @@ -0,0 +1,404 @@ +// Copyright (c) Mysten Labs, Inc. +// Modifications Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +use itertools::Itertools; +use prometheus::proto::{Counter, Gauge, Histogram, Metric, MetricFamily, MetricType}; +use protobuf::RepeatedField; +use tracing::{debug, error}; + +use crate::{remote_write, var}; + +#[derive(Debug)] +pub struct Mimir { + state: S, +} + +impl From<&Metric> for Mimir> { + fn from(m: &Metric) -> Self { + // we consume metric labels from an owned version so we can sort them + let mut m = m.to_owned(); + let mut sorted = m.take_label(); + sorted.sort_by(|a, b| { + (a.get_name(), a.get_value()) + .partial_cmp(&(b.get_name(), b.get_value())) + .unwrap() + }); + let mut r = RepeatedField::::default(); + for label in sorted { + let lp = remote_write::Label { + name: label.get_name().into(), + value: label.get_value().into(), + }; + r.push(lp); + } + Self { state: r } + } +} + +impl IntoIterator for Mimir> { + type Item = remote_write::Label; + type IntoIter = std::vec::IntoIter; + + fn into_iter(self) -> Self::IntoIter { + self.state.into_iter() + } +} + +impl From<&Counter> for Mimir { + fn from(c: &Counter) -> Self { + Self { + state: remote_write::Sample { + value: c.get_value(), + ..Default::default() + }, + } + } +} +impl From<&Gauge> for Mimir { + fn from(c: &Gauge) -> Self { + Self { + state: remote_write::Sample { + value: c.get_value(), + ..Default::default() + }, + } + } +} +impl Mimir { + fn sample(self) -> remote_write::Sample { + self.state + } +} + +/// TODO implement histogram +impl From<&Histogram> for Mimir { + fn from(_h: &Histogram) -> Self { + Self { + state: remote_write::Histogram::default(), + } + } +} +/// TODO implement histogram +impl Mimir { + #[allow(dead_code)] + fn histogram(self) -> remote_write::Histogram { + self.state + } +} +impl From> for Mimir> { + fn from(metric_families: Vec) -> Self { + // we may have more but we'll have at least this many timeseries + let mut timeseries: Vec = + Vec::with_capacity(metric_families.len()); + + for mf in metric_families { + // TODO add From impl + let mt = match mf.get_field_type() { + MetricType::COUNTER => remote_write::metric_metadata::MetricType::Counter, + MetricType::GAUGE => remote_write::metric_metadata::MetricType::Gauge, + MetricType::HISTOGRAM => remote_write::metric_metadata::MetricType::Histogram, + MetricType::SUMMARY => remote_write::metric_metadata::MetricType::Summary, + MetricType::UNTYPED => remote_write::metric_metadata::MetricType::Unknown, + }; + + // filter out the types we don't support + match mt { + remote_write::metric_metadata::MetricType::Counter + | remote_write::metric_metadata::MetricType::Gauge => (), + other => { + debug!("{:?} is not yet implemented, skipping metric", other); + continue; + } + } + + // TODO stop using state directly + timeseries.extend(Mimir::from(mf.clone()).state); + } + + Self { + state: timeseries + .into_iter() + // the upstream remote_write should have a max sample size per request set to this + // number + .chunks(var!("MIMIR_MAX_SAMPLE_SIZE", 500)) + .into_iter() + .map(|ts| remote_write::WriteRequest { + timeseries: ts.collect(), + ..Default::default() + }) + .collect_vec(), + } + } +} + +impl IntoIterator for Mimir> { + type Item = remote_write::WriteRequest; + type IntoIter = std::vec::IntoIter; + + fn into_iter(self) -> Self::IntoIter { + self.state.into_iter() + } +} + +impl Mimir> { + pub fn repeated(self) -> RepeatedField { + self.state + } +} + +impl From for Mimir> { + fn from(mf: MetricFamily) -> Self { + let mut timeseries = vec![]; + for metric in mf.get_metric() { + let mut ts = remote_write::TimeSeries::default(); + ts.labels.extend(vec![ + // mimir requires that we use __name__ as a key that points to a value + // of the metric name + remote_write::Label { + name: "__name__".into(), + value: mf.get_name().into(), + }, + ]); + ts.labels + .extend(Mimir::>::from(metric)); + + // assumption here is that since a MetricFamily will have one MetricType, we'll + // only need to look for one of these types. Setting two different + // types on Metric at the same time in a way that is conflicting + // with the MetricFamily type will result in undefined mimir + // behavior, probably an error. + if metric.has_counter() { + let mut s = Mimir::::from(metric.get_counter()).sample(); + s.timestamp = metric.get_timestamp_ms(); + ts.samples.push(s); + } else if metric.has_gauge() { + let mut s = Mimir::::from(metric.get_gauge()).sample(); + s.timestamp = metric.get_timestamp_ms(); + ts.samples.push(s); + } else if metric.has_histogram() { + // TODO implement + // ts.mut_histograms() + // .push(Mimir::::from(metric. + // get_histogram()).histogram()); + } else if metric.has_summary() { + // TODO implement + error!("summary is not implemented for a metric type"); + } + timeseries.push(ts); + } + Self { state: timeseries } + } +} + +impl Mimir { + pub fn timeseries(self) -> remote_write::TimeSeries { + self.state + } +} + +#[cfg(test)] +pub mod tests { + use prometheus::proto; + use protobuf::RepeatedField; + + use crate::{prom_to_mimir::Mimir, remote_write}; + + // protobuf stuff + pub fn create_metric_family( + name: &str, + help: &str, + field_type: Option, + metric: RepeatedField, + ) -> proto::MetricFamily { + // no public fields, cannot use literals + let mut mf = proto::MetricFamily::default(); + mf.set_name(name.into()); + mf.set_help(help.into()); + // TODO remove the metric type serialization if we still don't use it + // after implementing histogram and summary + if let Some(ft) = field_type { + mf.set_field_type(ft); + } + mf.set_metric(metric); + mf + } + #[allow(dead_code)] + fn create_metric_gauge( + labels: RepeatedField, + gauge: proto::Gauge, + ) -> proto::Metric { + let mut m = proto::Metric::default(); + m.set_label(labels); + m.set_gauge(gauge); + m.set_timestamp_ms(12345); + m + } + + pub fn create_metric_counter( + labels: RepeatedField, + counter: proto::Counter, + ) -> proto::Metric { + let mut m = proto::Metric::default(); + m.set_label(labels); + m.set_counter(counter); + m.set_timestamp_ms(12345); + m + } + + pub fn create_metric_histogram( + labels: RepeatedField, + histogram: proto::Histogram, + ) -> proto::Metric { + let mut m = proto::Metric::default(); + m.set_label(labels); + m.set_histogram(histogram); + m.set_timestamp_ms(12345); + m + } + + pub fn create_histogram() -> proto::Histogram { + let mut h = proto::Histogram::default(); + h.set_sample_count(1); + h.set_sample_sum(1.0); + let mut b = proto::Bucket::default(); + b.set_cumulative_count(1); + b.set_upper_bound(1.0); + h.mut_bucket().push(b); + h + } + + pub fn create_labels(labels: Vec<(&str, &str)>) -> Vec { + labels + .into_iter() + .map(|(key, value)| { + let mut lp = proto::LabelPair::default(); + lp.set_name(key.into()); + lp.set_value(value.into()); + lp + }) + .collect() + } + #[allow(dead_code)] + fn create_gauge(value: f64) -> proto::Gauge { + let mut g = proto::Gauge::default(); + g.set_value(value); + g + } + + pub fn create_counter(value: f64) -> proto::Counter { + let mut c = proto::Counter::default(); + c.set_value(value); + c + } + + // end protobuf stuff + + // mimir stuff + fn create_timeseries_with_samples( + labels: Vec, + samples: Vec, + ) -> remote_write::TimeSeries { + remote_write::TimeSeries { + labels, + samples, + ..Default::default() + } + } + // end mimir stuff + + #[test] + fn metricfamily_to_timeseries() { + let tests: Vec<(proto::MetricFamily, Vec)> = vec![ + ( + create_metric_family( + "test_gauge", + "i'm a help message", + Some(proto::MetricType::GAUGE), + RepeatedField::from(vec![create_metric_gauge( + RepeatedField::from_vec(create_labels(vec![ + ("host", "local-test-validator"), + ("network", "unittest-network"), + ])), + create_gauge(2046.0), + )]), + ), + vec![create_timeseries_with_samples( + vec![ + remote_write::Label { + name: "__name__".into(), + value: "test_gauge".into(), + }, + remote_write::Label { + name: "host".into(), + value: "local-test-validator".into(), + }, + remote_write::Label { + name: "network".into(), + value: "unittest-network".into(), + }, + ], + vec![remote_write::Sample { + value: 2046.0, + timestamp: 12345, + }], + )], + ), + ( + create_metric_family( + "test_counter", + "i'm a help message", + Some(proto::MetricType::GAUGE), + RepeatedField::from(vec![create_metric_counter( + RepeatedField::from_vec(create_labels(vec![ + ("host", "local-test-validator"), + ("network", "unittest-network"), + ])), + create_counter(2046.0), + )]), + ), + vec![create_timeseries_with_samples( + vec![ + remote_write::Label { + name: "__name__".into(), + value: "test_counter".into(), + }, + remote_write::Label { + name: "host".into(), + value: "local-test-validator".into(), + }, + remote_write::Label { + name: "network".into(), + value: "unittest-network".into(), + }, + ], + vec![remote_write::Sample { + value: 2046.0, + timestamp: 12345, + }], + )], + ), + ]; + for (mf, expected_ts) in tests { + // TODO stop using state directly + for (actual, expected) in Mimir::from(mf).state.into_iter().zip(expected_ts) { + assert_eq!(actual.labels, expected.labels); + for (actual_sample, expected_sample) in + actual.samples.into_iter().zip(expected.samples) + { + assert_eq!( + actual_sample.value, expected_sample.value, + "sample values do not match" + ); + + // timestamps are injected on the iota-node and we copy it to our sample + // make sure that works + assert_eq!( + actual_sample.timestamp, expected_sample.timestamp, + "timestamp should be non-zero" + ); + } + } + } + } +} diff --git a/crates/iota-proxy/src/remote_write.rs b/crates/iota-proxy/src/remote_write.rs new file mode 100644 index 00000000000..5c32f90dc9d --- /dev/null +++ b/crates/iota-proxy/src/remote_write.rs @@ -0,0 +1,506 @@ +// Copyright (c) Mysten Labs, Inc. +// Modifications Copyright (c) 2024 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct MetricMetadata { + /// Represents the metric type, these match the set from Prometheus. + /// Refer to model/textparse/interface.go for details. + #[prost(enumeration = "metric_metadata::MetricType", tag = "1")] + pub r#type: i32, + #[prost(string, tag = "2")] + pub metric_family_name: ::prost::alloc::string::String, + #[prost(string, tag = "4")] + pub help: ::prost::alloc::string::String, + #[prost(string, tag = "5")] + pub unit: ::prost::alloc::string::String, +} +/// Nested message and enum types in `MetricMetadata`. +pub mod metric_metadata { + #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)] + #[repr(i32)] + pub enum MetricType { + Unknown = 0, + Counter = 1, + Gauge = 2, + Histogram = 3, + Gaugehistogram = 4, + Summary = 5, + Info = 6, + Stateset = 7, + } + impl MetricType { + /// String value of the enum field names used in the ProtoBuf + /// definition. + /// + /// The values are not transformed in any way and thus are considered + /// stable (if the ProtoBuf definition does not change) and safe + /// for programmatic use. + pub fn as_str_name(&self) -> &'static str { + match self { + MetricType::Unknown => "UNKNOWN", + MetricType::Counter => "COUNTER", + MetricType::Gauge => "GAUGE", + MetricType::Histogram => "HISTOGRAM", + MetricType::Gaugehistogram => "GAUGEHISTOGRAM", + MetricType::Summary => "SUMMARY", + MetricType::Info => "INFO", + MetricType::Stateset => "STATESET", + } + } + /// Creates an enum from field names used in the ProtoBuf definition. + pub fn from_str_name(value: &str) -> ::core::option::Option { + match value { + "UNKNOWN" => Some(Self::Unknown), + "COUNTER" => Some(Self::Counter), + "GAUGE" => Some(Self::Gauge), + "HISTOGRAM" => Some(Self::Histogram), + "GAUGEHISTOGRAM" => Some(Self::Gaugehistogram), + "SUMMARY" => Some(Self::Summary), + "INFO" => Some(Self::Info), + "STATESET" => Some(Self::Stateset), + _ => None, + } + } + } +} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct Sample { + #[prost(double, tag = "1")] + pub value: f64, + /// timestamp is in ms format, see model/timestamp/timestamp.go for + /// conversion from time.Time to Prometheus timestamp. + #[prost(int64, tag = "2")] + pub timestamp: i64, +} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct Exemplar { + /// Optional, can be empty. + #[prost(message, repeated, tag = "1")] + pub labels: ::prost::alloc::vec::Vec